При использовании универсального формата обмена (КД 3.0) разработчики часто сталкиваются с задачей, когда простая выгрузка «один в один» не подходит. Например, если в конфигурации-источнике объект представлен одним элементом справочника, а в системе-приемнике эти данные должны быть размножены на основе регистра сведений или других связанных сущностей. Давайте разберем, как реализовать такую логику, не нарушая работу механизма обмена.
Для решения задачи нам не потребуется менять сам пакет XDTO — структура данных остается прежней. Основная работа ведется в модуле обмена. Вся магия «размножения» объектов происходит в момент формирования данных перед их сериализацией. Мы должны перехватить процесс выгрузки и реализовать собственную логику отправки.
Первым делом необходимо запретить системе выполнять стандартную выгрузку объекта, так как мы планируем делать это вручную. Для этого переходим в обработчик события ПриОбработке в правилах конвертации объекта (ПКО). В этом событии мы должны явно указать, что типовой механизм использовать не нужно.
Нам потребуется использовать коллекцию ИспользованиеПКО. Установив значение конкретного правила в Ложь, мы предотвращаем стандартное выполнение задачи системой.
После того как мы отключили стандартную выгрузку, необходимо реализовать логику формирования нескольких объектов. Рассмотрим пример того, как это делается в типовых конфигурациях при выгрузке, например, документов установки цен. Мы создаем структуру данных, а затем вызываем метод ОбменДаннымиXDTOСервер.ВыгрузкаОбъектаВыборки столько раз, сколько «дочерних» элементов нам нужно получить в приемнике.
Разберем пример структуры кода, который поможет вам выполнить эту задачу:
Процедура ПОД_ВашОбъект_Отправка_ПриОбработке(Данные, ИспользованиеПКО)
// 1. Формируем данные на основе вашего регистра или других источников
СписокДанных = ПолучитьДанныеДляВыгрузки(Данные.Ссылка);
Для Каждого ЭлементДанных Из СписокДанных Цикл
// 2. Формируем структуру или объект для конкретной записи
СтруктураВыгрузки = Новый Структура;
СтруктураВыгрузки.Вставить(\"Реквизит1\", ЭлементДанных.Значение1);
СтруктураВыгрузки.Вставить(\"Подразделение\", ЭлементДанных.Подразделение);
// 3. Вызываем процедуру выгрузки для каждого элемента
ОбменДаннымиXDTOСервер.ВыгрузкаОбъектаВыборки(СтруктураВыгрузки, \"ИмяВашегоПКО\", ...);
КонецЦикла;
// 4. Обязательно запрещаем выгрузку объекта стандартным способом
ИспользованиеПКО.ВашеИмяПКО = Ложь;
КонецПроцедуры
При реализации данного подхода важно учитывать следующие аспекты:
ПриОбработке. Это позволит получить полный список подразделений для одного элемента справочника и последовательно «прогнать» их через механизм обмена.Использование этого подхода позволяет гибко адаптировать структуру данных под требования принимающей системы, избегая дублирования кода и соблюдая стандарты разработки на платформе 1С:Предприятие.