Как исправить ошибки применения расширения 1С при переименовании справочников в ERP

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

Обновление крупных типовых конфигураций, таких как 1С:ERP Управление предприятием, часто преподносит сюрпризы технического характера. Одной из наиболее острых проблем является нарушение работоспособности расширений из-за изменения структуры метаданных в основной конфигурации. Типичный пример — переименование справочника НоменклатураПоставщика, которое приводит к тому, что расширение перестает «видеть» объект, хотя визуально в конфигураторе всё может выглядеть корректно. Разберем детально, как восстановить работу системы и правильно перепривязать объекты.

Анализ причины возникновения ошибки

Когда разработчики фирмы «1С» выпускают обновление ERP, они могут не просто изменить синоним справочника, но и переименовать само Имя объекта в метаданных. Расширение привязано к объектам основной конфигурации по двум ключевым параметрам: Имени и внутреннему идентификатору (UUID). Если при обновлении произошла замена объекта (удаление старого и создание нового с аналогичным смыслом), старые заимствованные ссылки в расширении становятся недействительными.

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

Шаг 1: Принудительный вызов окна исправления ошибок

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

  1. Откроем список расширений через меню Конфигурация — Расширения конфигурации.
  2. Выделим проблемное расширение в списке.
  3. Нажмем правую кнопку мыши и выберем пункт Проверка возможности применения.

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

Шаг 2: Обновление заимствованных объектов

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

  1. Найдем справочник в дереве расширения (он будет помечен серым значком заимствования).
  2. Нажмем на нем правой кнопкой мыши и выберем команду Обновить заимствованный объект.
  3. Если справочник был переименован в основной конфигурации, платформа предложит найти его по новому имени или UUID.

Важный момент: если код внутри расширения (в модулях объектов или форм) обращается к справочнику по старому имени НоменклатураПоставщика, а в новой версии ERP он называется, к примеру, НоменклатураКонтрагента, нам придется выполнить глобальный поиск и замену имени во всем расширении.

Шаг 3: Синхронизация режима совместимости

При обновлении ERP часто меняется требуемая версия платформы и режим совместимости. Выясним причину конфликта версий. Если в основной конфигурации установлен режим совместимости 8.3.14, а в расширении осталось значение 8.3.12, механизмы заимствования (особенно аннотации &ИзменениеИКонтроль) могут работать непредсказуемо.

Убедимся, что свойства расширения соответствуют основной конфигурации. Для этого зайдем в свойства расширения (правой кнопкой на корне расширения — Свойства) и установим значение поля Режим совместимости в точном соответствии с основной конфигурацией. Также рекомендуется изменить номер Версии расширения (например, с 1.0.1 на 1.0.2) — это заставит платформу инициировать процедуру перекомпиляции кэша при следующем запуске.

Шаг 4: Очистка серверного кэша расширений

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

Кэш расширений на сервере хранится в специализированных папках. Нам необходимо:

  1. Остановить службу Агент сервера 1С:Предприятия. Это критически важно, так как при работающей службе файлы заблокированы или могут быть перезаписаны из памяти.
  2. Перейти в каталог с данными сервера (по умолчанию это C:\Program Files\1cv8\srvinfo\reg_1541\).
  3. Найти все подпапки с именем snccntx. Именно в них 1С хранит скомпилированные контексты расширений.
  4. Удалить содержимое этих папок.
  5. Запустить службу сервера.

Шаг 5: Использование инструментов технической поддержки

Чтобы точно понять, почему справочник «не виден» в коде, воспользуемся встроенным механизмом диагностики. Запустим 1С в режиме «Предприятие», перейдем в меню Справка — О программе — Информация для технической поддержки.

В сформированном тексте найдем блок, посвященный расширениям конфигурации. Там будет указано состояние каждого расширения. Если объект не загружен, платформа напишет конкретную причину, например: Ошибка заимствования: объект Справочник.НоменклатураПоставщика не найден в основной конфигурации. Это поможет локализовать проблему, если заимствование произошло через программный код.

Пример исправления обращения к справочнику в коде

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


&НаСервере
Процедура ПолучитьДанныеПоставщика()
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   НоменклатураПоставщика.Наименование КАК Название
        |ИЗ
        |   Справочник.НоменклатураПоставщика КАК НоменклатураПоставщика";
    // ... дальнейшая логика
КонецПроцедуры

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


&НаСервере
Процедура ПолучитьДанныеПоставщикаОбновленная()
    // Убедимся, что мы используем актуальное имя типа
    ИмяСправочника = "НоменклатураКонтрагента"; // Допустим, теперь имя такое
    Запрос = Новый Запрос;
    Запрос.Текст = СтрШаблон(
        "ВЫБРАТЬ
        |   Т.Наименование КАК Название
        |ИЗ
        |   Справочник.%1 КАК Т", ИмяСправочника);
    // ...
КонецПроцедуры

Резюме по решению проблемы

Для исправления ситуации в рабочей базе без отката на бэкап, выполним последовательность действий: актуализация заимствованного объекта в конфигураторе -> синхронизация режима совместимости -> инкремент версии расширения -> полная остановка сервера и очистка папок snccntx. Это гарантирует, что платформа подтянет обновленные метаданные и корректно свяжет их с переименованным справочником в ERP.

← На главную