Почему возникает ошибка «Переменная не определена (РежимДиалогаВопрос)» и как её исправить?

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

При разработке функционала диалоговых окон в управляемых формах 1С разработчики нередко сталкиваются с ошибками синтаксического контроля. В частности, конфигуратор выдает предупреждения о том, что не определена процедура или функция Вопрос, а также системные перечисления РежимДиалогаВопрос и КодВозвратаДиалога.

Разберем типичный пример проблемного кода в модуле формы:


&НаКлиенте
Функция ОтказОтЗаписиКонтрагента()
    Если Вопрос("Отказаться от записи контрагента в базу данных?", РежимДиалогаВопрос.ДаНет) = КодВозвратаДиалога.Да Тогда
        Возврат Истина;
    Иначе
        Возврат Ложь;
    КонецЕсли;
КонецФункции

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

{Форма(...)}: Переменная не определена (РежимДиалогаВопрос)
{Форма(...)}: Переменная не определена (КодВозвратаДиалога)
{Форма(...)}: Процедура или функция с указанным именем не определена (Вопрос)

Выясним причину такого поведения платформы и рассмотрим по шагам, как исправить эту проблему.

Причины возникновения ошибки

Метод Вопрос и системные перечисления РежимДиалогаВопрос, КодВозвратаДиалога доступны исключительно в клиентском контексте (тонкий клиент, толстый клиент, веб-клиент, мобильный клиент). Если компилятор выдает сообщение о том, что эти объекты не определены, значит, проверка кода выполняется в серверном контексте. Рассмотрим подробнее основные факторы:

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

Шаг 1. Проверка директивы компиляции и контекста

Проанализируем директиву компиляции перед функцией. Рекомендуется удалить строку с директивой и набрать её вручную русскими буквами:


&НаКлиенте
Функция ОтказОтЗаписиКонтрагента()
    // Клиентский код
КонецФункции

Также проверим структуру всего модуля формы. Убедимся, что все предшествующие процедуры и функции корректно завершены инструкциями КонецПроцедуры или КонецФункции, а операторы разделены точкой с запятой.

Шаг 2. Использование актуальных асинхронных методов

В современных конфигурациях на платформе 1С:Предприятие 8.3 использование модальных методов (к которым относится классический Вопрос) часто отключено на уровне свойств конфигурации. Вызов синхронной функции приведет к ошибке выполнения «Использование модальных окон в данном режиме запрещено!».

Посмотрим на два современных и рекомендованных способа реализации диалога с пользователем.

Вариант 1. Использование асинхронной функции ВопросАсинх:


&НаКлиенте
Асинх Процедура ОтказОтЗаписиКонтрагента()
    Ответ = Ждать ВопросАсинх("Отказаться от записи контрагента в базу данных?", РежимДиалогаВопрос.ДаНет);
    Если Ответ = КодВозвратаДиалога.Да Тогда
        // Действия при подтверждении отказа
    КонецЕсли;
КонецПроцедуры

Вариант 2. Использование немодального метода ПоказатьВопрос:


&НаКлиенте
Процедура ЗадатьВопросПользователю()
    Оповещение = Новый ОписаниеОповещения("ПослеОтветаНаВопрос", ЭтотОбъект);
    ПоказатьВопрос(Оповещение, "Отказаться от записи контрагента в базу данных?", РежимДиалогаВопрос.ДаНет);
КонецПроцедуры

&НаКлиенте
Процедура ПослеОтветаНаВопрос(Результат, ДополнительныеПараметры) Экспорт
    Если Результат = КодВозвратаДиалога.Да Тогда
        // Действия при подтверждении отказа
    КонецЕсли;
КонецПроцедуры

Применение асинхронных вызовов обеспечивает совместимость с веб-клиентом и мобильными клиентами, а также полностью исключает ошибки, связанные с блокировкой интерфейса при запрете модальности.

← На главную