При настройке обмена между конфигурациями 1С часто возникает ситуация, когда в базе-источнике (например, 1С:УПП) справочник является иерархическим (содержит и группы, и элементы в одной таблице), а в базе-приемнике (например, 1С:Документооборот) структура разделена: элементы хранятся в справочнике Проекты, а папки — в отдельном справочнике ПапкиПроектов.
Если просто создать два Правила конвертации объектов (ПКО) с одинаковым источником и пытаться управлять выгрузкой через флаг Отказ в обработчиках, механизм конвертации будет выбирать только первое подходящее по списку правило. Разберем, как правильно настроить правила конвертации для корректного разделения данных.
Проанализируем механику работы «Конвертации данных 2.1». Когда для одного объекта метаданных источника создано несколько правил конвертации (ПКО), движок конвертации не может автоматически догадаться, по какому именно правилу должен выгружаться конкретный объект. Если правило явно не назначено, платформа берет первое ПКО в дереве правил, у которого совпадает тип источника.
Попытка прописать в обработчике «Перед выгрузкой» конструкцию вида Если Не ЭтоГруппа Тогда Отказ = Истина; КонецЕсли; приводит лишь к тому, что выгрузка папок по первому правилу просто прерывается с ошибкой или игнорируется, а до второго правила очередь не доходит. Для решения задачи требуется явное динамическое переопределение правила конвертации.
Разберем базовый вариант, когда справочник выгружается целиком по Правилу выгрузки данных (ПВД). В этом случае мы создаем одно ПВД и два независимых ПКО:
СправочникСсылка.Проекты, Приемник — СправочникСсылка.Проекты.СправочникСсылка.Проекты, Приемник — СправочникСсылка.ПапкиПроектов.Проекты.В созданном ПВД в обработчике «Перед обработкой» или «Перед выгрузкой объекта» прописываем условие переключения имени ПКО в зависимости от того, чем является выгружаемый объект:
Если Объект.ЭтоГруппа Тогда
ИмяПКО = "ПКО_ПапкиПроектов";
Иначе
ИмяПКО = "ПКО_Проекты";
КонецЕсли;
Обратим внимание на критически важный нюанс: переопределение правила в ПВД срабатывает только при прямой выгрузке данных. Если объект выгружается по ссылке из других документов или регистров, обработчик ПВД не вызывается.
Чтобы выгрузка корректно отрабатывала как при прямой выгрузке, так и по ссылкам из других мест конфигурации, перенесем логику маршрутизации в обработчик «Перед выгрузкой» основного ПКО (например, ПКО_Проекты):
Если Источник.ЭтоГруппа Тогда
ИмяПКО = "ПКО_ПапкиПроектов";
КонецЕсли;
В этом случае при попытке платформы выгрузить группу через базовое правило движок перенаправит поток данных в правило для папок.
Рассмотрим еще один надежный подход, который полностью исключает неявный подбор правил платформой. В обработчике «Перед выгрузкой» основного ПКО можно установить отказ от стандартной обработки и вызвать целевое правило вручную:
Если Источник.ЭтоГруппа Тогда
Отказ = Истина;
ВыгрузитьПоПравилу(Источник, , , , "ПКО_ПапкиПроектов");
КонецЕсли;
Разберем по шагам, на что необходимо обратить внимание при переносе иерархии между разделенными справочниками:
Проекты реквизит Родитель (или Папка) имеет тип ссылки на справочник ПапкиПроектов. В правиле конвертации свойств (ПКС) для этого реквизита необходимо жестко указать правило ПКО_ПапкиПроектов.ПКО_ПапкиПроектов для свойства Родитель также должно быть жестко установлено правило ПКО_ПапкиПроектов, чтобы родительские папки корректно сопоставлялись между собой.ЭтоГруппа выгружать не требуется.