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