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

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

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

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

Диалоговые окна в 1С:Предприятие используются для взаимодействия с пользователем: подтверждения действий, ввода данных, предупреждений и выбора файлов. Разработчику доступны готовые методы глобального контекста — ПоказатьВопрос, ПоказатьПредупреждение, ПоказатьВводСтроки, ПоказатьВводЧисла и другие, а в сложных сценариях создаются собственные формы, открываемые как диалог.

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

Ниже разобраны основные способы открытия диалоговых окон: от простого предупреждения до собственной формы с передачей параметров, а также типичные ошибки и ограничения разных клиентов.

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

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

Основные встроенные диалоги: вопрос с кнопками (Да/Нет, ОК/Отмена и другие комбинации), информационное предупреждение, ввод строки, числа или даты, диалог выбора файла, диалог выбора цвета и шрифта. Все они вызываются одной строкой кода и не требуют настройки интерфейса.

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

Как открыть диалог с вопросом и кнопками

Для подтверждения действий используется метод ПоказатьВопрос. Он принимает описание оповещения, текст вопроса, набор кнопок из системного перечисления РежимДиалогаВопрос, таймаут и кнопку по умолчанию.

&НаКлиенте

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

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

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

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

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

&НаКлиенте

Процедура ПослеОтветаНаВопрос(Результат, ДопПараметры) Экспорт

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

// логика удаления

КонецЕсли;

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

Обратите внимание на логику кнопки по умолчанию: для деструктивных действий (удаление, отмена проведения) безопасным значением по умолчанию должна быть «Нет» или «Отмена». Тогда случайное нажатие Enter не приведёт к потере данных. Таймаут в секундах определяет, какой ответ будет засчитан, если пользователь не отреагировал.

Как показать предупреждение и ввести данные

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

&НаКлиенте

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

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

ПоказатьВводСтроки(Оповещение, "", "Введите комментарий", 200, Истина);

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

&НаКлиенте

Процедура ПослеВводаСтроки(Строка, ДопПараметры) Экспорт

Если Строка <> Неопределено Тогда

Комментарий = Строка;

КонецЕсли;

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

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

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

Как открыть диалог выбора файла

Для выбора файла или каталога используется объект ДиалогВыбораФайла совместно с методом Показать. Режим задаётся перечислением РежимДиалогаВыбораФайла: Открытие, Сохранение или ВыборКаталога. Доступны фильтры по расширениям, заголовок окна и множественный выбор.

&НаКлиенте

Процедура ВыбратьФайл(Команда)

Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);

Диалог.Фильтр = "Файлы Excel (.xlsx)|.xlsx";

Диалог.МножественныйВыбор = Ложь;

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

Диалог.Показать(Оповещение);

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

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

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

Когда стандартных диалогов не хватает, создаётся собственная форма — например, общая форма или форма обработки — и открывается методом ОткрытьФорму. Чтобы она вела себя как диалог и блокировала родительское окно, используется параметр РежимОткрытияОкнаФормы.БлокироватьОкноВладельца.

&НаКлиенте

Процедура ОткрытьНастройки(Команда)

ПараметрыФормы = Новый Структура("ТекущийПериод", Период);

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

ОткрытьФорму("ОбщаяФорма.НастройкиОбмена", ПараметрыФормы, ЭтотОбъект, , , ,

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

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

Результат работы такой формы возвращается через метод Закрыть(ЗначениеРезультата) внутри формы-диалога — это значение попадёт в обработчик оповещения. Переданные при открытии параметры доступны в форме через свойство Параметры в обработчике ПриСозданииНаСервере.

Если диалог должен блокировать всё приложение, а не только окно-владелец, используйте РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс. Но применяйте его точечно: такой режим мешает пользователю переключиться на другие окна и при зависании обработчика выглядит как «зависшая» программа.
ПЗ
Практическое замечание

Ограничения клиентов и асинхронная модель

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

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

Типичные ошибки при работе с диалогами

Наиболее распространённая проблема — обработчик оповещения, не помеченный ключевым словом Экспорт. Без него платформа не сможет вызвать процедуру извне, и после закрытия диалога возникнет ошибка «Процедура не обнаружена». Вторая частая ошибка — неверная сигнатура обработчика: он обязан принимать два параметра (результат и дополнительные параметры).

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

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

Как проверить, что диалог работает правильно

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

Контрольные точки

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

Открытие диалога
Норма

Окно появляется с нужным текстом и кнопками, интерфейс владельца заблокирован

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

Ошибка выполнения или диалог не блокирует родительское окно

Обработка ответа
Норма

Обработчик вызывается, результат соответствует нажатой кнопке

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

Ошибка «процедура не обнаружена» или результат всегда Неопределено

Отмена и таймаут
Норма

При отмене возвращается Неопределено/код отмены, данные не изменяются

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

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

Частые вопросы

Чем отличается Вопрос() от ПоказатьВопрос?

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

Как передать дополнительные данные в обработчик оповещения?

Третьим параметром конструктора ОписаниеОповещения передайте произвольное значение, обычно структуру: Новый ОписаниеОповещения("Обработчик", ЭтотОбъект, ДопДанные). В обработчике оно придёт во втором параметре.

Можно ли открыть диалог на сервере?

Нет. Все диалоговые методы доступны только на клиенте, так как они взаимодействуют с интерфейсом пользователя. Если диалог нужен после серверной проверки, вызовите серверную процедуру, верните результат на клиент и уже там откройте диалог.

Как сделать многострочный ввод текста в диалоге?

В методе ПоказатьВводСтроки установите пятый параметр (Многострочность) в Истина. Диалог отобразит многострочное поле ввода, а введённый текст вернётся в обработчик с сохранением переносов строк.

Почему диалог выбора файла не работает в веб-клиенте?

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

Итог

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

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