Почему в РИБ не переносятся папки номенклатуры и контрагентов и как это исправить?

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

При настройке распределенных информационных баз (РИБ) системные администраторы и программисты 1С часто сталкиваются с ситуацией, когда линейные элементы справочников (например, товары) успешно мигрируют в подчиненный узел, а иерархическая структура — папки и группы — бесследно исчезает. Это создает серьезные неудобства для пользователей, так как нарушается привычная логика поиска и классификации данных. Разберем подробно, почему так происходит, и как восстановить целостность данных в дочерней базе.

Проверяем режим отображения: Проблема «невидимых» данных

Прежде чем приступать к программным исправлениям, проанализируем визуальную составляющую. В управляемых формах 1С 8.3 существует особенность отображения иерархических списков. Если в справочнике Номенклатура или Контрагенты установлен режим «Иерархический список», а сама папка (родитель) не была перенесена по каким-то причинам, то элементы внутри этой папки перестают отображаться в дереве.

Рассмотрим алгоритм первичной проверки:

  1. Перейдем в подчиненный узел.
  2. Откроем справочник Номенклатура.
  3. Нажмем кнопку «Еще» — «Установить режим просмотра» — «Список».

Если в режиме плоского списка товары появились, а в иерархическом их нет — значит, проблема именно в отсутствии групп (папок). Если же объектов нет даже в списке, значит, они действительно не были зарегистрированы к обмену или были отсечены правилами выгрузки.

Принцип работы авторегистрации и «старые» данные

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

Проанализируем ситуацию: когда мы просто включаем объект в состав обмена, база данных не ставит в очередь на выгрузку все существующие записи. Она ждет их изменения. Именно поэтому ручная перезапись папки в центральном узле (нажать «Записать и закрыть») часто решает проблему для конкретной группы. Однако перезаписывать сотни папок вручную — неэффективно.

Использование правил регистрации объектов (ПРО) и правил выгрузки (ПВД)

В современных конфигурациях (УТ 11, ERP, КА) обмен часто строится не на стандартном механизме РИБ «в лоб», а с использованием подсистемы обмена данными из БСП (Библиотеки стандартных подсистем). В этом случае вступают в силу Правила регистрации объектов (ПРО).

Разберем, на что обратить внимание в правилах:

Решение проблемы через регистрацию изменений

Чтобы «протолкнуть» все папки и элементы, которые не попали в обмен, воспользуемся стандартной обработкой «Регистрация изменений для обмена данными».

Посмотрим на последовательность действий:

  1. Откроем обработку (в разных конфигурациях она находится в разделе «Администрирование» — «Синхронизация данных» — «Состав отправляемых данных»).
  2. Найдем в списке справочник Номенклатура или Контрагенты.
  3. Нажмем правой кнопкой мыши и выберем «Зарегистрировать изменения всех объектов выбранного типа».

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

Программный метод регистрации иерархии

Если нам нужно зарегистрировать только определенные группы и их содержимое, воспользуемся встроенным языком 1С. Рассмотрим пример кода, который регистрирует папку и все вложенные в нее элементы для конкретного узла обмена:


Процедура ЗарегистрироватьГруппуИСодержимое(УзелСсылка, ВыбраннаяГруппа)
    // Регистрируем саму группу
    ПланыОбмена.ЗарегистрироватьИзменения(УзелСсылка, ВыбраннаяГруппа);
    
    // Выбираем все элементы и вложенные группы
    Выборка = Справочники.Номенклатура.Выбрать(ВыбраннаяГруппа);
    Пока Выборка.Следующий() Цикл
        Если Выборка.ЭтоГруппа Тогда
            // Рекурсивный вызов для вложенных папок
            ЗарегистрироватьГруппуИСодержимое(УзелСсылка, Выборка.Ссылка);
        Иначе
            // Регистрация конечного элемента
            ПланыОбмена.ЗарегистрироватьИзменения(УзелСсылка, Выборка.Ссылка);
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Этот подход гарантирует, что в сообщение обмена попадут все UUID (уникальные идентификаторы) папок. В приемнике (подчиненном узле) при чтении сообщения система создаст эти записи, и иерархия «схлопнется» правильно.

Проблема «битых» ссылок в поле «Родитель»

Выясним еще одну неочевидную причину: почему папка в дочерней базе появилась, но она пустая? Это происходит, если элементы (товары) были зарегистрированы и переданы раньше, чем их папка-родитель.

Проанализируем ситуацию в базе-приемнике с помощью консоли запросов:


ВЫБРАТЬ
    Номенклатура.Ссылка,
    Номенклатура.Наименование
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ГДЕ
    Номенклатура.Родитель.Наименование ЕСТЬ NULL
    И НЕ Номенклатура.Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)

Если этот запрос возвращает данные, значит, у элементов в поле Родитель записана «битая ссылка» (Объект не найден). 1С не может отобразить такой элемент в иерархии, так как не знает, к какому узлу дерева его привязать.

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

Резюме

Для исправления проблемы с переносом папок в РИБ следует придерживаться следующего плана:

  1. Убедиться, что папки действительно отсутствуют в базе (через режим просмотра «Список»), а не просто скрыты из-за отсутствия иерархии.
  2. Проверить состав плана обмена и наличие кода в процедурах ПриОтправкеДанных.
  3. Выполнить принудительную регистрацию папок справочников через обработку «Регистрация изменений».
  4. При необходимости использовать программный перебор элементов для регистрации всей структуры иерархии.

Помните, что в РИБ порядок регистрации имеет значение: папки-родители должны существовать в базе-приемнике, чтобы элементы внутри них заняли свои места в структуре каталогов.

← На главную