Обновление крупных типовых конфигураций, таких как 1С:ERP Управление предприятием, часто преподносит сюрпризы технического характера. Одной из наиболее острых проблем является нарушение работоспособности расширений из-за изменения структуры метаданных в основной конфигурации. Типичный пример — переименование справочника НоменклатураПоставщика, которое приводит к тому, что расширение перестает «видеть» объект, хотя визуально в конфигураторе всё может выглядеть корректно. Разберем детально, как восстановить работу системы и правильно перепривязать объекты.
Когда разработчики фирмы «1С» выпускают обновление ERP, они могут не просто изменить синоним справочника, но и переименовать само Имя объекта в метаданных. Расширение привязано к объектам основной конфигурации по двум ключевым параметрам: Имени и внутреннему идентификатору (UUID). Если при обновлении произошла замена объекта (удаление старого и создание нового с аналогичным смыслом), старые заимствованные ссылки в расширении становятся недействительными.
Рассмотрим ситуацию, когда в тестовой базе ошибки исправлены, а в рабочей — расширение по-прежнему выдает ошибку применения. Это может быть связано с тем, что конфигурация базы данных не синхронизирована с расширением или «завис» серверный кэш компиляции.
Часто программисту требуется вызвать системный диалог исправления ошибок заимствования, который обычно появляется только при первом запуске после обновления. Чтобы сделать это вручную в конфигураторе, проделаем следующие действия:
Если платформа обнаружит расхождения (например, отсутствие справочника НоменклатураПоставщика под старым именем), она выведет список конфликтов. В этом окне можно будет переназначить соответствие между объектом расширения и объектом основной конфигурации.
Если автоматическая проверка не помогла, нам необходимо вручную обновить метаданные заимствованного справочника. Проанализируем состояние объекта в дереве метаданных расширения:
Важный момент: если код внутри расширения (в модулях объектов или форм) обращается к справочнику по старому имени НоменклатураПоставщика, а в новой версии ERP он называется, к примеру, НоменклатураКонтрагента, нам придется выполнить глобальный поиск и замену имени во всем расширении.
При обновлении ERP часто меняется требуемая версия платформы и режим совместимости. Выясним причину конфликта версий. Если в основной конфигурации установлен режим совместимости 8.3.14, а в расширении осталось значение 8.3.12, механизмы заимствования (особенно аннотации &ИзменениеИКонтроль) могут работать непредсказуемо.
Убедимся, что свойства расширения соответствуют основной конфигурации. Для этого зайдем в свойства расширения (правой кнопкой на корне расширения — Свойства) и установим значение поля Режим совместимости в точном соответствии с основной конфигурацией. Также рекомендуется изменить номер Версии расширения (например, с 1.0.1 на 1.0.2) — это заставит платформу инициировать процедуру перекомпиляции кэша при следующем запуске.
Если в конфигураторе всё исправлено и проверка проходит успешно, но в режиме «Предприятие» в рабочей базе ошибка сохраняется, проблема кроется в серверном кэше. Рассмотрим, как правильно его очистить, чтобы не повредить другие данные.
Кэш расширений на сервере хранится в специализированных папках. Нам необходимо:
C:\Program Files\1cv8\srvinfo\reg_1541\).Чтобы точно понять, почему справочник «не виден» в коде, воспользуемся встроенным механизмом диагностики. Запустим 1С в режиме «Предприятие», перейдем в меню Справка — О программе — Информация для технической поддержки.
В сформированном тексте найдем блок, посвященный расширениям конфигурации. Там будет указано состояние каждого расширения. Если объект не загружен, платформа напишет конкретную причину, например: Ошибка заимствования: объект Справочник.НоменклатураПоставщика не найден в основной конфигурации. Это поможет локализовать проблему, если заимствование произошло через программный код.
Если после переименования объекта ваш код перестал работать, проанализируем ситуацию на примере вызова метода получения данных. Допустим, раньше код выглядел так:
&НаСервере
Процедура ПолучитьДанныеПоставщика()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| НоменклатураПоставщика.Наименование КАК Название
|ИЗ
| Справочник.НоменклатураПоставщика КАК НоменклатураПоставщика";
// ... дальнейшая логика
КонецПроцедуры
После обновления и переименования справочника, нам необходимо не только обновить объект в дереве метаданных, но и поправить текст запроса. Если мы используем расширение, лучше всего использовать новые возможности платформы для гибкой работы с именами:
&НаСервере
Процедура ПолучитьДанныеПоставщикаОбновленная()
// Убедимся, что мы используем актуальное имя типа
ИмяСправочника = "НоменклатураКонтрагента"; // Допустим, теперь имя такое
Запрос = Новый Запрос;
Запрос.Текст = СтрШаблон(
"ВЫБРАТЬ
| Т.Наименование КАК Название
|ИЗ
| Справочник.%1 КАК Т", ИмяСправочника);
// ...
КонецПроцедуры
Для исправления ситуации в рабочей базе без отката на бэкап, выполним последовательность действий: актуализация заимствованного объекта в конфигураторе -> синхронизация режима совместимости -> инкремент версии расширения -> полная остановка сервера и очистка папок snccntx. Это гарантирует, что платформа подтянет обновленные метаданные и корректно свяжет их с переименованным справочником в ERP.