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