Как удалить узел плана обмена в базе 1С после отключения РИБ

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

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

Почему возникает ошибка «Действие недоступно для выбранного узла»

Проанализируем архитектуру планов обмена в платформе 1С:Предприятие. В каждом плане обмена всегда существует ровно один специальный узел — «ЭтотУзел», который сопоставляется с текущей информационной базой. В интерфейсе он обычно выделяется специальной пиктограммой (монитор или зеленый кружок).

Платформа на системном уровне блокирует удаление и интерактивную пометку на удаление узла, у которого реквизит ЭтотУзел установлен в значение Истина. При создании дочернего узла РИБ в сформированной базе именно этот дочерний узел автоматически становится «Этим узлом». Даже после выполнения команды отключения главного узла признак текущего узла сохраняется за ним:

ПланыОбмена.УстановитьГлавныйУзел(Неопределено);

Снятие признака подчиненности базы делает ее автономной, но не убирает обязательное системное требование: в плане обмена информационная база обязана иметь один текущий узел.

Способ 1. Корректная очистка и переименование узлов без удаления плана обмена

Рассмотрим стандартный и безопасный подход, не требующий модификации структуры метаданных и исключающий появление битых ссылок.

  1. Отключение главного узла: программно снимем подчиненность базы с помощью метода ПланыОбмена.УстановитьГлавныйУзел(Неопределено).
  2. Очистка регистрации изменений: перед любыми операциями с узлами необходимо полностью удалить очередь зарегистрированных изменений для предотвращения разрастания служебных таблиц: ПланыОбмена.УдалитьРегистрациюИзменений(УзелДляУдаления);
  3. Удаление узла центральной базы: узел бывшей центральной базы не является «Этим узлом» для текущей базы. Если на него отсутствуют ссылки в объектах конфигурации (проверяется через стандартный поиск ссылок на объект), его можно удалить стандартным способом — интерактивно или программно через вызов ПолучитьОбъект().Удалить().
  4. Оформление оставшегося текущего узла: поскольку текущий узел удалить невозможно, приведем его к виду обычной локальной базы. Переименуем наименование (например, в «Основной» или название текущей организации) и установим стандартный код (например, «001» или «ГЛ»).

Способ 2. Программное переназначение признака «ЭтотУзел»

Если требуется удалить именно тот узел, который сейчас помечен как текущий, признак ЭтотУзел необходимо предварительно перенести на другой элемент. Напрямую изменить это свойство нельзя, так как оно доступно только для чтения. Однако платформа позволяет сделать это при записи объекта в режиме обмена данными.

Посмотрим на пример программного переключения текущего узла:


// Снимаем признак с текущего узла
ТекущийУзелОбъект = ПланыОбмена.ПоОрганизации.ЭтотУзел().ПолучитьОбъект();
ТекущийУзелОбъект.ОбменДанными.Загрузка = Истина;
ТекущийУзелОбъект.ЭтотУзел = Ложь;
ТекущийУзелОбъект.Записать();

// Назначаем признак другому узлу
НовыйУзелОбъект = СсылкаНаНовыйУзел.ПолучитьОбъект();
НовыйУзелОбъект.ОбменДанными.Загрузка = Истина;
НовыйУзелОбъект.ЭтотУзел = Истина;
НовыйУзелОбъект.Записать();

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

Способ 3. Удаление плана обмена через конфигуратор с последующим восстановлением

Разберем радикальный способ, когда план обмена удаляется из состава метаданных конфигурации, а затем возвращается путем наката файла конфигурации (.cf).

  1. В конфигураторе удалим план обмена и применим изменения в структуре базы данных. Все данные таблиц этого плана обмена будут полностью очищены на уровне СУБД.
  2. Загрузим или объединим конфигурацию с эталонным файлом .cf, содержащим исходный план обмена, и применим изменения.

Важные последствия данного метода:

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

Дополнительная очистка следов разделения базы

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

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