При настройке распределенных информационных баз (РИБ) системные администраторы и программисты 1С часто сталкиваются с ситуацией, когда линейные элементы справочников (например, товары) успешно мигрируют в подчиненный узел, а иерархическая структура — папки и группы — бесследно исчезает. Это создает серьезные неудобства для пользователей, так как нарушается привычная логика поиска и классификации данных. Разберем подробно, почему так происходит, и как восстановить целостность данных в дочерней базе.
Прежде чем приступать к программным исправлениям, проанализируем визуальную составляющую. В управляемых формах 1С 8.3 существует особенность отображения иерархических списков. Если в справочнике Номенклатура или Контрагенты установлен режим «Иерархический список», а сама папка (родитель) не была перенесена по каким-то причинам, то элементы внутри этой папки перестают отображаться в дереве.
Рассмотрим алгоритм первичной проверки:
Номенклатура.Если в режиме плоского списка товары появились, а в иерархическом их нет — значит, проблема именно в отсутствии групп (папок). Если же объектов нет даже в списке, значит, они действительно не были зарегистрированы к обмену или были отсечены правилами выгрузки.
Выясним причину, почему авторегистрация может не срабатывать. Важно понимать, что флаг «Авторегистрация — Разрешена» в составе плана обмена работает только в момент выполнения события ПриЗаписи объекта. Если папки номенклатуры были созданы в центральной базе до того, как справочник был включен в план обмена или до создания начального образа подчиненного узла, система «не знает», что их нужно отправить.
Проанализируем ситуацию: когда мы просто включаем объект в состав обмена, база данных не ставит в очередь на выгрузку все существующие записи. Она ждет их изменения. Именно поэтому ручная перезапись папки в центральном узле (нажать «Записать и закрыть») часто решает проблему для конкретной группы. Однако перезаписывать сотни папок вручную — неэффективно.
В современных конфигурациях (УТ 11, ERP, КА) обмен часто строится не на стандартном механизме РИБ «в лоб», а с использованием подсистемы обмена данными из БСП (Библиотеки стандартных подсистем). В этом случае вступают в силу Правила регистрации объектов (ПРО).
Разберем, на что обратить внимание в правилах:
Если ЗначениеЗаполнено(Объект.Родитель) Тогда Отказ = Истина; КонецЕсли;. Такой код намеренно запрещает регистрацию иерархии.ЭтоГруппа равно Истина.ПриОтправкеДанныхПодчиненному в модуле плана обмена может программно установить параметр Игнорировать = Истина, если папка не соответствует критериям (например, не относится к разрешенному магазину или организации).Чтобы «протолкнуть» все папки и элементы, которые не попали в обмен, воспользуемся стандартной обработкой «Регистрация изменений для обмена данными».
Посмотрим на последовательность действий:
Номенклатура или Контрагенты.Важный нюанс: при регистрации папки система регистрирует только саму ссылку на папку. Чтобы гарантированно перенести всю структуру, рекомендуется регистрировать справочники целиком. Если база слишком большая, можно воспользоваться программным методом регистрации.
Если нам нужно зарегистрировать только определенные группы и их содержимое, воспользуемся встроенным языком 1С. Рассмотрим пример кода, который регистрирует папку и все вложенные в нее элементы для конкретного узла обмена:
Процедура ЗарегистрироватьГруппуИСодержимое(УзелСсылка, ВыбраннаяГруппа)
// Регистрируем саму группу
ПланыОбмена.ЗарегистрироватьИзменения(УзелСсылка, ВыбраннаяГруппа);
// Выбираем все элементы и вложенные группы
Выборка = Справочники.Номенклатура.Выбрать(ВыбраннаяГруппа);
Пока Выборка.Следующий() Цикл
Если Выборка.ЭтоГруппа Тогда
// Рекурсивный вызов для вложенных папок
ЗарегистрироватьГруппуИСодержимое(УзелСсылка, Выборка.Ссылка);
Иначе
// Регистрация конечного элемента
ПланыОбмена.ЗарегистрироватьИзменения(УзелСсылка, Выборка.Ссылка);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Этот подход гарантирует, что в сообщение обмена попадут все UUID (уникальные идентификаторы) папок. В приемнике (подчиненном узле) при чтении сообщения система создаст эти записи, и иерархия «схлопнется» правильно.
Выясним еще одну неочевидную причину: почему папка в дочерней базе появилась, но она пустая? Это происходит, если элементы (товары) были зарегистрированы и переданы раньше, чем их папка-родитель.
Проанализируем ситуацию в базе-приемнике с помощью консоли запросов:
ВЫБРАТЬ
Номенклатура.Ссылка,
Номенклатура.Наименование
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.Родитель.Наименование ЕСТЬ NULL
И НЕ Номенклатура.Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
Если этот запрос возвращает данные, значит, у элементов в поле Родитель записана «битая ссылка» (Объект не найден). 1С не может отобразить такой элемент в иерархии, так как не знает, к какому узлу дерева его привязать.
Решение: необходимо обеспечить выгрузку папок до или вместе с элементами. Самый простой способ — полная регистрация изменений справочника в источнике и выполнение повторного сеанса синхронизации.
Для исправления проблемы с переносом папок в РИБ следует придерживаться следующего плана:
ПриОтправкеДанных.Помните, что в РИБ порядок регистрации имеет значение: папки-родители должны существовать в базе-приемнике, чтобы элементы внутри них заняли свои места в структуре каталогов.