При разработке функционала диалоговых окон в управляемых формах 1С разработчики нередко сталкиваются с ошибками синтаксического контроля. В частности, конфигуратор выдает предупреждения о том, что не определена процедура или функция Вопрос, а также системные перечисления РежимДиалогаВопрос и КодВозвратаДиалога.
Разберем типичный пример проблемного кода в модуле формы:
&НаКлиенте
Функция ОтказОтЗаписиКонтрагента()
Если Вопрос("Отказаться от записи контрагента в базу данных?", РежимДиалогаВопрос.ДаНет) = КодВозвратаДиалога.Да Тогда
Возврат Истина;
Иначе
Возврат Ложь;
КонецЕсли;
КонецФункции
При проверке модуля возникают следующие ошибки:
{Форма(...)}: Переменная не определена (РежимДиалогаВопрос)
{Форма(...)}: Переменная не определена (КодВозвратаДиалога)
{Форма(...)}: Процедура или функция с указанным именем не определена (Вопрос)
Выясним причину такого поведения платформы и рассмотрим по шагам, как исправить эту проблему.
Метод Вопрос и системные перечисления РежимДиалогаВопрос, КодВозвратаДиалога доступны исключительно в клиентском контексте (тонкий клиент, толстый клиент, веб-клиент, мобильный клиент). Если компилятор выдает сообщение о том, что эти объекты не определены, значит, проверка кода выполняется в серверном контексте. Рассмотрим подробнее основные факторы:
&НаКлиенте была скопирована или набрана с использованием латинских букв (например, «C» вместо русской «С»), платформа не распознает директиву. В результате процедура компилируется по умолчанию на сервере.КонецПроцедуры, КонецФункции или не закрыта конструкция Если ... КонецЕсли, синтаксический анализатор может объединить контексты и выполнять проверку функции как части серверного метода.&НаКлиенте, &НаСервере) не поддерживаются. Если код написан в общем модуле, у модуля должен быть установлен флаг «Клиент (управляемое приложение)».Проанализируем директиву компиляции перед функцией. Рекомендуется удалить строку с директивой и набрать её вручную русскими буквами:
&НаКлиенте
Функция ОтказОтЗаписиКонтрагента()
// Клиентский код
КонецФункции
Также проверим структуру всего модуля формы. Убедимся, что все предшествующие процедуры и функции корректно завершены инструкциями КонецПроцедуры или КонецФункции, а операторы разделены точкой с запятой.
В современных конфигурациях на платформе 1С:Предприятие 8.3 использование модальных методов (к которым относится классический Вопрос) часто отключено на уровне свойств конфигурации. Вызов синхронной функции приведет к ошибке выполнения «Использование модальных окон в данном режиме запрещено!».
Посмотрим на два современных и рекомендованных способа реализации диалога с пользователем.
Вариант 1. Использование асинхронной функции ВопросАсинх:
&НаКлиенте
Асинх Процедура ОтказОтЗаписиКонтрагента()
Ответ = Ждать ВопросАсинх("Отказаться от записи контрагента в базу данных?", РежимДиалогаВопрос.ДаНет);
Если Ответ = КодВозвратаДиалога.Да Тогда
// Действия при подтверждении отказа
КонецЕсли;
КонецПроцедуры
Вариант 2. Использование немодального метода ПоказатьВопрос:
&НаКлиенте
Процедура ЗадатьВопросПользователю()
Оповещение = Новый ОписаниеОповещения("ПослеОтветаНаВопрос", ЭтотОбъект);
ПоказатьВопрос(Оповещение, "Отказаться от записи контрагента в базу данных?", РежимДиалогаВопрос.ДаНет);
КонецПроцедуры
&НаКлиенте
Процедура ПослеОтветаНаВопрос(Результат, ДополнительныеПараметры) Экспорт
Если Результат = КодВозвратаДиалога.Да Тогда
// Действия при подтверждении отказа
КонецЕсли;
КонецПроцедуры
Применение асинхронных вызовов обеспечивает совместимость с веб-клиентом и мобильными клиентами, а также полностью исключает ошибки, связанные с блокировкой интерфейса при запрете модальности.