Почему группы справочника в КД 2.1 переносятся как элементы и как это исправить?

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

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

Причина проблемы и архитектура загрузки в КД 2.1

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

В процессе выгрузки данных формат XML в КД 2.1 разделяет каждый объект на две основные части:

  1. Узел ссылки (заголовочная часть): сюда попадают исключительно поля, для которых в Правилах конвертации свойств (ПКС) включен флаг «Поиск», а также уникальный идентификатор (GUID).
  2. Узел объекта: содержит все остальные выгружаемые реквизиты, табличные части и параметры.

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

Посмотрим на фрагмент типовой функции СоздатьНовыйОбъект универсального механизма загрузки:


ЭтоГруппа = СвойстваПоиска["ЭтоГруппа"];

Если ЭтоГруппа = Истина Тогда
    Объект = Менеджер.СоздатьГруппу();
Иначе
    Объект = Менеджер.СоздатьЭлемент();
КонецЕсли;

Если в ПКС для свойства ЭтоГруппа флаг «Поиск» не установлен, данное свойство не попадает в узел ссылки и отсутствует в структуре СвойстваПоиска. В результате условие не выполняется, и обработка всегда создает обычный элемент через Менеджер.СоздатьЭлемент().

Решение 1: Установка флага «Поиск» для реквизита ЭтоГруппа

Разберем базовый и наиболее распространенный вариант решения задачи. Для справочников с типом иерархии «Иерархия групп и элементов» выполним следующие действия:

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

Решение 2: Разделение выгрузки на два отдельных ПКО

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

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

Особенности работы с обработчиком «Поля поиска» и параметрами

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

Если передача признака группы реализуется через параметры, необходимо убедиться, что соответствующий параметр отмечен для передачи в поля поиска, иначе в обработчике сопоставления значение параметра будет равно Неопределено.

← На главную