При переносе информационных баз 1С:Предприятие на новый сервер, переустановке операционной системы Windows или аварийном завершении работы СУБД администраторы и пользователи часто сталкиваются со следующей системной ошибкой: «Ошибка при обновлении структуры информационных баз: Не заполнен код узла <>. Возможно, код узла был ошибочно очищен. Необходимо присвоить код узлу вручную». Данная неполадка полностью блокирует запуск программы в пользовательском режиме или препятствует корректному обновлению конфигурации.
В этой статье мы подробно проанализируем ситуацию, выясним технические причины возникновения этой ошибки и разберем по шагам все возможные способы её устранения — от простых интерактивных методов до программного восстановления кода узла с помощью встроенного языка 1С.
Для понимания сути проблемы рассмотрим внутреннее устройство механизмов обмена данными в платформе 1С:Предприятие 8.3. В любой конфигурации (будь то специализированная «Альфа-Авто» или типовая «Бухгалтерия предприятия») существуют объекты метаданных, которые называются Планы обмена. Они отвечают за регистрацию изменений объектов (справочников, документов, регистров) для последующей синхронизации с другими информационными системами или распределенными базами данных (РИБ).
В каждом плане обмена всегда присутствует как минимум один элемент, который создается платформой автоматически. Этот элемент называется «Этот узел». Он является предопределенным и идентифицирует текущую базу данных в структуре обмена. Для корректной работы платформы у каждого узла (включая собственный) должен быть заполнен уникальный текстовый реквизит Код (например, «ЦБ» — центральная база, «Ф1» — филиал 1, «АА» — Альфа-Авто).
Если в процессе администрирования, очистки кэша, некорректного обновления или сбоя СУБД значение в поле Код для предопределенного элемента «Этот узел» в каком-либо плане обмена очищается или сбрасывается, платформа теряет возможность идентифицировать текущую базу. При попытке обновления конфигурации или при старте системы код инициализации проверяет заполненность этого реквизита и, обнаружив пустоту, аварийно завершает работу с выводом вышеупомянутого сообщения.
Рассмотрим самый простой и быстрый способ решения проблемы, который доступен пользователям с правами «Администратор» непосредственно в режиме «1С:Предприятие».
Для начала нам необходимо открыть список всех доступных планов обмена в системе. Выполним следующие шаги:
Код. Если у жирного элемента «Этот узел» колонка Код пустая, мы нашли корень проблемы.001 или ГЛ.Часто при выполнении Способа 1 пользователи сталкиваются с тем, что поле Код в карточке предопределенного узла заблокировано платформой для редактирования (отображается серым цветом, и ввести туда символы невозможно). Это стандартная защита конфигураций на управляемых формах. Рассмотрим, как обойти это ограничение.
В карточке открытого узла плана обмена обратимся к командной панели формы:
Код станет доступным для ввода. Заполним его необходимым значением и запишем элемент.Если кнопка разрешения редактирования отсутствует или недоступна, мы можем воспользоваться стандартной сервисной обработкой изменения данных. Выполним следующие действия по шагам:
ПланОбмена.Полный или ПланОбмена.ОбменАльфаАвтоБухгалтерия).Ссылка Равно [Имя нашего предопределенного узла] или выберем условие по признаку ЭтотУзел Равно Да.Код.ЦБ).Если база данных не запускается в обычном режиме предприятия, а запустить обработку «Групповое изменение реквизитов» не представляется возможным, мы можем решить задачу программным путем. Для этого нам понадобится запустить базу в режиме «Конфигуратор» или использовать внешнюю консоль кода.
Рассмотрим пример кода, который выполняет поиск пустого кода «Этого узла» во всех планах обмена конфигурации и автоматически заполняет его значением по умолчанию. Мы можем вставить этот код во внешнюю обработку или выполнить в контексте отладки:
// Программный обход всех планов обмена конфигурации для заполнения пустого кода узла
Для Каждого ПланОбменаМетаданные Из Метаданные.ПланыОбмена Цикл
ИмяПланаОбмена = ПланОбменаМетаданные.Имя;
// Получаем ссылку на предопределенный узел "Этот узел"
ЭтотУзелСсылка = ПланыОбмена[ИмяПланаОбмена].ЭтотУзел();
Если ЗначениеЗаполнено(ЭтотУзелСсылка) Тогда
// Получаем объект для возможности редактирования реквизитов
ЭтотУзелОбъект = ЭтотУзелСсылка.ПолучитьОбъект();
// Проверяем, пустой ли код у данного узла
Если ПустаяСтрока(ЭтотУзелОбъект.Код) Тогда
// Присваиваем временный уникальный код для восстановления работоспособности базы
ЭтотУзелОбъект.Код = "ВСТ";
Попытка
// Отключаем платформенные проверки при записи, если это необходимо
ЭтотУзелОбъект.ОбменДанными.Загрузка = Истина;
ЭтотУзелОбъект.Записать();
Сообщить("Успешно заполнен код для плана обмена: " + ИмяПланаОбмена);
Исключение
Сообщить("Не удалось записать узел для плана: " + ИмяПланаОбмена + ". Ошибка: " + ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Проанализируем приведенный алгоритм. С помощью глобальной коллекции Метаданные.ПланыОбмена мы перебираем все доступные в системе планы синхронизации. Метод ПланыОбмена[ИмяПланаОбмена].ЭтотУзел() возвращает ссылку на предопределенный элемент текущей базы. Если его код оказывается пустым, мы преобразуем ссылку в объект через метод ПолучитьОбъект(), присваиваем строковое значение свойству Код и записываем изменения с флагом ОбменДанными.Загрузка = Истина, что позволяет обойти жесткие прикладные проверки в модуле объекта при записи.
Если ваша база данных является частью распределенной информационной системы (например, это один из магазинов в розничной сети или филиал автосалона в Альфа-Авто), категорически не рекомендуется указывать случайный код узла.
В распределенных базах данных соответствие планов обмена жестко привязано к кодам узлов-отправителей и узлов-получателей. Если вы укажете неверный код вместо ранее существовавшего, при первой же попытке синхронизации вы получите ошибку несоответствия узлов, и обмен файлами или EnterpriseData заблокируется. В таком случае постарайтесь узнать корректный исторический код узла вашей базы у администратора центрального узла или посмотрите настройки обмена в центральной базе данных, где ваша периферийная база зарегистрирована под своим оригинальным кодом.
Выполнив один из предложенных методов и перезапустив программу, мы успешно решим проблему очищенного кода узла, и обновление структуры информационной базы 1С:Предприятие завершится в штатном режиме.