Как исправить ошибку «Не заполнен код узла» в 1С:Предприятие

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

При переносе информационных баз 1С:Предприятие на новый сервер, переустановке операционной системы Windows или аварийном завершении работы СУБД администраторы и пользователи часто сталкиваются со следующей системной ошибкой: «Ошибка при обновлении структуры информационных баз: Не заполнен код узла <>. Возможно, код узла был ошибочно очищен. Необходимо присвоить код узлу вручную». Данная неполадка полностью блокирует запуск программы в пользовательском режиме или препятствует корректному обновлению конфигурации.

В этой статье мы подробно проанализируем ситуацию, выясним технические причины возникновения этой ошибки и разберем по шагам все возможные способы её устранения — от простых интерактивных методов до программного восстановления кода узла с помощью встроенного языка 1С.

Почему возникает ошибка и что такое «Этот узел»

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

В каждом плане обмена всегда присутствует как минимум один элемент, который создается платформой автоматически. Этот элемент называется «Этот узел». Он является предопределенным и идентифицирует текущую базу данных в структуре обмена. Для корректной работы платформы у каждого узла (включая собственный) должен быть заполнен уникальный текстовый реквизит Код (например, «ЦБ» — центральная база, «Ф1» — филиал 1, «АА» — Альфа-Авто).

Если в процессе администрирования, очистки кэша, некорректного обновления или сбоя СУБД значение в поле Код для предопределенного элемента «Этот узел» в каком-либо плане обмена очищается или сбрасывается, платформа теряет возможность идентифицировать текущую базу. При попытке обновления конфигурации или при старте системы код инициализации проверяет заполненность этого реквизита и, обнаружив пустоту, аварийно завершает работу с выводом вышеупомянутого сообщения.


Способ 1. Интерактивное исправление через «Все функции»

Рассмотрим самый простой и быстрый способ решения проблемы, который доступен пользователям с правами «Администратор» непосредственно в режиме «1С:Предприятие».

Для начала нам необходимо открыть список всех доступных планов обмена в системе. Выполним следующие шаги:

  1. В главном меню программы (или через системное меню в правом верхнем углу) найдем пункт «Все функции...». Обратите внимание, что в современных версиях платформы 1С:Предприятие 8.3 этот пункт может называться «Функции для технического специалиста...». Если этот пункт меню у вас отсутствует, его необходимо включить в настройках параметров системы (меню «Настройки» — «Параметры» — установить флажок «Отображать команду "Все функции"»).
  2. В открывшемся окне перед нами появится дерево объектов метаданных конфигурации. Развернем ветку «Планы обмена».
  3. Мы увидим список всех планов обмена, которые заложены разработчиками в конфигурацию. Нам необходимо поочередно проверить каждый из них. Открываем первый план обмена двойным щелчком мыши.
  4. В открывшейся форме списка обратим внимание на элементы. Нам нужно найти узел, который выделен жирным шрифтом или отмечен специальной пиктограммой с изображением компьютера (зеленый монитор). Это и есть элемент «Этот узел».
  5. Проанализируем колонку Код. Если у жирного элемента «Этот узел» колонка Код пустая, мы нашли корень проблемы.
  6. Попробуем открыть карточку этого узла двойным кликом и ввести в поле «Код» текстовое значение. Если база ранее участвовала в обменах, крайне важно вспомнить и указать именно тот код, который был записан там изначально (например, «АА» или «001»). Если обменов никогда не было и база работает автономно, вы можете ввести любое произвольное значение, например, 001 или ГЛ.
  7. Нажмем кнопку «Записать и закрыть». После этого перезапустим базу для проверки.

Способ 2. Обход блокировки изменения реквизитов

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

Вариант А. Разрешение редактирования реквизитов формы

В карточке открытого узла плана обмена обратимся к командной панели формы:

  1. Нажмем кнопку «Еще» в правом верхнем углу формы элемента.
  2. В выпадающем меню поищем пункт «Разрешить редактирование реквизитов».
  3. Если система выдаст предупреждение о том, что изменение ключевых реквизитов может нарушить работу системы, подтвердим свое намерение изменить данные.
  4. После этого поле Код станет доступным для ввода. Заполним его необходимым значением и запишем элемент.

Вариант Б. Использование группового изменения реквизитов

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

  1. Снова перейдем в меню «Все функции» (или «Функции для технического специалиста»).
  2. Развернем ветку «Обработки» и найдем там стандартную обработку «Групповое изменение реквизитов». Запустим её.
  3. В поле «Выбирать элементы в списке» укажем наш проблемный План обмена (например, ПланОбмена.Полный или ПланОбмена.ОбменАльфаАвтоБухгалтерия).
  4. Нажмем на ссылку «Все элементы» рядом с выбором объекта, чтобы настроить отбор. Нам ни в коем случае нельзя менять коды у всех узлов подряд! Настроим отбор: добавим новое условие Ссылка Равно [Имя нашего предопределенного узла] или выберем условие по признаку ЭтотУзел Равно Да.
  5. В основной таблице обработки найдем строку с реквизитом Код.
  6. Установим напротив нее флажок для изменения, а в колонке «Новое значение» введем нужный код (например, ЦБ).
  7. Нажмем кнопку «Изменить параметры» внизу окна обработки. Система запишет новое значение кода непосредственно в базу данных в обход стандартных блокировок формы.

Способ 3. Программное заполнение кода узла через встроенный язык

Если база данных не запускается в обычном режиме предприятия, а запустить обработку «Групповое изменение реквизитов» не представляется возможным, мы можем решить задачу программным путем. Для этого нам понадобится запустить базу в режиме «Конфигуратор» или использовать внешнюю консоль кода.

Рассмотрим пример кода, который выполняет поиск пустого кода «Этого узла» во всех планах обмена конфигурации и автоматически заполняет его значением по умолчанию. Мы можем вставить этот код во внешнюю обработку или выполнить в контексте отладки:


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

Проанализируем приведенный алгоритм. С помощью глобальной коллекции Метаданные.ПланыОбмена мы перебираем все доступные в системе планы синхронизации. Метод ПланыОбмена[ИмяПланаОбмена].ЭтотУзел() возвращает ссылку на предопределенный элемент текущей базы. Если его код оказывается пустым, мы преобразуем ссылку в объект через метод ПолучитьОбъект(), присваиваем строковое значение свойству Код и записываем изменения с флагом ОбменДанными.Загрузка = Истина, что позволяет обойти жесткие прикладные проверки в модуле объекта при записи.


Важные рекомендации при работе с распределенными базами (РИБ)

Если ваша база данных является частью распределенной информационной системы (например, это один из магазинов в розничной сети или филиал автосалона в Альфа-Авто), категорически не рекомендуется указывать случайный код узла.

В распределенных базах данных соответствие планов обмена жестко привязано к кодам узлов-отправителей и узлов-получателей. Если вы укажете неверный код вместо ранее существовавшего, при первой же попытке синхронизации вы получите ошибку несоответствия узлов, и обмен файлами или EnterpriseData заблокируется. В таком случае постарайтесь узнать корректный исторический код узла вашей базы у администратора центрального узла или посмотрите настройки обмена в центральной базе данных, где ваша периферийная база зарегистрирована под своим оригинальным кодом.

Выполнив один из предложенных методов и перезапустив программу, мы успешно решим проблему очищенного кода узла, и обновление структуры информационной базы 1С:Предприятие завершится в штатном режиме.

← На главную