Почему в 1С:Конвертация данных 2.1 не работает приоритет ПВД при выгрузке через планы обмена?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

При разработке правил обмена в конфигурации 1С:Конвертация данных 2.1 (КД 2.1) программисты часто сталкиваются с ситуацией, когда настройка поля Порядок (приоритет) в Правилах выгрузки данных (ПВД) никак не влияет на последовательность появления объектов в итоговом XML-файле. Рассмотрим ситуацию: нам необходимо, чтобы сначала выгружались документы РеализацияТоваровУслуг, а только потом связанные с ними РасходныеКассовыеОрдера (РКО), так как логика загрузки в базе-приемнике требует наличия основания для корректного заполнения. Однако, несмотря на выставленный приоритет «1» для реализации и «150» для РКО, в файле объекты всё равно идут в «алфавитном» или случайном порядке. Проанализируем, почему так происходит и как правильно решить эту задачу.

Разберем причину: ПВД против Планов обмена

Для начала выясним корень проблемы. В КД 2.1 существует два принципиально разных режима выгрузки данных:

  1. Стандартная выгрузка: выполняется через обработку «Универсальный обмен данными в формате XML». Здесь система перебирает ПВД именно в том порядке, который указал разработчик.
  2. Выгрузка по Плану обмена: используется в типовых механизмах синхронизации данных. В этом режиме порядок, заданный в ПВД, игнорируется платформой.

Проанализируем программный код, который отвечает за выборку данных при обмене. Когда мы используем обмен по плану обмена, платформа вызывает метод ВыбратьИзменения(). Посмотрим на пример типичного вызова в конфе-источнике:


ВыборкаИзменений = ПланыОбмена.ВыбратьИзменения(ЗаписьСообщения.Получатель, ЗаписьСообщения.НомерСообщения, МассивВыгружаемыхМетаданных);
Пока ВыборкаИзменений.Следующий() Цикл
    // Объекты выгружаются в том порядке, в котором их вернула выборка платформы
    ВыгрузитьПоПравилу(ВыборкаИзменений.Получить());
КонецЦикла;

Платформа 1С:Предприятие возвращает объекты в выборке либо в порядке их регистрации в таблице изменений, либо в порядке внутреннего следования типов метаданных. Таким образом, ПВД в данном сценарии служат лишь фильтром (определяют, какие ПКО использовать), но не управляют очередью выгрузки.

Анализируем параметр NPP (Номер по порядку)

В сообщениях форума упоминается атрибут нпп (Номер по порядку) в XML-файле. Важно понимать, что этот номер присваивается объекту в момент его записи в файл. Если РасходныйКассовыйОрдер получил нпп = 16, а РеализацияТоваровУслуг получила нпп = 1047, это означает, что РКО физически был записан в файл раньше. При загрузке в базу-приемник обработка будет читать файл последовательно, а значит, сначала попытается создать РКО, и если в этот момент реализация еще не загружена, ссылки могут остаться «битыми» или логика заполнения реквизитов не отработает.

Решение 1: Перенос логики в событие «После загрузки данных»

Поскольку мы не можем гарантировать порядок объектов в файле при использовании планов обмена, самым надежным решением будет использование глобальных обработчиков конвертации. Вместо того чтобы пытаться выполнить расчеты или заполнение «в момент» загрузки конкретного документа, перенесем эту логику в финал процесса.

Рассмотрим алгоритм действий:

  1. В ПКО для РасходныйКассовыйОрдер выполняем только базовую загрузку реквизитов.
  2. Переходим в настройки конвертации на закладку «Алгоритмы/Обработчики».
  3. Находим событие «После загрузки данных». Этот обработчик выполняется один раз, когда ВСЕ объекты из файла уже прочитаны и записаны в базу-приемник.
  4. Прописываем в нем пересчет или дозаполнение нужных документов.

Пример кода в обработчике «После загрузки данных»:


// К этому моменту и РКО, и Реализации уже в базе
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Ссылка ИЗ Документ.РасходныйКассовыйОрдер ГДЕ ДокументОснование = ЗНАЧЕНИЕ(Документ.РеализацияТоваровУслуг.ПустаяСсылка)";
// ... далее логика по дозаполнению найденных объектов

Решение 2: Использование параметров для отложенной обработки

Если нам нужно обработать только те объекты, которые пришли в текущем пакете, мы можем использовать структуру Параметры. Рассмотрим, как это сделать:

  1. В обработчике ПКО РКО «После загрузки» добавляем ссылку на текущий объект в массив, который сохраним в Параметры.
  2. В обработчике «После загрузки данных» (всей конвертации) обходим этот массив и выполняем необходимые действия.

Пример в ПКО документа (После загрузки):


Если Параметры.Свойство("СписокДокументовДляОбработки") = Ложь Тогда
    Параметры.Вставить("СписокДокументовДляОбработки", Новый Массив);
КонецЕсли;
Параметры.СписокДокументовДляОбработки.Добавить(Объект.Ссылка);

Решение 3: Программная сортировка выборки (для опытных разработчиков)

Если вы имеете возможность править код обработки выгрузки в самой конфигурации (или через расширение), можно вмешаться в процесс формирования массива метаданных перед вызовом ВыбратьИзменения(). Платформа возвращает данные порциями согласно типам в массиве МассивВыгружаемыхМетаданных. Если в этом массиве тип ДокументСсылка.РеализацияТоваровУслуг будет стоять первым, а ДокументСсылка.РасходныйКассовыйОрдер — последним, то и в выборку они попадут в правильном порядке.

Однако помните, что это требует изменения типового кода обмена, что не всегда желательно. Лучше придерживаться стратегии «отложенной обработки» на стороне загрузки, так как она более устойчива к изменениям платформы.

Резюме

Подведем итоги нашего анализа. Порядок ПВД — это инструмент для «ручной» выгрузки через универсальную обработку. Для Планов обмена этот параметр бесполезен. Чтобы гарантировать корректность данных, зависящих от других объектов:

Такой подход сделает ваши правила обмена надежными и независимыми от механизмов выборки платформы.

← На главную