Термин «модально» в контексте 1С:Предприятие часто вызывает вопросы даже у опытных разработчиков. Если вы сталкивались с сообщениями вроде ОткрытьФормуМодально() или ПоказатьОповещениеМодально(), но не до конца понимаете, чем это отличается от обычного открытия формы — эта статья для вас.
В 1С модальность определяет, как форма или диалоговое окно взаимодействует с пользователем и другими элементами интерфейса. Проще говоря, модальное окно блокирует работу с остальной программой, пока пользователь его не закроет. Это не просто техническая деталь, а инструмент управления вниманием пользователя — например, когда нужно гарантировать, что он введёт данные или подтвердит действие, прежде чем продолжить работу.
В этой статье мы разберём:
- 🔹 Чем модальные окна отличаются от немодальных (и когда что использовать)
- 🔹 Как создавать модальные формы в конфигураторе и через встроенный язык
- 🔹 Типичные ошибки, которые приводят к «зависанию» интерфейса
- 🔹 Примеры кода для разных версий платформы (8.3, 8.3.20+)
Модальное vs немодальное: ключевые различия
Основное отличие модального окна от немодального — контроль над потоком работы пользователя. Давайте сравним их поведение:
| Характеристика | Модальное окно | Немодальное окно |
|---|---|---|
| Блокировка интерфейса | Да, пока окно открыто, другие формы недоступны | Нет, можно переключаться между окнами |
| Использование в коде | ОткрытьФормуМодально(), ПоказатьВопрос() |
ОткрытьФорму(), ПоказатьОповещение() |
| Типичные сценарии | Ввод критических данных, подтверждение действий, ошибки | Справочная информация, лог операций, фоновые процессы |
| Возврат значения | Можно получить результат (например, Да/Нет) |
Нет прямого возврата, требуется обработка событий |
👉 Пример из жизни: модальное окно — как кассир в магазине, который не отпустит вас от кассы, пока вы не расплатитесь. Немодальное — как уведомление на телефоне, которое можно проигнорировать и вернуться к нему позже.
В 1С модальность особенно важна для:
- 📌 Диалогов подтверждения (например, «Удалить документ?») — пользователь должен осознанно выбрать вариант.
- 📌 Форм ввода с обязательными полями — пока данные не заполнены, переход к другим задачам заблокирован.
- 📌 Обработки ошибок — если что-то пошло не так, система принудительно требует реакции.
Как создать модальное окно в 1С: пошаговая инструкция
Рассмотрим два способа создания модальных окон: через конфигуратор и с помощью встроенного языка.
Способ 1: Настройка в конфигураторе
Если вы работаете с формой в режиме конфигуратора:
- Откройте нужную форму в редактировании.
- В свойствах формы найдите параметр
Модальность(вкладка «Дополнительно»). - Установите значение
Истина. - Сохраните и обновите конфигурацию.
⚠️ Внимание: Если форма открывается из другой формы, модальность может конфликтовать с родительским окном. В этом случае используйте метод ОткрытьФормуМодально() напрямую в коде.
Способ 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+ уровней) приводит к путанице.
Как закрыть модальное окно программно?
Используйте метод Закрыть() с параметром ЗначениеВозврата:
Закрыть(Истина); // Вернёт "Истина" в родительскую форму
Для диалогов (например, Вопрос()) закрытие происходит автоматически при выборе кнопки.
Почему модальное окно не блокирует другие формы?
Это может происходить в двух случаях:
- Окно открыто не в основном потоке (например, из фонового задания).
- Используется управляемое приложение с настройкой
РазрешитьНеМодальныеОкна = Истина(проверьте в конфигураторе).
Как сделать модальное окно с тайм-аутом?
В чистом виде модальные окна не поддерживают автозакрытие, но можно эмулировать это через Ожидать():
НачатьОжидание = ТекущаяДата();
Пока Истина Цикл
Если (ТекущаяДата() - НачатьОжидание) > 10 Тогда // 10 секунд
Закрыть(Ложь); // Закрываем с результатом "Ложь"
КонецЕсли;
Ожидать(0.1); // Проверяем каждые 0.1 секунды
КонецЦикла;
Работают ли модальные окна в мобильном клиенте 1С?
Да, но с ограничениями:
- На Android/iOS модальные окна блокируют только текущий экран приложения (не всю систему).
- Диалоги
Вопрос()/Предупреждение()отображаются как нативные алерты. - Сложные формы (с таблицами, деревьями) могут работать медленно — оптимизируйте интерфейс.