Почему вылетает ошибка при использовании аннотации &Вместо в расширении 1С и как её исправить?

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

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

Рассмотрим типовой пример возникновения ошибки компиляции при попытке переопределить метод формы в расширении:


&Вместо("СформироватьКадровуюИсторию")
Процедура Расш_СформироватьКадровуюИсторию()
    // Логика переопределения метода
    ПродолжитьВызов();
КонецПроцедуры

При проверке модуля или попытке запуска конфигурации платформа выдает диагностическое сообщение: {Расширение ...}: Ожидается определение процедуры/функции &Вместо... (Проверка: Сервер). Проанализируем, почему это происходит.

Причина 1: Несовпадение режима совместимости конфигурации и расширения

Аннотации перехвата методов (&Вместо, &Перед, &После) и оператор ПродолжитьВызов() поддерживаются платформой, начиная с версии 8.3.9, но их синтаксический анализ напрямую зависит от установленного режима совместимости.

Если в свойствах основной конфигурации или самого расширения включен режим совместимости с версиями платформы ниже 8.3.9 (например, 8.3.8 или 8.3.6), компилятор платформы блокирует новый синтаксис и сообщает об ошибке.

Разберем порядок настройки режима совместимости:

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

Правила перехвата методов с помощью аннотаций

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

  1. Директивы компиляции: Директива выполнения в расширяющем методе (&НаКлиенте, &НаСервере, &НаСервереБезКонтекста) должна строго совпадать с директивой перехватываемого метода в базовой конфигурации.
  2. Сигнатура параметров: Количество параметров, их порядок и признак передачи по значению (Знач) должны точно соответствовать оригинальному методу.
  3. Вызов базового кода: Внутри тела метода с аннотацией &Вместо для передачи управления оригинальному алгоритму необходимо вызывать метод ПродолжитьВызов(...) с передачей всех обязательных параметров.

Причина 2: Ошибка блокировки метаданных при запуске (ИдентификаторыОбъектовМетаданных)

После отключения режима совместимости нередко возникает следующая ошибка при старте сеанса 1С:Предприятия:


{Справочник.ИдентификаторыОбъектовМетаданных.МодульМенеджера}: Ошибка при получении значения атрибута контекста (АдресСвойствРасширений)
СвойстваРасширений = ПолучитьИзВременногоХранилища(ПараметрыСеанса.АдресСвойствРасширений);
по причине:
При выполнении операции над расширением возникла ошибка: Не удалось заблокировать запись... Объект уже заблокирован... приложение: Конфигуратор

Выясним причину такого поведения. При старте сеанса механизмы Библиотеки стандартных подсистем (БСП) выполняют регистрацию и актуализацию объектов расширений в служебных справочниках ИдентификаторыОбъектовМетаданных и ИдентификаторыОбъектовРасширений. Если в Конфигураторе открыто само расширение, его объекты или дерево метаданных, Конфигуратор удерживает монопольную блокировку. При попытке сеанса предприятия зафиксировать изменения возникает конфликт блокировок.

Способы устранения конфликтов блокировки при отладке

Рассмотрим, как корректно организовать работу с расширением во время отладки:

  1. Закрытие окон расширения: Закроем все открытые окна метаданных, модулей и форм расширения в Конфигураторе перед запуском отладочного сеанса в режиме 1С:Предприятие. При необходимости полностью перезапустим сеанс Конфигуратора.
  2. Указание номера версии расширения: В свойствах расширения обязательно заполним поле Версия (например, 1.0.0.1). Если поле версии остается пустым, БСП расценивает расширение как изменяемое при каждом запуске и непрерывно пытается перезаписать кэш служебных данных.
  3. Корректная передача параметров запуска: В настройках запуска (меню Сервис — Параметры — Запуск 1С:Предприятия — Основные) в поле Параметры запуска строку следует указывать как РежимОтладки или ЗапуститьОбновлениеИнформационнойБазы. Ключ /C туда писать не нужно, так как платформа подставляет его автоматически. Указание строки /C РежимОтладки приводит к передаче некорректной команды /C /C РежимОтладки, из-за чего параметр игнорируется.
  4. Завершение фоновых заданий: В клиент-серверном варианте информационной базы проверим через консоль кластера серверов 1С отсутствие зависших сеансов разработчика и фоновых заданий, блокирующих таблицы метаданных.
← На главную