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