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