Модальные окна в 1С 8.3: свойство конфигурации, формы и переделка кода
Содержание
Режим модальности в 1С 8.3 включают в Конфигураторе: откройте конфигурацию, вызовите свойства корня дерева и в группе «Совместимость» поставьте у свойства «Режим использования модальности» значение «Использовать». Затем обновите конфигурацию базы данных (F7). Настройка действует на всю информационную базу и на всех пользователей сразу.
Обычно к этому приходят после ошибки Использование модальных окон в данном режиме запрещено!, которая всплывает при открытии старой внешней обработки или самописного отчёта. Включить модальность можно за пару минут, но в типовой конфигурации это не всегда лучший выход. Разберём оба пути: переключить свойство и переписать код так, чтобы он работал без модальных окон.
Что такое модальность в 1С и почему её отключили
Модальное окно останавливает выполнение кода до тех пор, пока пользователь его не закроет. Классический пример — Вопрос("Удалить документ?", РежимДиалогаВопрос.ДаНет): строка ниже не выполнится, пока человек не нажмёт «Да» или «Нет».
В толстом клиенте это работало без проблем. С приходом веб-клиента и мобильной платформы всё изменилось:
- 🌐 браузеры не дают сайтам по-настоящему останавливать скрипт ради своего окна, а всплывающие окна режут блокировщики;
- 📱 мобильные ОС вообще не поддерживают блокирующие диалоги в том виде, как их понимала 1С;
- ⏳ синхронное ожидание в браузере «подвешивает» вкладку.
Поэтому в платформе 8.3.3 появилось свойство конфигурации «Режим использования модальности». Всё новое типовое ПО фирмы 1С (Бухгалтерия 3.0, ЗУП 3.1, УТ 11, ERP) выпускается со значением «Не использовать». Окна в них по-прежнему могут блокировать работу, но код не замирает: он продолжает выполняться, а реакцию на ответ пользователя обрабатывает отдельная процедура-оповещение.
| Значение свойства | Что происходит при модальном вызове | Когда выбирать |
|---|---|---|
| Использовать | Окно открывается, код ждёт ответа, как в 8.2 | Старая самописная база, только тонкий и толстый клиент |
| Использовать с предупреждениями | Окно работает, но проверка модулей выдаёт предупреждения по каждому модальному вызову | Переходный период: база работает, программист видит, что переделать |
| Не использовать | Модальный вызов прерывается ошибкой | Типовые конфигурации, веб-клиент, мобильные приложения |
Режим «Использовать с предупреждениями» — удобный компромисс для своих разработок: пользователи работают как раньше, а в Конфигураторе видно весь список мест, которые надо переписать.
Как включить режим модальности в Конфигураторе
Свойство меняется у корневого элемента конфигурации. Права администратора в базе обязательны.
- Запустите базу в режиме «Конфигуратор».
- Откройте дерево:
Конфигурация → Открыть конфигурацию. - Щёлкните правой кнопкой по самому верхнему элементу дерева (название конфигурации) и выберите «Свойства».
- В палитре свойств найдите группу «Совместимость».
- В поле «Режим использования модальности» выберите «Использовать» или «Использовать с предупреждениями».
- Сохраните изменения и выполните
Конфигурация → Обновить конфигурацию базы данных(F7). - Перезапустите сеансы пользователей: новое значение подхватывается при входе в программу.
Если платформа попросит завершить работу пользователей , договоритесь с ними о времени: открытые сеансы оборвутся, несохранённые документы пропадут.
Если поле недоступно для изменения
В типовой конфигурации, стоящей на поддержке без возможности изменения, свойства корня серые. Чтобы их поменять, придётся включить возможность изменения: Конфигурация → Поддержка → Настройка поддержки → кнопка «Включить возможность изменения».
После этого каждое обновление типовой станет дольше: платформа будет сравнивать и объединять ваш вариант с новым релизом поставщика. Перед любыми правками конфигурации сделайте резервную копию базы через Администрирование → Выгрузить информационную базу.
Для типовых решений правильнее оставить «Не использовать» и переделать саму внешнюю обработку .
Параметры запуска клиента не помогают
Часто ищут ключ командной строки 1cv8 или галочку в окне запуска, которая «разрешит модальность». Такого параметра нет. Режим задаёт только конфигурация — значит, его выбирает разработчик, а не пользователь.
Что действительно зависит от запуска:
- 🖥️ тип клиента. При значении «Использовать» модальные окна стабильно работают в тонком и толстом клиенте. В веб-клиенте многое упирается в браузер;
- 🔌 режим совместимости. Если у конфигурации стоит режим совместимости с 8.2 или ранними 8.3, часть ограничений не действует. Менять его ради модальности не стоит: это меняет поведение всей программы.
Блокировка окна и интерфейса через свойства формы
Заголовок «настройка блокировки интерфейса» обычно означает другое свойство — уже не конфигурации, а конкретной формы. Это «Режим открытия окна». Он отвечает за то, что пользователь может нажимать, пока форма открыта, но код при этом не останавливает.
Где найти: в Конфигураторе откройте форму, выделите корневой элемент «Форма» в дереве элементов и откройте палитру свойств.
| Значение | Что блокирует | Пример |
|---|---|---|
| Независимый | Ничего: окно живёт само по себе | Обычная форма списка или документа |
| Блокировать окно владельца | Только форму, из которой открыли окно | Подбор товаров в документ, ввод реквизитов |
| Блокировать весь интерфейс | Все окна программы, кроме этого | Обязательное подтверждение, ввод пароля |
То же самое задают из кода параметром метода ОткрытьФорму() или свойством формы РежимОткрытияОкна перед её открытием. Именно так в современных конфигурациях делают окна, которые ведут себя «как модальные», не нарушая запрета.
«Блокировать весь интерфейс» используйте редко. Пользователь не сможет даже переключиться на соседний документ, а это раздражает.
Как переписать модальные вызовы на немодальные
Если вы программист или поддерживаете свою обработку, надёжнее убрать модальность из кода. Тогда обработка заработает в любой базе, в том числе в веб-клиенте.
Таблица замены методов
| Модальный метод | Немодальная замена (8.3.3+) | Асинхронный вариант (8.3.18+) |
|---|---|---|
Предупреждение() | ПоказатьПредупреждение() | ПредупреждениеАсинх() |
Вопрос() | ПоказатьВопрос() | ВопросАсинх() |
ВвестиЧисло() | ПоказатьВводЧисла() | ВвестиЧислоАсинх() |
ВвестиСтроку() | ПоказатьВводСтроки() | ВвестиСтрокуАсинх() |
ВвестиДату() | ПоказатьВводДаты() | ВвестиДатуАсинх() |
ОткрытьФормуМодально() | ОткрытьФорму() с оповещением о закрытии | — |
ДиалогВыбораФайла.Выбрать() | ДиалогВыбораФайла.Показать() | ДиалогВыбораФайла.ВыбратьАсинх() |
Пример: вопрос пользователю через оповещение
Было (не работает при «Не использовать»):
&НаКлиенте
Процедура Удалить(Команда)
Ответ = Вопрос("Удалить выбранные строки?", РежимДиалогаВопрос.ДаНет);
Если Ответ = КодВозвратаДиалога.Да Тогда
УдалитьНаСервере();
КонецЕсли;
КонецПроцедуры
Стало — код разделён на две процедуры. Вторая вызывается, когда пользователь ответит:
&НаКлиенте
Процедура Удалить(Команда)
Оповещение = Новый ОписаниеОповещения("УдалитьЗавершение", ЭтотОбъект);
ПоказатьВопрос(Оповещение, "Удалить выбранные строки?", РежимДиалогаВопрос.ДаНет);
КонецПроцедуры
&НаКлиенте
Процедура УдалитьЗавершение(Ответ, ДополнительныеПараметры) Экспорт
Если Ответ = КодВозвратаДиалога.Да Тогда
УдалитьНаСервере();
КонецЕсли;
КонецПроцедуры
Процедура-обработчик обязательно Экспорт, иначе платформа её не вызовет.
Пример: форма вместо ОткрытьФормуМодально
Форма выбора, которая блокирует только окно документа и возвращает результат при закрытии:
&НаКлиенте
Процедура ВыбратьПериод(Команда)
Оповещение = Новый ОписаниеОповещения("ВыбратьПериодЗавершение", ЭтотОбъект);
ОткрытьФорму("ОбщаяФорма.ВыборПериода", , ЭтаФорма, , , , Оповещение,
РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры
&НаКлиенте
Процедура ВыбратьПериодЗавершение(Результат, ДополнительныеПараметры) Экспорт
Если Результат = Неопределено Тогда
Возврат; // пользователь закрыл окно без выбора
КонецЕсли;
Объект.Период = Результат;
КонецПроцедуры
Внутри открытой формы результат передают методом Закрыть(Значение). Имя ОбщаяФорма.ВыборПериода здесь условное — подставьте свою форму.
Пример: то же самое через Асинх и Ждать
С платформы 8.3.18 код снова читается сверху вниз, без разрыва на две процедуры:
&НаКлиенте
Асинх Процедура Удалить(Команда)
Ответ = Ждать ВопросАсинх("Удалить выбранные строки?", РежимДиалогаВопрос.ДаНет);
Если Ответ = КодВозвратаДиалога.Да Тогда
УдалитьНаСервере();
КонецЕсли;
КонецПроцедуры
Это не модальный вызов: интерфейс не замирает, ошибка о запрете не возникает. Но работает вариант, только если режим совместимости конфигурации не ниже 8.3.18.
Инструменты Конфигуратора для поиска модальных вызовов
Перебирать модули вручную не нужно:
- 🔍
Конфигурация → Проверка конфигурации— отметьте флажок поиска использования модальности, и платформа выведет список всех мест; - 🛠️ в меню рефакторинга модуля (контекстное меню текста) есть команды анализа модальных вызовов и преобразования модального вызова в немодальный. Автозамена справляется с простыми случаями вроде
Предупреждение(); вложенные вопросы в циклах придётся разбирать руками.
Модальность в веб-клиенте и мобильном приложении
Веб-клиент — главная причина, по которой от модальности отказались. Здесь есть свои нюансы.
Веб-клиент. Даже при значении «Использовать» модальные окна в браузере ведут себя менее предсказуемо, чем в тонком клиенте. Окно может не открыться, если браузер блокирует всплывающие окна для адреса публикации. Решение — разрешить всплывающие окна для сайта базы в настройках браузера. Это касается всех основных браузеров: Chrome, Edge, Firefox, Яндекс Браузер.
Мобильное приложение. Мобильная платформа модальные вызовы не поддерживает вообще. Код для мобильного клиента пишут только через оповещения или Асинх/Ждать.
Тонкий клиент через интернет . Если база опубликована на веб-сервере, а пользователи заходят тонким клиентом по адресу, модальные окна работают так же, как при локальном подключении. Ограничения браузера здесь не действуют.
Если в организации часть людей работает в браузере, не включайте «Использовать» как способ «починить» обработку. В тонком клиенте ошибка уйдёт, а в веб-клиенте поведение останется нестабильным.
Синхронные вызовы расширений и внешних компонент
Рядом с режимом модальности в группе «Совместимость» стоит ещё одно свойство — «Режим использования синхронных вызовов расширений платформы и внешних компонент». Его часто путают с первым.
Оно касается работы с файлами на компьютере пользователя, буфером обмена, криптографией и внешними компонентами (например, драйверами торгового оборудования). При значении «Не использовать» такие методы нужно вызывать в немодальном варианте: НачатьПодключениеВнешнейКомпоненты() вместо ПодключитьВнешнююКомпоненту() и т. п.
Если ошибка в сообщении упоминает «синхронные методы», а не «модальные окна», менять нужно это свойство или переписывать код работы с файлами. Режим модальности тут ни при чём.
Диагностика: почему окно не появляется или выдаёт ошибку
Большая часть проблем укладывается в несколько сценариев. Найдите свой симптом:
Порядок проверки, если причина неочевидна
- Посмотрите текст ошибки полностью и строку модуля, на которую она указывает (кнопка «Подробно» в окне ошибки).
- Уточните, в каком клиенте работает пользователь: тонкий, толстый или браузер.
- Проверьте значение свойства у корня конфигурации в Конфигураторе.
- Если ошибка во внешней обработке — откройте её в Конфигураторе через
Файл → Открытьи найдите модальные методы поиском по тексту модуля. - Если в обработке модальных вызовов нет, проверьте общие модули, которые она вызывает, и подписки на события.