Как в Конвертации данных 2.1 выгрузить группы и элементы одного справочника в разные справочники приемника?

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

При настройке обмена между конфигурациями 1С часто возникает ситуация, когда в базе-источнике (например, 1С:УПП) справочник является иерархическим (содержит и группы, и элементы в одной таблице), а в базе-приемнике (например, 1С:Документооборот) структура разделена: элементы хранятся в справочнике Проекты, а папки — в отдельном справочнике ПапкиПроектов.

Если просто создать два Правила конвертации объектов (ПКО) с одинаковым источником и пытаться управлять выгрузкой через флаг Отказ в обработчиках, механизм конвертации будет выбирать только первое подходящее по списку правило. Разберем, как правильно настроить правила конвертации для корректного разделения данных.

Причина проблемы: как Конвертация данных выбирает ПКО

Проанализируем механику работы «Конвертации данных 2.1». Когда для одного объекта метаданных источника создано несколько правил конвертации (ПКО), движок конвертации не может автоматически догадаться, по какому именно правилу должен выгружаться конкретный объект. Если правило явно не назначено, платформа берет первое ПКО в дереве правил, у которого совпадает тип источника.

Попытка прописать в обработчике «Перед выгрузкой» конструкцию вида Если Не ЭтоГруппа Тогда Отказ = Истина; КонецЕсли; приводит лишь к тому, что выгрузка папок по первому правилу просто прерывается с ошибкой или игнорируется, а до второго правила очередь не доходит. Для решения задачи требуется явное динамическое переопределение правила конвертации.

Способ 1. Динамическое переопределение ИмяПКО в ПВД (для первичной выгрузки)

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

  1. ПКО_Проекты: Источник — СправочникСсылка.Проекты, Приемник — СправочникСсылка.Проекты.
  2. ПКО_ПапкиПроектов: Источник — СправочникСсылка.Проекты, Приемник — СправочникСсылка.ПапкиПроектов.
  3. ПВД_Проекты: выгружает справочник Проекты.

В созданном ПВД в обработчике «Перед обработкой» или «Перед выгрузкой объекта» прописываем условие переключения имени ПКО в зависимости от того, чем является выгружаемый объект:


Если Объект.ЭтоГруппа Тогда
    ИмяПКО = "ПКО_ПапкиПроектов";
Иначе
    ИмяПКО = "ПКО_Проекты";
КонецЕсли;

Способ 2. Универсальное переопределение в основном ПКО (для выгрузки по ссылкам)

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

Чтобы выгрузка корректно отрабатывала как при прямой выгрузке, так и по ссылкам из других мест конфигурации, перенесем логику маршрутизации в обработчик «Перед выгрузкой» основного ПКО (например, ПКО_Проекты):


Если Источник.ЭтоГруппа Тогда
    ИмяПКО = "ПКО_ПапкиПроектов";
КонецЕсли;

В этом случае при попытке платформы выгрузить группу через базовое правило движок перенаправит поток данных в правило для папок.

Способ 3. Программная выгрузка через ВыгрузитьПоПравилу

Рассмотрим еще один надежный подход, который полностью исключает неявный подбор правил платформой. В обработчике «Перед выгрузкой» основного ПКО можно установить отказ от стандартной обработки и вызвать целевое правило вручную:


Если Источник.ЭтоГруппа Тогда
    Отказ = Истина;
    ВыгрузитьПоПравилу(Источник, , , , "ПКО_ПапкиПроектов");
КонецЕсли;

Настройка реквизитов и связей иерархии

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

  1. Связь элемента с папкой: В справочнике-приемнике Проекты реквизит Родитель (или Папка) имеет тип ссылки на справочник ПапкиПроектов. В правиле конвертации свойств (ПКС) для этого реквизита необходимо жестко указать правило ПКО_ПапкиПроектов.
  2. Иерархия внутри папок: В правиле ПКО_ПапкиПроектов для свойства Родитель также должно быть жестко установлено правило ПКО_ПапкиПроектов, чтобы родительские папки корректно сопоставлялись между собой.
  3. Особенности типа приемника: Справочники папок в типовых конфигурациях (включая 1С:Документооборот) чаще всего имеют иерархию элементов, а не групп. Поэтому для них настраиваются реквизиты обычного элемента, а реквизит ЭтоГруппа выгружать не требуется.
  4. Идентификация объектов: Уникальные идентификаторы (GUID) групп и элементов исходного справочника не пересекаются, поэтому сопоставление по GUID при загрузке в разные таблицы проходит корректно и без конфликтов.
← На главную