При переходе с редакции 2.0 (КД2) на редакцию 3.0 (КД3) многие разработчики сталкиваются с отсутствием привычных инструментов. Один из самых частых вопросов: «Где настройка порядка загрузки объектов?». В КД2 у правил конвертации объектов (ПКО) был числовой реквизит «Порядок», который определял очередность записи данных в базу приемника. В КД3 этого реквизита нет, что вызывает недоумение.
Давайте разберемся, почему так произошло, как теперь работает механизм загрузки и какими способами мы можем повлиять на очередность обработки документов в формате EnterpriseData.
Для начала проанализируем архитектурные отличия. «Конвертация данных 2.0» работала по жесткому принципу: данные выгружались в XML, и при загрузке система пыталась записывать их последовательно. Если мы пытались загрузить документ, который ссылается на еще не созданный справочник, возникала проблема (либо битая ссылка, либо ошибка). Поэтому порядок был критически важен.
В «Конвертации данных 3.0» (использующей формат EnterpriseData и механизмы БСП) реализован принцип отложенной загрузки (отложенной записи). Рассмотрим, как это работает:
Благодаря этому механизму, строгая ручная настройка порядка загрузки для поддержания ссылочной целостности больше не требуется. БСП (Библиотека Стандартных Подсистем) делает это автоматически.
Несмотря на "умный" механизм, бывают ситуации, когда порядок важен для бизнес-логики:
ПередЗаписью используется запрос к данным, которые должны быть уже в базе.Рассмотрим способы, которыми мы можем решить эту задачу.
Хотя мы не можем задать порядок загрузки в приемнике «галочкой», мы можем определить порядок, в котором объекты попадут в файл обмена. Приемник читает файл последовательно, поэтому порядок в файле влияет на первичную попытку записи.
Для этого нам нужно обратиться к Правилам регистрации объектов (ПРО) в конфигурации-источнике или в правилах конвертации.
Разберем, как это сделать:
УПОРЯДОЧИТЬ ПО.Пример концептуального кода в обработчике выборки данных для выгрузки:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Док.Ссылка КАК Ссылка
|ИЗ
| Документ.РеализацияТоваровУслуг КАК Док
|ГДЕ
| Док.Ссылка В (&МассивСсылок)
|
|УПОРЯДОЧИТЬ ПО
| Док.Дата ВОЗР"; // Сортируем по дате, чтобы старые документы попали в файл первыми
Запрос.УстановитьПараметр("МассивСсылок", МассивОбъектовДляВыгрузки);
Результат = Запрос.Выполнить();
// Далее передаем результат в механизм выгрузки
Таким образом, в файл обмена документы попадут в хронологическом порядке. При загрузке БСП попытается обработать их в той же последовательности (если не вмешается механизм отложенной записи из-за нехватки ссылок).
Это наиболее мощный и правильный способ для КД3. Логика обмена в конфигурациях на базе БСП вынесена в общий модуль МенеджерОбменаЧерезУниверсальныйФормат. Если вы разрабатываете правила для типовой конфигурации, вам, возможно, придется использовать расширение для перехвата методов этого модуля.
Нас интересуют процедуры загрузки. Рассмотрим основные точки входа:
ПередЗаписьюПолученныхДанныхПриКонвертацииДанныхXDTOПриОбработкеОчередиОтложеннойЗаписиЕсли вам нужно жестко задать приоритет, вы можете анализировать тип загружаемого объекта. Посмотрим на примерную логику, которую можно реализовать в процедуре конвертации:
Процедура ПриКонвертацииДанныхXDTO(ДанныеXDTO, ПолученныеДанные, КомпонентыОбмена, СтекВыгрузки) Экспорт
// Определяем тип объекта
ТипОбъекта = ДанныеXDTO.Тип();
// Если это наш документ, который нужно грузить позже всех
Если ТипОбъекта = Тип("ДокументОбъект.РеализацияТоваровУслуг") Тогда
// Можем проверить условие.
// Если условия не выполнены (например, нет остатков),
// мы можем принудительно отказаться от записи сейчас
// и оставить объект на потом (механизм сам это сделает, если мы не запишем объект).
// Либо мы можем принудительно вызвать проведение связанных документов.
КонецЕсли;
КонецПроцедуры
В типовых конфигурациях (ERP, КА, УТ) в этом модуле уже прописан порядок обработки пакетов: сначала Справочники, ПВХ, потом Документы, потом Регистры сведений. Это «зашито» на уровне обработки формата EnterpriseData.
Если программировать модуль менеджера сложно или невозможно (базовая версия, запрет на доработки), воспользуемся организационным решением, предложенным в обсуждении.
Создадим две настройки обмена (два узла плана обмена или две настройки синхронизации):
Запуская обмены последовательно, мы гарантируем, что к моменту прихода «Реализаций» вся нормативно-справочная информация и заказы уже будут в базе.
В КД 3.1 нет поля «Порядок загрузки», потому что парадигма обмена изменилась. Система рассчитана на асинхронность и отсутствия жестких связей в момент чтения файла.
Резюмируем план действий:
МенеджерОбменаЧерезУниверсальныйФормат на стороне Приемника.