Как автоматически выгружать группы (родителей) справочника вместе с элементами в 1С?

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

При настройке обмена данными между конфигурациями 1С с помощью «Конвертации данных 2.0» (КД 2.0) специалисты часто сталкиваются с проблемой выборочной синхронизации иерархических справочников. Типичная ситуация: мы хотим выгружать ДоговорыКонтрагентов только по определенной организации. Элементы справочника легко фильтруются по реквизиту, но группы (папки) этого реквизита не имеют или он в них не заполнен. В итоге либо папки не попадают в обмен (и элементы в приемнике становятся «сиротами»), либо в приемник попадает «мусор» из всех существующих папок базы-источника.

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

Разберем проблему: Регистрация vs Выгрузка

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

  1. Регистрация изменений: Запись ссылки на объект в таблицу изменений плана обмена. Если объект не зарегистрирован, штатный механизм обмена его «не видит».
  2. Выгрузка (конвертация): Процесс формирования XML-файла. Объект может быть выгружен принудительно, даже если он не был зарегистрирован на узле.

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

Решение 1: Принудительная выгрузка родителя в обработчике ПКО

Это наиболее быстрый и надежный способ гарантировать наличие папки в базе-приемнике. Мы модифицируем логику выгрузки самого элемента справочника. Рассмотрим алгоритм действий в «Конвертации данных 2.0».

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


Если Источник.ЭтоГруппа Тогда
    // Если это сама группа, мы можем либо пропустить её (если она выгружается вместе с элементом),
    // либо использовать отдельное правило.
    ВыгрузитьПоПравилу(Источник, , , , "ДоговорыКонтрагентовГруппы");
    Отказ = Истина; // Отменяем стандартную выгрузку, так как уже выгрузили по спец. правилу
Иначе
    // Если это элемент, проверяем наличие родителя
    Если ЗначениеЗаполнено(Источник.Родитель) И Источник.Родитель.ЭтоГруппа Тогда
        // Принудительно выгружаем родителя по правилу для групп
        ВыгрузитьПоПравилу(Источник.Родитель, , , , "ДоговорыКонтрагентовГруппы");
    КонецЕсли;
КонецЕсли;

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

Решение 2: Настройка ПКС для свойства «Родитель»

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

  1. Найдите в ПКО договора строку со свойством Родитель.
  2. Установите флаг «Выгружать объект целиком».
  3. В поле «Правило конвертации» укажите ПКО, предназначенное именно для групп (например, ДоговорыКонтрагентовГруппы).

Важный нюанс: Чтобы избежать бесконечной перезаписи папок при каждом обмене, в ПКО для групп (ДоговорыКонтрагентовГруппы) на закладке «Основные» необходимо установить флаг «Не замещать существующие объекты в приемнике, а только создавать новые». Это позволит создать структуру папок один раз и не тратить ресурсы на их обновление, если их реквизиты в источнике не менялись.

Решение 3: Программная регистрация всей иерархии в ПРО

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

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


// Определим текущего родителя
ТекущийРодитель = Объект.Родитель;

// Пройдем циклом по всей иерархии вверх до корня
Пока ЗначениеЗаполнено(ТекущийРодитель) И Не ТекущийРодитель.Пустая() Цикл
    // Регистрируем родителя на тех же узлах, куда попал основной объект
    Для Каждого Узел Из Получатели Цикл
        ПланыОбмена.ЗарегистрироватьИзменения(Узел, ТекущийРодитель);
    КонецЦикла;
    
    // Переходим к следующему уровню иерархии
    ТекущийРодитель = ТекущийРодитель.Родитель;
КонецЦикла;

Этот метод гарантирует, что в базе-приемнике не возникнет ситуации «битой ссылки» в поле Родитель, если дерево групп имеет большую вложенность (например, Группа 1 -> Группа 2 -> Элемент).

Разберем важные детали поиска и синхронизации

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

Рекомендация: Для групп справочника в поля поиска обязательно включайте ЭтоГруппа, Наименование и Родитель. Если искать только по наименованию, папка «Общие договоры» в одном уровне иерархии может «схлопнуться» с папкой с таким же названием в другом уровне. Указание родителя в полях поиска обеспечивает уникальность в пределах одной ветки.

Резюме и рекомендации

Подведем итог нашему анализу. Выбор метода зависит от сложности вашей задачи:

Соблюдение этих правил позволит вам построить чистый и надежный обмен данными, где структура справочников в приемнике будет в точности соответствовать источнику без лишнего информационного шума.

← На главную