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