Как исправить ошибку «Тип не определен (ОписаниеОповещения)» в расширении конфигурации 1С?

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

При переносе кода и доработке типовой логики с помощью механизма расширений разработчики часто сталкиваются с ошибками компиляции. Одна из наиболее распространенных ситуаций — возникновение ошибки «Тип не определен (ОписаниеОповещения)» при проверке серверного контекста. Разберем детально, почему возникает данная ошибка, как правильно совмещать директивы компиляции с аннотациями расширений, а также рассмотрим особенности работы с параметрами переопределяемых методов и элементами форм.

Причина ошибки «Тип не определен (ОписаниеОповещения)»

Проанализируем контекст выполнения кода в платформе 1С:Предприятие 8.3. Объект ОписаниеОповещения является исключительно клиентским типом. Он предназначен для организации асинхронных вызовов в интерфейсе и доступен только на стороне тонкого, толстого, мобильного и веб-клиента. На сервере данный тип платформе неизвестен.

Когда мы объявляем процедуру в модуле формы расширения с помощью аннотации &Вместо, но забываем указать директиву контекста выполнения, платформа по умолчанию пытается скомпилировать метод для сервера. В результате при создании объекта через Новый ОписаниеОповещения(...) синтаксический контроль выдает ошибку вида (Проверка: Сервер) Тип не определен (ОписаниеОповещения).

Правильное объявление директив и аннотаций в расширении

Для исправления ошибки выясним, как правильно оформлять заголовок метода в расширении. Если исходная процедура в основной конфигурации выполняется на клиенте (помечена директивой &НаКлиенте), то в модуле расширения необходимо обязательно указывать обе директивы — контекстную директиву компиляции и аннотацию перехвата вызова.

Посмотрим на пример корректного объявления переопределяемой процедуры:


&НаКлиенте
&Вместо("ДобавитьТоварВКорзину")
Процедура Расш1_ДобавитьТоварВКорзину(ПараметрыТовара)
    
    // Создаем клиентское описание оповещения без ошибок
    Оповещение = Новый ОписаниеОповещения("ДобавитьВКорзинуПослеВыбораКоличества", ЭтотОбъект, ПараметрыТовара);
    
    // Вызов асинхронной процедуры открытия формы или диалога
    ОткрытьФорму("Обработка.Подбор.Форма.ВводКоличества", , ЭтотОбъект, , , , Оповещение);
    
КонецПроцедуры

Если код с ОписаниеОповещения переносится в общий модуль расширения, обратим внимание на свойства самого общего модуля: флаг Клиент (управляемое приложение) должен быть включен, а флаг Сервер — отключен, либо соответствующий блок кода должен быть обрамлен инструкцией препроцессора #Если Клиент Тогда ... #КонецЕсли.

Ограничения на изменение параметров в процедурах с аннотацией &Вместо

Рассмотрим еще одну распространенную проблему: попытку добавить новые параметры в метод при переопределении через &Вместо. Например, исходный метод принимает два параметра Проц(Парам1, Парам2), а в расширении объявляется Расш1_Проц(Парам1, Парам2, Парам3).

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

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

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

Поведение захваченных элементов формы при обновлении конфигурации

Проанализируем ситуацию, когда в основной конфигурации на форме создается элемент (например, группа формы), затем он захватывается в расширение, после чего основная конфигурация обновляется.

В режиме 1С:Предприятие созданная группа продолжит корректно отображаться, если соблюдены следующие условия:

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