Правила: импорт данных (IMPORT)
Правила импорта (IMPORT)
-
Прежде чем работать с
IMPORT, ассистент ОБЯЗАН определить элементы в следующем порядке:- модуль и пространство имён, владеющие потоком импорта
- целевые классы, которые будут создаваться или обновляться
- промежуточные (staging) свойства, используемые при импорте
- действия импорта
- формы импорта, если данные иерархичны
-
Ассистент ОБЯЗАН осознанно выбирать стиль импорта:
- плоские файлы (
CSV,XLS,DBF,TABLE) -> предпочестьIMPORT ... TOилиFIELDS - вложенные
JSON/XML, структуры родитель-потомок, пространства имён или сопоставлениеEXTID-> предпочесть импорт через форму - построчные интеграционные ответы
-> предпочесть
FIELDS ... DO
- плоские файлы (
-
Для плоских импортов, требующих валидации, дедупликации, многопроходной обработки или постобработки, ассистенту СЛЕДУЕТ сначала складывать данные в
LOCAL-свойства, обычно поINTEGER-строке, а затем обрабатывать их отдельным проходомFOR imported(INTEGER i). -
Ассистенту СЛЕДУЕТ использовать
FIELDS ... DO, когда импортируемые значения используются лишь однажды и введение переиспользуемых локальных свойств добавило бы шум. -
Ассистенту СЛЕДУЕТ указывать сопоставление колонок явно, когда внешний шаблон фиксирован или разрежен.
Последовательное сопоставление без явных идентификаторов колонок допустимо только когда сам порядок колонок является согласованным интерфейсом.
-
Для импорта через форму ассистент ОБЯЗАН объявить выделенную форму импорта до использования.
Форма ОБЯЗАНА использовать один объект на группу объектов с числовыми или конкретными пользовательскими классами.
Форме СЛЕДУЕТ отражать внешнюю структуру через:
FILTERSдля связей родитель-потомокEXTID,FORMEXTID, группы иATTRтолько там, где этого требует внешняя схема
Ассистент ОБЯЗАН помнить, что импорт в форму отменяет ожидающие изменения импортируемых свойств формы в текущей сессии.
-
Ассистент ОБЯЗАН явно выбирать опции формата, когда от них зависит внешний контракт:
HEADER/NOHEADERSHEETCHARSET
Ассистенту СЛЕДУЕТ предпочитать
HEADERдля стабильных шаблоновCSV/XLS, потому чтоNOHEADERможет незаметно сопоставить отсутствующие или неверно типизированные колонки вNULL. -
Ассистент ОБЯЗАН валидировать ссылочные бизнес-ключи до создания или обновления постоянных объектов.
Типичные ключи в этом проекте —
id,number, коды партнёров или товаров и внешние ссылки.Каждая ссылка ДОЛЖНА проверяться в отдельном
FORчерезGROUP SUM 1 BYпо импортируемым значениям ключей.По возможности ассистенту НЕ СЛЕДУЕТ записывать разрешённые ссылки в отдельный
LOCALдо основной логики импорта.Отсутствующие мастер-данные или некорректные данные ДОЛЖНЫ останавливать импорт или выдавать понятную ошибку.
-
Ассистенту СЛЕДУЕТ разделять сырой импорт и доменное разрешение:
- сначала разобрать файл или данные в локальные свойства или форму импорта
- затем проверить ссылки, такие как товар, партнёр, статус, тип или другие справочники
- только потом создавать или обновлять доменные объекты
-
Для запускаемых пользователем пакетных импортов и внешних интеграций ассистенту СЛЕДУЕТ изолировать сохранение в
NEWSESSIONи СЛЕДУЕТ выполнятьAPPLY;после доменных записей одного импорта.Три правила сессий изменений задевают любой импорт, поэтому они приведены здесь, а не оставлены на второй запрос:
- буфер, заполненный в верхней сессии, доходит до новой
только через
NESTED— в операторе либо в самом объявленииDATA LOCAL NESTED, — и не доходит вовсе подNEWSQL, который не переносит ничего; - после
APPLY;ассистент ОБЯЗАН проверитьcanceled(), прежде чем считать импорт состоявшимся; - ошибку, поднятую самим
APPLY, платформа уже показала интерактивному пользователю, поэтому интерактивный импорт НЕ ДОЛЖЕН сообщать её повторно; импорт из API или фоновый ОБЯЗАН сообщить её сам — черезapplyMessage()или исключение.
Остальные — в статье про сессии изменений:
lsfusion_retrieve_docs(type='rules', query='change sessions'). - буфер, заполненный в верхней сессии, доходит до новой
только через
-
Ассистент НЕ ДОЛЖЕН частично сохранять неудавшийся импорт молча. Для ошибок, которые ассистент обнаруживает сам (отсутствующие ссылки, некорректные данные, валидация до
APPLY), ему СЛЕДУЕТ использоватьMESSAGE,RETURN,throwExceptionили явный флаг неудачи, согласованно с вызывающей стороной:- интерактивный импорт ->
MESSAGE - API или фоновая интеграция -> исключение или явное состояние неудачи
- интерактивный импорт ->
-
Для импортов-синхронизаций «создать-или-обновить» ассистент ОБЯЗАН разделять создание объектов и обновление свойств.
Ассистент ОБЯЗАН делать один отдельный проход, только создающий недостающие объекты.
FOR— один из способов его записать; множественная формаNEW ... WHERE ... TOсоздает объект на каждый подходящий набор одной операцией и предпочтительна везде, где подходит.Если импортируемые значения ключей могут быть неуникальны, проход создания СЛЕДУЕТ итерировать по сгруппированным ключам через
GROUP SUM ... BY, а не по сырым импортируемым строкам.Затем ассистент ОБЯЗАН обновить свойства найденных объектов вторым отдельным проходом — прямое
<- ... WHEREменяет все подходящие наборы разом, аFORнужен только там, где тело делает то, чего множественное изменение не умеет.Ассистент НЕ ДОЛЖЕН смешивать создание объектов и обновление свойств в одном проходе для импортов-синхронизаций.
Если требуется полная синхронизация, ассистенту СЛЕДУЕТ добавить явный шаг удаления.
-
Если
LOCAL-свойства промежуточного хранения используются только в одном действии импорта, ассистент ОБЯЗАН объявлять их внутри этого действия.Ассистенту НЕ СЛЕДУЕТ выносить такие
LOCAL-свойства на уровень модуля без необходимости.Исключение:
LOCAL-свойство можно объявить вне действия только когда оно должно использоваться формой импорта или переиспользоваться несколькими связанными действиями.