При разработке правил обмена в конфигурации 1С:Конвертация данных 2.1 (КД 2.1) программисты часто сталкиваются с ситуацией, когда настройка поля Порядок (приоритет) в Правилах выгрузки данных (ПВД) никак не влияет на последовательность появления объектов в итоговом XML-файле. Рассмотрим ситуацию: нам необходимо, чтобы сначала выгружались документы РеализацияТоваровУслуг, а только потом связанные с ними РасходныеКассовыеОрдера (РКО), так как логика загрузки в базе-приемнике требует наличия основания для корректного заполнения. Однако, несмотря на выставленный приоритет «1» для реализации и «150» для РКО, в файле объекты всё равно идут в «алфавитном» или случайном порядке. Проанализируем, почему так происходит и как правильно решить эту задачу.
Для начала выясним корень проблемы. В КД 2.1 существует два принципиально разных режима выгрузки данных:
Проанализируем программный код, который отвечает за выборку данных при обмене. Когда мы используем обмен по плану обмена, платформа вызывает метод ВыбратьИзменения(). Посмотрим на пример типичного вызова в конфе-источнике:
ВыборкаИзменений = ПланыОбмена.ВыбратьИзменения(ЗаписьСообщения.Получатель, ЗаписьСообщения.НомерСообщения, МассивВыгружаемыхМетаданных);
Пока ВыборкаИзменений.Следующий() Цикл
// Объекты выгружаются в том порядке, в котором их вернула выборка платформы
ВыгрузитьПоПравилу(ВыборкаИзменений.Получить());
КонецЦикла;
Платформа 1С:Предприятие возвращает объекты в выборке либо в порядке их регистрации в таблице изменений, либо в порядке внутреннего следования типов метаданных. Таким образом, ПВД в данном сценарии служат лишь фильтром (определяют, какие ПКО использовать), но не управляют очередью выгрузки.
В сообщениях форума упоминается атрибут нпп (Номер по порядку) в XML-файле. Важно понимать, что этот номер присваивается объекту в момент его записи в файл. Если РасходныйКассовыйОрдер получил нпп = 16, а РеализацияТоваровУслуг получила нпп = 1047, это означает, что РКО физически был записан в файл раньше. При загрузке в базу-приемник обработка будет читать файл последовательно, а значит, сначала попытается создать РКО, и если в этот момент реализация еще не загружена, ссылки могут остаться «битыми» или логика заполнения реквизитов не отработает.
Поскольку мы не можем гарантировать порядок объектов в файле при использовании планов обмена, самым надежным решением будет использование глобальных обработчиков конвертации. Вместо того чтобы пытаться выполнить расчеты или заполнение «в момент» загрузки конкретного документа, перенесем эту логику в финал процесса.
Рассмотрим алгоритм действий:
РасходныйКассовыйОрдер выполняем только базовую загрузку реквизитов.Пример кода в обработчике «После загрузки данных»:
// К этому моменту и РКО, и Реализации уже в базе
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Ссылка ИЗ Документ.РасходныйКассовыйОрдер ГДЕ ДокументОснование = ЗНАЧЕНИЕ(Документ.РеализацияТоваровУслуг.ПустаяСсылка)";
// ... далее логика по дозаполнению найденных объектов
Если нам нужно обработать только те объекты, которые пришли в текущем пакете, мы можем использовать структуру Параметры. Рассмотрим, как это сделать:
Параметры.Пример в ПКО документа (После загрузки):
Если Параметры.Свойство("СписокДокументовДляОбработки") = Ложь Тогда
Параметры.Вставить("СписокДокументовДляОбработки", Новый Массив);
КонецЕсли;
Параметры.СписокДокументовДляОбработки.Добавить(Объект.Ссылка);
Если вы имеете возможность править код обработки выгрузки в самой конфигурации (или через расширение), можно вмешаться в процесс формирования массива метаданных перед вызовом ВыбратьИзменения(). Платформа возвращает данные порциями согласно типам в массиве МассивВыгружаемыхМетаданных. Если в этом массиве тип ДокументСсылка.РеализацияТоваровУслуг будет стоять первым, а ДокументСсылка.РасходныйКассовыйОрдер — последним, то и в выборку они попадут в правильном порядке.
Однако помните, что это требует изменения типового кода обмена, что не всегда желательно. Лучше придерживаться стратегии «отложенной обработки» на стороне загрузки, так как она более устойчива к изменениям платформы.
Подведем итоги нашего анализа. Порядок ПВД — это инструмент для «ручной» выгрузки через универсальную обработку. Для Планов обмена этот параметр бесполезен. Чтобы гарантировать корректность данных, зависящих от других объектов:
Параметры для передачи списка загруженных объектов между обработчиками.Такой подход сделает ваши правила обмена надежными и независимыми от механизмов выборки платформы.