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