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