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

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

Если вы уже пробовали создавать модальные окна через ПоказатьВопрос или Предупреждение, но сталкивались с проблемами (например, окно не блокирует родительскую форму или пропадает после минимизации), здесь найдёте системные решения. А для разработчиков, работающих с 1С:EDT или расширениями, приведём примеры кода с учётом последних обновлений платформы.

1. Что такое модальное окно в 1С и когда оно нужно

Модальное окно — это диалоговое окно, которое приостанавливает выполнение кода до тех пор, пока пользователь не закроет его (нажмёт кнопку"ОК","Отмена" или крестик). В контексте 1С:Предприятие это реализуется через:

  • 🔹 Встроенные функции: ПоказатьВопрос, Предупреждение, ВвестиЗначение
  • 🔹 Управляемые формы с свойством Модальность = Истина
  • 🔹 Программное создание форм через ОткрытьФормуМодально

Типичные сценарии использования:

  • 📌 Критические операции: подтверждение удаления документа, изменение статуса заказа.
  • 📌 Ввод обязательных данных: выбор контрагента перед проведением платежа.
  • 📌 Предупреждения: несохранённые изменения, конфликты версий.
  • 📌 Сложные диалоги: настройка параметров отчёта с зависимыми полями.
📊 Как часто вы используете модальные окна в 1С?
Часто (ежедневно)
Иногда (при необходимости)
Рядом (предпочитаю немодальные)
Никогда не использовал

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

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

2. Базовые методы создания модальных окон

Начнём с простейших способов, которые покрывают 80% задач:

2.1. Встроенные функции платформы

Для быстрых диалогов используйте:

  • 🔘 Предупреждение(Текст, Заголовок, Кнопки) — показывает сообщение с кнопкой"ОК".
  • 🔘 ПоказатьВопрос(Текст, Заголовок, Кнопка1, Кнопка2,..., КнопкаN) — возвращает номер нажатой кнопки.
  • 🔘 ВвестиЗначение(Подсказка, Заголовок, ЗначениеПоУмолчанию) — запрашивает ввод данных.

Пример кода для подтверждения удаления:

Если ПоказатьВопрос("Удалить документ""Заказ клиента №123""?","Подтверждение","Да","Нет") = 1 Тогда

Документ.Удалить;

КонецЕсли;

2.2. Управляемые формы с модальностью

Если нужна кастомизированная форма (например, с полями ввода и логикой валидации), создайте управляемую форму и установите свойство Модальность = Истина:

  1. Откройте конфигуратор, добавьте новую форму.
  2. В свойствах формы найдите параметр Модальность.
  3. Напишите обработчик для кнопки"ОК", который будет закрывать форму с результатом.

Код для открытия формы модально:

Результат = ОткрытьФормуМодально("Справочник.Контрагенты.ФормаВыбора", Новый Структура("Параметр1, Параметр2"));

Если Результат.Выбран Тогда

// Обработка выбора

КонецЕсли;

☑️ Проверка перед использованием модальных окон

Выполнено: 0 / 4

2.3. Ограничения и обходные пути

В некоторых случаях стандартные методы не работают как ожидается:

ПроблемаПричинаРешение
Модальное окно не блокирует родительскоеОшибка в тонком клиенте при асинхронных вызовахИспользовать Подождать или перенести логику на сервер
Форма закрывается без результатаНе обработан обработчик ПередЗакрытиемДобавить проверку Отказ = Истина в обработчике
Модальное окно пропадает при минимизацииОсобенность работы с окнами в WindowsИспользовать АктивироватьОкно после восстановления
⚠️ Внимание: При работе с 1С:EDT (Eclipse-редактором) модальные окна в отладочном режиме могут вести себя нестабильно. Перед тестированием всегда собирайте и запускайте конфигурацию в обычном режиме.

3. Продвинутые сценарии: динамические формы и валидация

Когда стандартных функций недостаточно, приходится создавать кастомизированные решения. Рассмотрим двачных примера:

3.1. Модальное окно с зависимыми полями

Допустим, нужно создать форму для выбора склада и номенклатуры, где список номенклатуры зависит от выбранного склада. Алгоритм:

  1. Создайте форму с двумя полями выбора: Склад и Номенклатура.
  2. В обработчике изменения поля Склад обновите список номенклатуры:
Процедура СкладПриИзменении(Элемент)

Запрос = Новый Запрос;

Запрос.Текст ="ВЫБРАТЬ РАЗРЕШЕННЫЕ Номенклатура

|ИЗ РегистрСведений.ОстаткиТоваров

|ГДЕ Склад = &Склад";

Запрос.УстановитьПараметр("Склад", Склад);

Результат = Запрос.Выполнить;

ЭлементыФормы.Номенклатура.СписокВыбора.Очистить;

Пока НовыйОбъект = Результат.Получить Цикл

ЭлементыФормы.Номенклатура.СписокВыбора.Добавить(НовыйОбъект.Номенклатура);

КонецЦикла;

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

3.2. Модальное окно с таймером автозакрытия

Для уведомлений, которые должны исчезнуть через несколько секунд (например,"Данные сохранены"), используйте Таймер:

Процедура ПриОткрытии

Таймер = ЭлементыФормы.Добавить("Таймер", Тип("Таймер"));

Таймер.Интервал = 3000; // 3 секунды

Таймер.Включен = Истина;

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

Процедура ТаймерТаймер(Элемент)

Закрыть;

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

💡

Для сложных форм с большим количеством элементов используйте ГруппыПараметров — это упрощает управление видимостью и логикой полей.

3.3. Работа с результатами модального окна

Чтобы передавать данные между модальной формой и основным окном, используйте структуры или объекты:

// В основной форме:

Параметры = Новый Структура("Контрагент, ДатаДокумента");

Параметры.Вставить("Контрагент", ТекущийКонтрагент);

Результат = ОткрытьФормуМодально("Документ.ЗаказКлиента.ФормаПараметров", Параметры);

// В модальной форме:

Процедура ПриОткрытии(Параметры)

Если Параметры.Свойство("Контрагент") Тогда

ЭлементыФормы.Контрагент.Значение = Параметры.Контрагент;

КонецЕсли;

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

Процедура КнопкаОКНажатие(Кнопка)

Результат = Новый Структура("Контрагент, Дата");

Результат.Вставить("Контрагент", ЭлементыФормы.Контрагент.Значение);

Результат.Вставить("Дата", ЭлементыФормы.Дата.Значение);

Закрыть(Результат);

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

4. Типичные ошибки и их решение

Даже опытные разработчики сталкиваются с проблемами при работе с модальными окнами. Разберём самые распространённые:

4.1. Окно не блокирует родительскую форму

Чаще всего это происходит в тонком клиенте или веб-интерфейсе, где модальность реализована через JavaScript. Решения:

  • 🔧 Используйте Подождать(1) после вызова модального окна, чтобы дать время на рендеринг.
  • 🔧 Перенесите логику на сервер, если окно открывается из серверной процедуры.
  • 🔧 Для сложных случаев создайте немодальное окно с визуальной блокировкой (полупрозрачный оверлей).

4.2. Ошибка"Модальное окно уже открыто"

Эта ошибка возникает, если пытаться открыть второе модальное окно поверх первого. Обходные пути:

  • 🔄 Закрывайте первое окно перед открытием второго.
  • 🔄 Используйте немодальные окна для вложенных диалогов.
  • 🔄 Объединяйте логику в одно окно с вкладками.
Почему в веб-клиенте модальные окна ведут себя иначе?

В веб-интерфейсе 1С модальность эмулируется через HTML/CSS. Это означает, что блокировка происходит только на уровне браузера, а не на уровне платформы. Например, если пользователь откроет DevTools (F12), он сможет взаимодействовать с основной страницей, несмотря на"модальное" окно.

4.3. Потеря фокуса после закрытия окна

После закрытия модального окна фокус может"пропадать", и пользователю приходится вручную кликать по полям. Исправляем:

Процедура ПослеЗакрытия(Результат)

Если Результат <> Неопределено Тогда

ЭлементыФормы.ПолеДляФокуса.Активировать;

КонецЕсли;

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

⚠️ Внимание: В версиях 1С:Предприятие 8.3.20+ появились изменения в механизме модальности для веб-клиента. Если ваша конфигурация работает на более ранних версиях, тестируйте поведение окон после обновления платформы.

5. Оптимизация UX: как сделать модальные окна удобными

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

5.1. Минимизируйте количество модальных окон

Перед добавлением нового окна задайтесь вопросом:

  • ❓ Можно ли обойтись немодальным уведомлением?
  • ❓ Возможно ли объединить несколько диалогов в один?
  • ❓ Не мешает ли окно основному рабочему процессу?

5.2. Дизайн и расположение элементов

Следуйте принципам:

  • 🎨 Кнопка"Отмена" должна быть слева,"ОК" — справа (стандарт ).
  • 🎨 Текст сообщения — не более 3-4 строк (длинные тексты разбивайте на абзацы).
  • 🎨 Для полей ввода используйте подсказки (Подсказка в свойствах элемента).
💡

Используйте модальные окна только для критических действий. Для вторичных задач (например, фильтрация списка) подойдут немодальные панели.

5.3. Тестирование на разных клиентах

Поведение модальных окон может отличаться в:

Тип клиентаОсобенностиРекомендации
Толстый клиентПолная блокировка окнаСтандартные методы работают стабильно
Тонкий клиентМогут быть задержки при открытииИспользуйте Подождать
Веб-клиентЭмуляция через HTMLТестируйте в разных браузерах
Мобильное приложениеОграниченный экранУпрощайте формы, убирайте лишние элементы

6. Альтернативы модальным окнам в 1С

Иногда модальные окна — не лучшее решение. Рассмотрим альтернативы:

6.1. Немодальные диалоги

Подходят для:

  • 📋 Вспомогательных панелей (например, калькулятор скидок).
  • 📋 Уведомлений, не требующих немедленного действия.
  • 📋 Форм с длительной обработкой (чтобы пользователь мог работать параллельно).

6.2. Всплывающие подсказки (ПоказатьПодсказку)

Краткие сообщения, которые не блокируют работу:

ПоказатьПодсказку("Документ сохранён в 12:30", ЭлементыФормы.КнопкаСохранить);

6.3. Статусные панели

Для отображения прогресса или результатов операций:

ЭлементыФормы.ПанельСостояния.Текст ="Обработано 50 из 100 строк...";
💡

Для длительных операций (например, выгрузка данных) комбинируйте немодальное окно с прогресс-баром и кнопкой"Отмена".

7. Примеры кода для типовых задач

Здесь собраны готовые решения для распространённых сценариев:

7.1. Модальное окно с выбором даты

Процедура ВыбратьДату

Параметры = Новый Структура("Заголовок, ДатаПоУмолчанию");

Параметры.Вставить("Заголовок","Выберите дату отчёта");

Параметры.Вставить("ДатаПоУмолчанию", ТекущаяДата);

Результат = ОткрытьФормуМодально("ОбщийМакет.ФормаВыбораДаты", Параметры);

Если Результат.Выбрано Тогда

Сообщить("Выбрана дата:" + Результат.Дата);

КонецЕсли;

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

7.2. Модальное предупреждение с таймаутом

Процедура ПоказатьПредупреждениеСТаймаутом(Текст, ВремяСекунд = 5)

Форма = ПолучитьФорму("ОбщийМакет.ФормаТаймаута");

Форма.ТекстПредупреждения = Текст;

Форма.ВремяЗакрытия = ВремяСекунд;

ОткрытьФормуМодально(Форма);

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

7.3. Модальное окно с подтверждением и комментарием

Процедура ПодтвердитьСКомментарием

Параметры = Новый Структура("Заголовок, ТекстВопроса");

Параметры.Вставить("Заголовок","Подтверждение отмены");

Параметры.Вставить("ТекстВопроса","Вы действительно хотите отменить заказ? Укажите причину:");

Результат = ОткрытьФормуМодально("ОбщийМакет.ФормаПодтвержденияСКомментарием", Параметры);

Если Результат.Подтверждено Тогда

Сообщить("Причина отмены:" + Результат.Комментарий);

КонецЕсли;

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

8. Интеграция с внешними системами

Если ваша интегрирована с другими системами (например, CRM или WMS), модальные окна могут использоваться для:

  • 🔗 Подтверждения синхронизации данных.
  • 🔗 Выбора параметров обмена.
  • 🔗 Отображения результатов интеграции (успех/ошибка).

Пример окна для подтверждения выгрузки в 1С:Битрикс:

Процедура ВыгрузитьВБитрикс

Если ПоказатьВопрос("Выгрузить данные в Битрикс24?","Подтверждение","Да","Нет","Выгрузить с проверкой") = 1 Тогда

// Логика выгрузки

ИначеЕсли ПоказатьВопрос.Результат = 3 Тогда

ОткрытьФормуМодально("ОбщийМакет.ФормаПроверкиДанныхПередВыгрузкой");

КонецЕсли;

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

⚠️ Внимание: При работе с REST API или HTTP-сервисами избегайте длительных модальных операций. Используйте фоновые задачи (ФоновоеЗадание) или прогресс-бары.

FAQ: Частые вопросы по модальным окнам в 1С

Как сделать модальное окно с несколькими вкладками?

Создайте управляемую форму с элементом ПолеВкладки. На каждой вкладке разместите нужные элементы управления. Установите свойство Модальность = Истина для формы. Пример:

Форма = ПолучитьФорму("Справочник.Номенклатура.ФормаВыбораСВкладками");

Форма.Модальность = Истина;

ОткрытьФормуМодально(Форма);

Почему модальное окно не открывается в веб-клиенте?

В веб-клиенте модальность эмулируется через JavaScript. Проблемы могут возникать из-за:

  • Блокировщиков всплывающих окон в браузере.
  • Ошибок в скриптах (проверьте консоль браузера, F12 → Console).
  • Несовместимости с версией платформы (обновите 1С:Предприятие до 8.3.20+).

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

Можно ли изменить стиль (цвет, шрифт) модального окна?

Да, но с ограничениями:

  • Для управляемых форм настройте стили через свойства элементов (например, ЦветФона, Шрифт).
  • Для встроенных функций (например, ПоказатьВопрос) стиль изменить нельзя — они используют системные диалоги ОС.
  • В веб-клиенте можно подключить CSS через расширение конфигурации.
Как передать в модальное окно сложный объект (например, таблицу значений)?

Используйте структуры или сериализацию в JSON:

// Основная форма:

Параметры = Новый Структура("Таблица, Настройки");

Параметры.Вставить("Таблица", МояТаблицаЗначений);

Параметры.Вставить("Настройки", JSON.Записать(МоиНастройки));

Результат = ОткрытьФормуМодально("ОбщийМакет.ФормаРедактированияТаблицы", Параметры);

// Модальная форма:

Процедура ПриОткрытии(Параметры)

Если Параметры.Свойство("Таблица") Тогда

ЭлементыФормы.Таблица.Значение = Параметры.Таблица;

КонецЕсли;

Если Параметры.Свойство("Настройки") Тогда

МоиНастройки = JSON.Прочитать(Параметры.Настройки);

КонецЕсли;

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

Как закрыть модальное окно по нажатию Esc?

Добавьте обработчик события ОбработкаНажатия для формы:

Процедура ФормаОбработкаНажатия(Клавиша, Состояние)

Если Клавиша.Код = КодВК.Esc Тогда

Закрыть(Неопределено); // Закрытие без результата

КонецЕсли;

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

Чтобы отменить стандартное поведение (закрытие по Esc), установите Состояние.Поглощено = Истина.