Как выгрузить один элемент справочника в несколько объектов XDTO при обмене через КД 3.0?

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

При использовании универсального формата обмена (КД 3.0) разработчики часто сталкиваются с задачей, когда простая выгрузка «один в один» не подходит. Например, если в конфигурации-источнике объект представлен одним элементом справочника, а в системе-приемнике эти данные должны быть размножены на основе регистра сведений или других связанных сущностей. Давайте разберем, как реализовать такую логику, не нарушая работу механизма обмена.

Основные принципы реализации

Для решения задачи нам не потребуется менять сам пакет XDTO — структура данных остается прежней. Основная работа ведется в модуле обмена. Вся магия «размножения» объектов происходит в момент формирования данных перед их сериализацией. Мы должны перехватить процесс выгрузки и реализовать собственную логику отправки.

Шаг 1. Отключение стандартной выгрузки

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

Нам потребуется использовать коллекцию ИспользованиеПКО. Установив значение конкретного правила в Ложь, мы предотвращаем стандартное выполнение задачи системой.

Шаг 2. Реализация ручной выгрузки данных

После того как мы отключили стандартную выгрузку, необходимо реализовать логику формирования нескольких объектов. Рассмотрим пример того, как это делается в типовых конфигурациях при выгрузке, например, документов установки цен. Мы создаем структуру данных, а затем вызываем метод ОбменДаннымиXDTOСервер.ВыгрузкаОбъектаВыборки столько раз, сколько «дочерних» элементов нам нужно получить в приемнике.

Разберем пример структуры кода, который поможет вам выполнить эту задачу:


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

Важные замечания по интеграции

При реализации данного подхода важно учитывать следующие аспекты:

  1. Идентификация объектов: Поскольку вы создаете несколько записей вместо одной, принимающая сторона должна корректно идентифицировать каждый из них. Убедитесь, что правила поиска (ПКО) в приемнике настроены так, чтобы поддерживать уникальность для «размноженных» объектов (например, используя уникальные ключи, включающие не только ссылку, но и дополнительные признаки, такие как подразделение).
  2. Логика выборки: Поскольку данные могут находиться в регистрах сведений, целесообразно выполнить отдельный запрос в процедуре ПриОбработке. Это позволит получить полный список подразделений для одного элемента справочника и последовательно «прогнать» их через механизм обмена.
  3. Совместимость: Данный метод полностью соответствует архитектуре КД 3.0, так как мы не пытаемся управлять загрузкой в приемнике, а лишь подготавливаем корректные данные на этапе отправки. Все манипуляции происходят до момента сериализации в XML, что позволяет сохранить целостность процесса обмена.

Использование этого подхода позволяет гибко адаптировать структуру данных под требования принимающей системы, избегая дублирования кода и соблюдая стандарты разработки на платформе 1С:Предприятие.

← На главную