Как создать произвольное диалоговое окно с кнопками в 1С

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Метод 1: Использование ПоказатьВопрос со СпискомЗначений

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

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


&НаКлиенте
Процедура ВызватьДиалогВыбора(Команда)
    
    // 1. Создаем описание оповещения, которое сработает после закрытия окна
    Оповещение = Новый ОписаниеОповещения("ПослеЗакрытияВопроса", ЭтотОбъект);
    
    // 2. Формируем список наших произвольных кнопок
    СписокКнопок = Новый СписокЗначений;
    СписокКнопок.Добавить("Вариант_Красный", "Выбрать красный");
    СписокКнопок.Добавить("Вариант_Синий", "Выбрать синий");
    СписокКнопок.Добавить("Вариант_Зеленый", "Выбрать зеленый");
    
    // 3. Вызываем диалог
    ПоказатьВопрос(Оповещение, "Какой цвет вы хотите установить для поля?", СписокКнопок, 0, , "Настройка оформления");
    
КонецПроцедуры

Разберем подробнее параметры метода Добавить у объекта СписокЗначений. Первый параметр — это Значение (то, что получит программный код), а второй — Представление (то, что увидит пользователь на кнопке). Это позволяет нам делать интерфейс дружелюбным, сохраняя при этом удобство обработки в коде.

Обработка результата выбора

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


&НаКлиенте
Процедура ПослеЗакрытияВопроса(Результат, Параметры) Экспорт
    
    // Если пользователь закрыл окно крестиком, Результат будет равен Неопределено
    Если Результат = Неопределено Тогда
        Возврат;
    КонецЕсли;
    
    // Проверяем, какое именно значение вернулось
    Если Результат = "Вариант_Красный" Тогда
        // Здесь описываем логику для красного цвета
        Сообщить("Вы выбрали красный цвет!");
    ИначеЕсли Результат = "Вариант_Синий" Тогда
        Сообщить("Вы выбрали синий цвет!");
    КонецЕсли;
    
КонецПроцедуры

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

Метод 2: Создание полноценной формы диалога

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

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

Рассмотрим пример кода для вызова такой формы из основной формы документа или справочника:


&НаКлиенте
Процедура ОткрытьПроизвольноеОкно(Команда)
    
    ОписаниеОповещения = Новый ОписаниеОповещения("ПослеЗакрытияМоейФормы", ЭтотОбъект);
    
    // Параметры для открытия, если нужно передать данные в диалог
    ПараметрыФормы = Новый Структура("ТекущееЗначение", Объект.Наименование);
    
    // Открываем форму блокируя окно владельца
    ОткрытьФорму("ОбщаяФорма.МоеДиалоговоеОкно", ПараметрыФормы, ЭтаФорма, , , , ОписаниеОповещения, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
    
КонецПроцедуры

В этом случае, когда во вспомогательной форме сработает код ЭтаФорма.Закрыть("Успешно");, строка "Успешно" попадет в параметр Результат вашей процедуры ПослеЗакрытияМоейФормы.

Важные нюансы и настройки

Проанализируем дополнительные возможности, которые сделают ваши диалоги более профессиональными:

1. Использование Тайм-аута. Метод ПоказатьВопрос поддерживает параметр времени ожидания. Если пользователь не нажмет кнопку в течение, например, 10 секунд, окно закроется само. Это полезно для систем, работающих в автоматизированном режиме.

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

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

4. Обработка "Крестика". Всегда проверяйте результат на Неопределено или КодВозвратаДиалога.Отмена. Если пользователь нажал Esc или закрыл окно стандартной кнопкой управления Windows, ваш код не должен выдавать ошибку при попытке сравнения результата.

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

← На главную