Термин «модально» в контексте 1С:Предприятие часто вызывает вопросы даже у опытных разработчиков. Если вы сталкивались с сообщениями вроде ОткрытьФормуМодально() или ПоказатьОповещениеМодально(), но не до конца понимаете, чем это отличается от обычного открытия формы — эта статья для вас.

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

В этой статье мы разберём:

  • 🔹 Чем модальные окна отличаются от немодальных (и когда что использовать)
  • 🔹 Как создавать модальные формы в конфигураторе и через встроенный язык
  • 🔹 Типичные ошибки, которые приводят к «зависанию» интерфейса
  • 🔹 Примеры кода для разных версий платформы (8.3, 8.3.20+)

Модальное vs немодальное: ключевые различия

Основное отличие модального окна от немодального — контроль над потоком работы пользователя. Давайте сравним их поведение:

Характеристика Модальное окно Немодальное окно
Блокировка интерфейса Да, пока окно открыто, другие формы недоступны Нет, можно переключаться между окнами
Использование в коде ОткрытьФормуМодально(), ПоказатьВопрос() ОткрытьФорму(), ПоказатьОповещение()
Типичные сценарии Ввод критических данных, подтверждение действий, ошибки Справочная информация, лог операций, фоновые процессы
Возврат значения Можно получить результат (например, Да/Нет) Нет прямого возврата, требуется обработка событий

👉 Пример из жизни: модальное окно — как кассир в магазине, который не отпустит вас от кассы, пока вы не расплатитесь. Немодальное — как уведомление на телефоне, которое можно проигнорировать и вернуться к нему позже.

В модальность особенно важна для:

  • 📌 Диалогов подтверждения (например, «Удалить документ?») — пользователь должен осознанно выбрать вариант.
  • 📌 Форм ввода с обязательными полями — пока данные не заполнены, переход к другим задачам заблокирован.
  • 📌 Обработки ошибок — если что-то пошло не так, система принудительно требует реакции.

📊 Как часто вы используете модальные окна в 1С?
Постоянно, это основа интерфейса
Только для критических действий
Редко, предпочитаю немодальные
Не знаю, что это такое

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

Рассмотрим два способа создания модальных окон: через конфигуратор и с помощью встроенного языка.

Способ 1: Настройка в конфигураторе

Если вы работаете с формой в режиме конфигуратора:

  1. Откройте нужную форму в редактировании.
  2. В свойствах формы найдите параметр Модальность (вкладка «Дополнительно»).
  3. Установите значение Истина.
  4. Сохраните и обновите конфигурацию.

⚠️ Внимание: Если форма открывается из другой формы, модальность может конфликтовать с родительским окном. В этом случае используйте метод ОткрытьФормуМодально() напрямую в коде.

Способ 2: Программное открытие

Для динамического открытия модальной формы используйте следующий код:

// Открытие модальной формы с возвратом результата

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

// Пример с диалогом подтверждения

Ответ = Вопрос("Подтвердите удаление документа!", РежимДиалогаВопрос.ДаНет);

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

// Действия при подтверждении

КонецЕсли;

🔹 Ключевые методы для модальных окон:

  • 📌 ОткрытьФормуМодально() — открывает форму и ждёт её закрытия.
  • 📌 ПоказатьВопрос() — диалог с кнопками «Да/Нет/Отмена».
  • 📌 ПоказатьПредупреждение() — модальное сообщение с кнопкой «ОК».
  • 📌 ПоказатьОповещениеМодально() — блокирующее уведомление (с версии 8.3.20).

Убедитесь, что без модальности нельзя обойтись|Проверьте, не блокирует ли окно критические процессы|Тестируйте на медленных ПК (модальность может "подвесить" интерфейс)|Добавьте обработку закрытия по Esc (если нужно)-->

Когда модальность вредна: типичные ошибки

Несмотря на очевидные преимущества, неправильное использование модальных окон может привести к:

  • 🚨 «Зависанию» интерфейса — если в модальном окне запущен долгий процесс (например, обмен данными), пользователь не сможет прервать его.
  • 🚨 Потере данных — при принудительном закрытии (через Диспетчер задач) несохранённая информация пропадёт.
  • 🚨 Путанице в логике — если модальные окна вложены друг в друга (например, из одного диалога открывается другой), пользователь может потерять контекст.

🔴 Пример плохого кода:

// ❌ Неправильно: долгая операция в модальном окне

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

НачатьТранзакцию();

ЗагрузитьБольшойОтчёт(); // Пользователь не может прервать процесс!

ЗафиксироватьТранзакцию();

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

Как исправить: Вынесите долгие операции в фоновые задачи или используйте немодальные окна с прогресс-баром.

Что делать, если модальное окно "зависло"?

Если окно не закрывается и блокирует работу, попробуйте:

1. Нажать Esc (иногда срабатывает даже без обработчика).

2. Использовать Диспетчер задач для принудительного закрытия процесса 1cv8.

3. В коде добавить тайм-аут: Попытка ... Исключение ... КонецПопытки с ограничением по времени.

Модальность в разных версиях 1С: что изменилось

Поведение модальных окон эволюционировало вместе с платформой. Рассмотрим ключевые изменения:

Версия платформы Особенности модальности Новые возможности
8.2 и ниже Модальные окна блокировали весь интерфейс, включая главное меню. Отсутствовал ПоказатьОповещениеМодально().
8.3 (до 8.3.19) Появилась поддержка вложенных модальных окон (но с ограничениями). Метод ОткрытьФормуМодально() возвращает результат.
8.3.20+ Добавлены ПоказатьОповещениеМодально() и ПоказатьВопросМодально(). Поддержка асинхронных модальных диалогов (через Ожидать()).

🔹 Важно для разработчиков: В версиях 8.3.20+ появилась возможность создавать псевдомодальные окна — они визуально блокируют интерфейс, но технически являются немодальными. Это полезно для:

  • 🔸 Уведомлений, которые не должны прерывать работу.
  • 🔸 Подсказок с возможностью закрытия без реакции.

💡

В версиях 8.3.20+ используйте ПоказатьОповещениеМодально() вместо Предупреждение() — оно поддерживает HTML-разметку и кнопки с кастомными действиями.

Практические примеры: где модальность необходима

Разберём реальные сценарии, в которых модальные окна незаменимы:

1. Подтверждение критических действий

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

Если НЕ Вопрос("Удалить документ №" + Документ.Номер + "?", РежимДиалогаВопрос.ДаНет) Тогда

Возврат;

КонецЕсли;

2. Ввод обязательных параметров

Если для продолжения работы нужны данные (например, дата отчёта), модальная форма гарантирует их ввод:

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

Если ОткрытьФормуМодально("ОбщаяФорма.ВводПериода", Параметры) Тогда

// Обработка введённых данных

КонецЕсли;

3. Обработка ошибок

При сбое обмена данными или валидации покажите модальное сообщение с деталями:

Попытка

ОбменДанными.Выполнить();

Исключение

ПоказатьОшибкуМодально(ОписаниеОшибки(), "Код ошибки: " + ИнформацияОбИсключении());

КонецПопытки;

💡

Модальные окна следует использовать только когда без них невозможно гарантировать корректность данных или безопасность операций. Во всех остальных случаях предпочитайте немодальные уведомления.

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

Если модальность вызывает проблемы (например, в веб-клиенте или на медленных ПК), рассмотрите альтернативы:

  • 🔄 Немодальные формы с колбэками:
    ОткрытьФорму("Справочник.Контрагенты.ФормаВыбора", ЭтотОбъект, "ПриВыбореКонтрагента");
  • 📱 Уведомления в статусной строке:
    ПоказатьОповещениеПользователя("Данные сохранены!", СтатусОповещения.Успех);
  • ⚙️ Фоновые задачи с прогрессом:
    ФоновоеЗадание = ФоновыеЗадания.Выполнить("ОбменДанными.ВыгрузитьДанные");

⚠️ Внимание: В веб-клиенте 1С модальные окна могут работать нестабильно из-за ограничений браузеров. Тестируйте такие сценарии на целевых платформах!

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

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

Да, но это создаёт вложенную модальность. Например, из обычной формы можно вызвать ОткрытьФормуМодально(), но пользователь не сможет вернуться к родительской форме, пока не закроет дочернюю. Используйте это осторожно — глубокая вложенность (3+ уровней) приводит к путанице.

Как закрыть модальное окно программно?

Используйте метод Закрыть() с параметром ЗначениеВозврата:

Закрыть(Истина); // Вернёт "Истина" в родительскую форму

Для диалогов (например, Вопрос()) закрытие происходит автоматически при выборе кнопки.

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

Это может происходить в двух случаях:

  1. Окно открыто не в основном потоке (например, из фонового задания).
  2. Используется управляемое приложение с настройкой РазрешитьНеМодальныеОкна = Истина (проверьте в конфигураторе).

Как сделать модальное окно с тайм-аутом?

В чистом виде модальные окна не поддерживают автозакрытие, но можно эмулировать это через Ожидать():

НачатьОжидание = ТекущаяДата();

Пока Истина Цикл

Если (ТекущаяДата() - НачатьОжидание) > 10 Тогда // 10 секунд

Закрыть(Ложь); // Закрываем с результатом "Ложь"

КонецЕсли;

Ожидать(0.1); // Проверяем каждые 0.1 секунды

КонецЦикла;

Работают ли модальные окна в мобильном клиенте 1С?

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

  • На Android/iOS модальные окна блокируют только текущий экран приложения (не всю систему).
  • Диалоги Вопрос()/Предупреждение() отображаются как нативные алерты.
  • Сложные формы (с таблицами, деревьями) могут работать медленно — оптимизируйте интерфейс.