Rules: экспорт данных
Область действия
Рекомендации по экспорту данных оператором EXPORT. Общие обязательные правила находятся в Rules; эта статья не входит в набор, который всегда передается ассистенту, и запрашивается по мере необходимости.
Выбор источника экспорта
-
Экспорт списка свойств (
EXPORT FROM ...) используется, когда результат — одна плоская таблица колонок и структура выгрузки не совпадает ни с одной формой. -
Экспорт формы (
EXPORT formName ...) используется, когда выгрузка повторяет уже существующую форму или когда в результате нужна иерархия групп объектов. Иерархия сохраняется только в JSON и XML; в плоских форматах каждая группа объектов дает отдельный файл, поэтому для них нужно перечислить приемники всех групп в блокеTO. -
Форму, созданную исключительно ради выгрузки, следует объявлять рядом с действием экспорта и не добавлять в навигатор.
Явное указание того, что влияет на результат
-
Формат следует указывать явно даже тогда, когда нужен JSON: умолчание делает выгрузку зависимой от того, что читающий код помнит про умолчание.
-
Условие
WHEREследует указывать явно. Без него условием считается дизъюнкция всех экспортируемых свойств, то есть в выгрузку попадут наборы объектов, у которых заполнено хотя бы одно поле, — это почти никогда не совпадает с нужным набором строк. -
Идентификаторы колонок следует задавать явно (
columnId = expr). Умолчаниеexpr1, ...,exprNпривязывает имена полей во внешнем формате к порядку выражений, поэтому вставка колонки в середину списка молча меняет контракт выгрузки. -
В
ORDERдопускаются только выражения из списка экспортируемых, поэтому колонку, нужную для упорядочивания, следует включать в выгрузку.
Опции формата
-
Опции, у которых умолчание отличается для разных форматов, следует задавать явно: наличие строки заголовка (
HEADER/NOHEADER) в CSV, XLS, XLSX, разделитель CSV (по умолчанию;) и кодировку (CHARSET, по умолчаниюUTF-8, а для DBF —CP1251). -
NOESCAPEв CSV допустимо использовать только тогда, когда разделитель гарантированно не встречается в данных; в остальных случаях следует оставлятьESCAPE. -
Кодировку следует определять требованиями принимающей стороны, а не значением по умолчанию: получатели DBF-файлов обычно ожидают однобайтовую кодировку, отличную от
UTF-8.
Приемник результата
-
Свойство-приемник в
TOследует объявлять локальным для действия экспорта и файлового класса (FILE,RAWFILE,JSONFILE), а не использовать общее свойство: одно свойство, разделяемое несколькими выгрузками, делает результат зависящим от порядка выполнения. -
Умолчание
System.exportFileдопустимо только для отладочных и разовых выгрузок. -
При экспорте формы в плоский формат приемники следует перечислять для всех выгружаемых групп объектов; группа объектов без имени называется
root.
Передача результата
-
Действие следует разделять на подготовку данных, собственно
EXPORTи передачу файла получателю — записью в файловую систему, отправкой во внешнюю систему или сохранением в свойстве. Такое разделение позволяет повторно использовать выгрузку с разными способами доставки. -
Для регулярных выгрузок формирование файла следует делать в отдельном действии без взаимодействия с пользователем, чтобы его можно было вызывать и с формы, и по расписанию.
Примеры
exportedFile = DATA LOCAL FILE ();
exportShipments (Store store) {
EXPORT CSV ';' HEADER FROM number = number(Shipment s), date = date(s), sum = sum(s)
WHERE store(s) = store AND shipped(s)
ORDER date(s)
TO exportedFile;
}
FORM exportOrders
OBJECTS st = Store
OBJECTS o = Order
PROPERTIES(o) number, date
FILTERS store(o) = st
;
exportOrders (Store store) {
EXPORT exportOrders OBJECTS st = store JSON TO exportedFile;
}