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