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