Механизм расширений конфигурации в платформе 1С:Предприятие 8.3 позволяет дорабатывать типовые конфигурации без снятия их с поддержки. Однако при разработке и перехвате существующих методов с помощью аннотаций &Вместо, &Перед и &После разработчики часто сталкиваются с ошибками компиляции синтаксиса и проблемами блокировки метаданных при запуске базы. Разберем по шагам причины этих ошибок и способы их устранения.
Рассмотрим типовой пример возникновения ошибки компиляции при попытке переопределить метод формы в расширении:
&Вместо("СформироватьКадровуюИсторию")
Процедура Расш_СформироватьКадровуюИсторию()
// Логика переопределения метода
ПродолжитьВызов();
КонецПроцедуры
При проверке модуля или попытке запуска конфигурации платформа выдает диагностическое сообщение: {Расширение ...}: Ожидается определение процедуры/функции &Вместо... (Проверка: Сервер). Проанализируем, почему это происходит.
Аннотации перехвата методов (&Вместо, &Перед, &После) и оператор ПродолжитьВызов() поддерживаются платформой, начиная с версии 8.3.9, но их синтаксический анализ напрямую зависит от установленного режима совместимости.
Если в свойствах основной конфигурации или самого расширения включен режим совместимости с версиями платформы ниже 8.3.9 (например, 8.3.8 или 8.3.6), компилятор платформы блокирует новый синтаксис и сообщает об ошибке.
Разберем порядок настройки режима совместимости:
Чтобы избежать других скрытых ошибок при переопределении процедур и функций в расширениях, обратим внимание на обязательные требования платформы к сигнатурам методов:
&НаКлиенте, &НаСервере, &НаСервереБезКонтекста) должна строго совпадать с директивой перехватываемого метода в базовой конфигурации.Знач) должны точно соответствовать оригинальному методу.&Вместо для передачи управления оригинальному алгоритму необходимо вызывать метод ПродолжитьВызов(...) с передачей всех обязательных параметров.После отключения режима совместимости нередко возникает следующая ошибка при старте сеанса 1С:Предприятия:
{Справочник.ИдентификаторыОбъектовМетаданных.МодульМенеджера}: Ошибка при получении значения атрибута контекста (АдресСвойствРасширений)
СвойстваРасширений = ПолучитьИзВременногоХранилища(ПараметрыСеанса.АдресСвойствРасширений);
по причине:
При выполнении операции над расширением возникла ошибка: Не удалось заблокировать запись... Объект уже заблокирован... приложение: Конфигуратор
Выясним причину такого поведения. При старте сеанса механизмы Библиотеки стандартных подсистем (БСП) выполняют регистрацию и актуализацию объектов расширений в служебных справочниках ИдентификаторыОбъектовМетаданных и ИдентификаторыОбъектовРасширений. Если в Конфигураторе открыто само расширение, его объекты или дерево метаданных, Конфигуратор удерживает монопольную блокировку. При попытке сеанса предприятия зафиксировать изменения возникает конфликт блокировок.
Рассмотрим, как корректно организовать работу с расширением во время отладки:
1.0.0.1). Если поле версии остается пустым, БСП расценивает расширение как изменяемое при каждом запуске и непрерывно пытается перезаписать кэш служебных данных.РежимОтладки или ЗапуститьОбновлениеИнформационнойБазы. Ключ /C туда писать не нужно, так как платформа подставляет его автоматически. Указание строки /C РежимОтладки приводит к передаче некорректной команды /C /C РежимОтладки, из-за чего параметр игнорируется.