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