К статье
Практический материал

Разработка и Конфигурация · 10 мин

Как вызвать диалоговое окно в 1С

Способы вызвать диалоговое окно в 1С: ПоказатьВопрос, ПоказатьВводЗначения, ОткрытьФорму, Предупреждение. Примеры кода, отличия модальных и немодальных окон, типичные ошибки.

Диалоговое окно в 1С — это способ обратиться к пользователю из кода: задать вопрос, предупредить об ошибке, запросить значение или открыть форму для ввода данных. В зависимости от задачи применяются разные методы встроенного языка, и выбор неправильного варианта — самая частая причина ошибок «Интерактивные операции недоступны» и зависших сеансов.

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

Какие виды диалоговых окон существуют в 1С

Платформа предоставляет несколько типов диалогов, и у каждого своё назначение. Простое предупреждение информирует пользователя и требует только нажатия «ОК». Вопрос возвращает выбранный вариант — «Да», «Нет», «Отмена» и другие. Диалог ввода значения позволяет запросить строку, число, дату или ссылку на объект. Отдельная группа — открытие произвольных форм, когда стандартных диалогов недостаточно.

Также диалоги делятся на модальные и немодальные. Модальное окно блокирует весь интерфейс до ответа пользователя, немодальное — только текущий сценарий. В управляемом приложении прямой вызов модальных методов приводит к ошибке, если в конфигураторе не включён режим использования модальности, что по умолчанию запрещено в большинстве современных решений.

Как вызвать вопрос с кнопками «Да/Нет»

Для вопроса используется метод ПоказатьВопрос. Ему передаётся описание оповещения с именем процедуры-обработчика, текст вопроса и список кнопок из системного перечисления РежимДиалогаВопрос.

&НаКлиенте

Процедура УдалитьСтроку(Команда)

Оповещение = Новый ОписаниеОповещения("УдалитьСтрокуЗавершение", ЭтотОбъект);

ПоказатьВопрос(Оповещение, "Удалить выбранную строку?",

РежимДиалогаВопрос.ДаНет, 20, КодВозвратаДиалога.Нет);

КонецПроцедуры

&НаКлиенте

Процедура УдалитьСтрокуЗавершение(Результат, ДопПараметры) Экспорт

Если Результат = КодВозвратаДиалога.Да Тогда

// выполняем удаление

КонецЕсли;

КонецПроцедуры

Четвёртый параметр — таймаут в секундах: если пользователь не ответит, диалог закроется сам и вернёт кнопку по умолчанию, заданную пятым параметром. Это важно для сценариев, где «зависший» вопрос может остановить пакетную обработку документов.

Порядок вызова вопроса
  1. 1
    Создайте процедуру-обработчик с параметрами (Результат, ДополнительныеПараметры) и директивой Экспорт
  2. 2
    Сформируйте объект Новый ОписаниеОповещения с именем этой процедуры
  3. 3
    Вызовите ПоказатьВопрос с текстом, режимом кнопок и при необходимости таймаутом
  4. 4
    В обработчике сравните Результат с КодВозвратаДиалога и выполните действие

Как вывести предупреждение или сообщение об ошибке

Когда выбора у пользователя нет и нужно просто сообщить информацию, применяется ПоказатьПредупреждение. Он принимает описание оповещения (можно передать Неопределено, если продолжение не требуется), текст и таймаут.

ПоказатьПредупреждение(, "Документ не проведён: не заполнен склад.", 10, "Проверка данных");

Если сообщение не требует остановки сценария, лучше использовать Сообщить или объект СообщениеПользователю — текст появится в панели сообщений внизу окна и не будет перебивать работу. Это правильный выбор для некритичных уведомлений при проведении и записи.

Как запросить ввод значения у пользователя

Метод ПоказатьВводЗначения открывает диалог с полем ввода. Тип значения задаётся через ОписаниеТипов — можно ограничить ввод строкой, числом, датой или ссылкой на конкретный справочник.

&НаКлиенте

Процедура ВвестиКоличество(Команда)

Оповещение = Новый ОписаниеОповещения("ВвестиКоличествоЗавершение", ЭтотОбъект);

ОписаниеТипа = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(10, 3));

ПоказатьВводЗначения(Оповещение, 1, "Введите количество", ОписаниеТипа);

КонецПроцедуры

&НаКлиенте

Процедура ВвестиКоличествоЗавершение(Значение, ДопПараметры) Экспорт

Если Значение <> Неопределено Тогда

// пользователь нажал ОК, Значение содержит введённые данные

КонецЕсли;

КонецПроцедуры

Если пользователь нажал «Отмена», в обработчик приходит Неопределено — это обязательно проверяйте, иначе код продолжится с пустым значением. Для ввода строки без ограничения типа есть упрощённый метод ПоказатьВводСтроки, для даты — ПоказатьВводДаты, для числа — ПоказатьВводЧисла.

Как открыть форму как диалоговое окно

Когда стандартных диалогов не хватает — нужно выбрать элемент справочника с отбором, заполнить несколько полей, показать таблицу — открывают форму методом ОткрытьФорму или ОткрытьФормуМодально. Форма при этом работает как диалог: пользователь делает выбор, форма закрывается и возвращает результат.

ПараметрыФормы = Новый Структура("РежимВыбора", Истина);

Оповещение = Новый ОписаниеОповещения("ПослеВыбораКонтрагента", ЭтотОбъект);

ОткрытьФорму("Справочник.Контрагенты.ФормаВыбора", ПараметрыФормы,

ЭтотОбъект, , , , Оповещение, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);

Режим БлокироватьОкноВладельца делает форму визуально модальной по отношению к вызвавшему окну, не нарушая запрет на модальность. Результат приходит в обработчик оповещения после закрытия формы. Это основной способ построения сложных диалогов в управляемом приложении.

Сравнение способов

ПоказатьВопрос

Простой выбор из кнопок (Да/Нет/Отмена). Не подходит для ввода данных

ПоказатьВводЗначения

Ввод одного значения заданного типа. Ограничение — только одно поле

ОткрытьФорму

Любая сложная логика диалога. Требует создания собственной формы и больше кода

СообщениеПользователю

Некритичные уведомления без остановки работы. Не возвращает реакцию пользователя

Модальные методы: когда они ещё допустимы

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

Если вы поддерживаете такую конфигурацию, учтите: в веб-клиенте и в сеансах с запрещённой модальностью эти вызовы завершатся ошибкой. При любой доработке переписывайте их на асинхронные аналоги — это снимет ограничение и упростит дальнейший перенос кода.

Типичные ошибки при вызове диалогов

Наиболее частая проблема — забытый модификатор Экспорт у процедуры-обработчика оповещения. Без него платформа не сможет вызвать процедуру после закрытия диалога, и пользователь увидит ошибку в момент нажатия кнопки. Вторая типовая ошибка — обработка результата без проверки на Неопределено при отмене ввода.

Также разработчики нередко вызывают диалог внутри цикла обработки данных на сервере или пытаются получить результат сразу после ПоказатьВопрос, забывая, что метод асинхронный: код после вызова выполняется до ответа пользователя. Вся логика, зависящая от ответа, должна находиться внутри процедуры оповещения.

Типичные ошибки
01
Вызов диалога в серверной процедуре — ошибка «Интерактивные операции недоступны»
02
Отсутствие Экспорт у обработчика оповещения — ошибка при закрытии диалога
03
Чтение результата сразу после ПоказатьВопрос — код выполняется раньше ответа пользователя
04
Отсутствие проверки на Неопределено при отмене ввода — дальнейшие расчёты идут с пустым значением
05
Использование модальных Вопрос()/Предупреждение() в конфигурации с запрещённой модальностью
Контрольные точки

Как проверить результат

Диалог открывается
Норма

Окно появляется с заданным текстом и кнопками

Тревожный признак

Ошибка о недоступности интерактивных операций — вызов идёт с сервера

Обработчик срабатывает
Норма

После нажатия кнопки выполняется процедура оповещения

Тревожный признак

Ничего не происходит или ошибка — проверьте Экспорт и имя процедуры

Отмена ввода
Норма

При Отмене в обработчик приходит Неопределено и код корректно завершается

Тревожный признак

Выполняются действия с пустым значением

Таймаут
Норма

По истечении таймаута диалог закрывается с кнопкой по умолчанию

Тревожный признак

Диалог висит бесконечно и блокирует сценарий

Частые вопросы о диалоговых окнах в 1С

Как вызвать диалог «Сохранить изменения?» при закрытии формы?

Используйте обработчик формы ПередЗакрытием: установите параметр Отказ = Истина, вызовите ПоказатьВопрос с оповещением и в обработчике при ответе «Да» запишите данные и закройте форму. Для типовых форм объекта аналогичную логику даёт стандартный механизм модифицированности.

Можно ли вызвать диалоговое окно из фонового задания?

Нет. Фоновые задания выполняются на сервере без интерфейса. Результат работы задания передаётся на клиент через механизм длительных операций, и уже на клиенте по итогу показывается предупреждение или вопрос.

Чем ПоказатьВводСтроки отличается от ПоказатьВводЗначения?

ПоказатьВводСтроки работает только со строками и позволяет включить многострочный ввод. ПоказатьВводЗначения универсальнее: через ОписаниеТипов можно запросить число, дату или ссылку на объект базы с контролем типа на уровне платформы.

Почему диалог не появляется, хотя ошибок нет?

Частая причина — вызов из обработчика ожидания или из контекста, где платформа откладывает интерактивные операции, либо диалог перекрыт другим окном. Проверьте, что вызов идёт на клиенте, и добавьте отладочное сообщение перед вызовом, чтобы убедиться, что ветка кода вообще выполняется.

Как задать свои подписи кнопок вместо «Да/Нет»?

Стандартные кнопки РежимДиалогаВопрос изменить нельзя. Для произвольных подписей создайте собственную общую форму с нужными командами и откройте её через ОткрытьФорму с режимом БлокироватьОкноВладельца, вернув выбранный вариант через Закрыть(Результат).

Работает ли ПоказатьВопрос в веб-клиенте?

Да, асинхронные методы ПоказатьВопрос, ПоказатьПредупреждение и ПоказатьВводЗначения полностью поддерживаются в веб-клиенте. Не работают там только модальные Вопрос() и Предупреждение() при запрещённой модальности.

Итог

Что важно запомнить

Все диалоги вызываются на клиенте асинхронными методами с ОписаниеОповещения: ПоказатьВопрос для выбора, ПоказатьВводЗначения для ввода, ОткрытьФорму для сложных сценариев. Обработчик объявляйте с Экспорт, проверяйте отмену через Неопределено и никогда не вызывайте диалоги из серверного кода и фоновых заданий.