Модальные окна в 1С 8.3: свойство конфигурации, формы и переделка кода

· 9 мин

Содержание

Режим модальности в 1С 8.3 включают в Конфигураторе: откройте конфигурацию, вызовите свойства корня дерева и в группе «Совместимость» поставьте у свойства «Режим использования модальности» значение «Использовать». Затем обновите конфигурацию базы данных (F7). Настройка действует на всю информационную базу и на всех пользователей сразу.

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

Что такое модальность в 1С и почему её отключили

Модальное окно останавливает выполнение кода до тех пор, пока пользователь его не закроет. Классический пример — Вопрос("Удалить документ?", РежимДиалогаВопрос.ДаНет): строка ниже не выполнится, пока человек не нажмёт «Да» или «Нет».

В толстом клиенте это работало без проблем. С приходом веб-клиента и мобильной платформы всё изменилось:

  • 🌐 браузеры не дают сайтам по-настоящему останавливать скрипт ради своего окна, а всплывающие окна режут блокировщики;
  • 📱 мобильные ОС вообще не поддерживают блокирующие диалоги в том виде, как их понимала 1С;
  • ⏳ синхронное ожидание в браузере «подвешивает» вкладку.

Поэтому в платформе 8.3.3 появилось свойство конфигурации «Режим использования модальности». Всё новое типовое ПО фирмы 1С (Бухгалтерия 3.0, ЗУП 3.1, УТ 11, ERP) выпускается со значением «Не использовать». Окна в них по-прежнему могут блокировать работу, но код не замирает: он продолжает выполняться, а реакцию на ответ пользователя обрабатывает отдельная процедура-оповещение.

Значение свойстваЧто происходит при модальном вызовеКогда выбирать
ИспользоватьОкно открывается, код ждёт ответа, как в 8.2Старая самописная база, только тонкий и толстый клиент
Использовать с предупреждениямиОкно работает, но проверка модулей выдаёт предупреждения по каждому модальному вызовуПереходный период: база работает, программист видит, что переделать
Не использоватьМодальный вызов прерывается ошибкойТиповые конфигурации, веб-клиент, мобильные приложения

Режим «Использовать с предупреждениями» — удобный компромисс для своих разработок: пользователи работают как раньше, а в Конфигураторе видно весь список мест, которые надо переписать.

Как включить режим модальности в Конфигураторе

Свойство меняется у корневого элемента конфигурации. Права администратора в базе обязательны.

  1. Запустите базу в режиме «Конфигуратор».
  2. Откройте дерево: Конфигурация → Открыть конфигурацию.
  3. Щёлкните правой кнопкой по самому верхнему элементу дерева (название конфигурации) и выберите «Свойства».
  4. В палитре свойств найдите группу «Совместимость».
  5. В поле «Режим использования модальности» выберите «Использовать» или «Использовать с предупреждениями».
  6. Сохраните изменения и выполните Конфигурация → Обновить конфигурацию базы данных (F7).
  7. Перезапустите сеансы пользователей: новое значение подхватывается при входе в программу.

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

Если поле недоступно для изменения

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

После этого каждое обновление типовой станет дольше: платформа будет сравнивать и объединять ваш вариант с новым релизом поставщика. Перед любыми правками конфигурации сделайте резервную копию базы через Администрирование → Выгрузить информационную базу.

Для типовых решений правильнее оставить «Не использовать» и переделать саму внешнюю обработку .

Параметры запуска клиента не помогают

Часто ищут ключ командной строки 1cv8 или галочку в окне запуска, которая «разрешит модальность». Такого параметра нет. Режим задаёт только конфигурация — значит, его выбирает разработчик, а не пользователь.

Что действительно зависит от запуска:

  • 🖥️ тип клиента. При значении «Использовать» модальные окна стабильно работают в тонком и толстом клиенте. В веб-клиенте многое упирается в браузер;
  • 🔌 режим совместимости. Если у конфигурации стоит режим совместимости с 8.2 или ранними 8.3, часть ограничений не действует. Менять его ради модальности не стоит: это меняет поведение всей программы.

Блокировка окна и интерфейса через свойства формы

Заголовок «настройка блокировки интерфейса» обычно означает другое свойство — уже не конфигурации, а конкретной формы. Это «Режим открытия окна». Он отвечает за то, что пользователь может нажимать, пока форма открыта, но код при этом не останавливает.

Где найти: в Конфигураторе откройте форму, выделите корневой элемент «Форма» в дереве элементов и откройте палитру свойств.

ЗначениеЧто блокируетПример
НезависимыйНичего: окно живёт само по себеОбычная форма списка или документа
Блокировать окно владельцаТолько форму, из которой открыли окноПодбор товаров в документ, ввод реквизитов
Блокировать весь интерфейсВсе окна программы, кроме этогоОбязательное подтверждение, ввод пароля

То же самое задают из кода параметром метода ОткрытьФорму() или свойством формы РежимОткрытияОкна перед её открытием. Именно так в современных конфигурациях делают окна, которые ведут себя «как модальные», не нарушая запрета.

«Блокировать весь интерфейс» используйте редко. Пользователь не сможет даже переключиться на соседний документ, а это раздражает.

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

Если вы программист или поддерживаете свою обработку, надёжнее убрать модальность из кода. Тогда обработка заработает в любой базе, в том числе в веб-клиенте.

Таблица замены методов

Модальный методНемодальная замена (8.3.3+)Асинхронный вариант (8.3.18+)
Предупреждение()ПоказатьПредупреждение()ПредупреждениеАсинх()
Вопрос()ПоказатьВопрос()ВопросАсинх()
ВвестиЧисло()ПоказатьВводЧисла()ВвестиЧислоАсинх()
ВвестиСтроку()ПоказатьВводСтроки()ВвестиСтрокуАсинх()
ВвестиДату()ПоказатьВводДаты()ВвестиДатуАсинх()
ОткрытьФормуМодально()ОткрытьФорму() с оповещением о закрытии—
ДиалогВыбораФайла.Выбрать()ДиалогВыбораФайла.Показать()ДиалогВыбораФайла.ВыбратьАсинх()

Пример: вопрос пользователю через оповещение

Было (не работает при «Не использовать»):

&НаКлиенте
Процедура Удалить(Команда)
	Ответ = Вопрос("Удалить выбранные строки?", РежимДиалогаВопрос.ДаНет);
	Если Ответ = КодВозвратаДиалога.Да Тогда
		УдалитьНаСервере();
	КонецЕсли;
КонецПроцедуры

Стало — код разделён на две процедуры. Вторая вызывается, когда пользователь ответит:

&НаКлиенте
Процедура Удалить(Команда)
	Оповещение = Новый ОписаниеОповещения("УдалитьЗавершение", ЭтотОбъект);
	ПоказатьВопрос(Оповещение, "Удалить выбранные строки?", РежимДиалогаВопрос.ДаНет);
КонецПроцедуры

&НаКлиенте
Процедура УдалитьЗавершение(Ответ, ДополнительныеПараметры) Экспорт
	Если Ответ = КодВозвратаДиалога.Да Тогда
		УдалитьНаСервере();
	КонецЕсли;
КонецПроцедуры

Процедура-обработчик обязательно Экспорт, иначе платформа её не вызовет.

Пример: форма вместо ОткрытьФормуМодально

Форма выбора, которая блокирует только окно документа и возвращает результат при закрытии:

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

&НаКлиенте
Процедура ВыбратьПериодЗавершение(Результат, ДополнительныеПараметры) Экспорт
	Если Результат = Неопределено Тогда
		Возврат; // пользователь закрыл окно без выбора
	КонецЕсли;
	Объект.Период = Результат;
КонецПроцедуры

Внутри открытой формы результат передают методом Закрыть(Значение). Имя ОбщаяФорма.ВыборПериода здесь условное — подставьте свою форму.

Пример: то же самое через Асинх и Ждать

С платформы 8.3.18 код снова читается сверху вниз, без разрыва на две процедуры:

&НаКлиенте
Асинх Процедура Удалить(Команда)
	Ответ = Ждать ВопросАсинх("Удалить выбранные строки?", РежимДиалогаВопрос.ДаНет);
	Если Ответ = КодВозвратаДиалога.Да Тогда
		УдалитьНаСервере();
	КонецЕсли;
КонецПроцедуры

Это не модальный вызов: интерфейс не замирает, ошибка о запрете не возникает. Но работает вариант, только если режим совместимости конфигурации не ниже 8.3.18.

Инструменты Конфигуратора для поиска модальных вызовов

Перебирать модули вручную не нужно:

  • 🔍 Конфигурация → Проверка конфигурации — отметьте флажок поиска использования модальности, и платформа выведет список всех мест;
  • 🛠️ в меню рефакторинга модуля (контекстное меню текста) есть команды анализа модальных вызовов и преобразования модального вызова в немодальный. Автозамена справляется с простыми случаями вроде Предупреждение(); вложенные вопросы в циклах придётся разбирать руками.

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

Веб-клиент — главная причина, по которой от модальности отказались. Здесь есть свои нюансы.

Веб-клиент. Даже при значении «Использовать» модальные окна в браузере ведут себя менее предсказуемо, чем в тонком клиенте. Окно может не открыться, если браузер блокирует всплывающие окна для адреса публикации. Решение — разрешить всплывающие окна для сайта базы в настройках браузера. Это касается всех основных браузеров: Chrome, Edge, Firefox, Яндекс Браузер.

Мобильное приложение. Мобильная платформа модальные вызовы не поддерживает вообще. Код для мобильного клиента пишут только через оповещения или Асинх/Ждать.

Тонкий клиент через интернет . Если база опубликована на веб-сервере, а пользователи заходят тонким клиентом по адресу, модальные окна работают так же, как при локальном подключении. Ограничения браузера здесь не действуют.

Если в организации часть людей работает в браузере, не включайте «Использовать» как способ «починить» обработку. В тонком клиенте ошибка уйдёт, а в веб-клиенте поведение останется нестабильным.

Синхронные вызовы расширений и внешних компонент

Рядом с режимом модальности в группе «Совместимость» стоит ещё одно свойство — «Режим использования синхронных вызовов расширений платформы и внешних компонент». Его часто путают с первым.

Оно касается работы с файлами на компьютере пользователя, буфером обмена, криптографией и внешними компонентами (например, драйверами торгового оборудования). При значении «Не использовать» такие методы нужно вызывать в немодальном варианте: НачатьПодключениеВнешнейКомпоненты() вместо ПодключитьВнешнююКомпоненту() и т. п.

Если ошибка в сообщении упоминает «синхронные методы», а не «модальные окна», менять нужно это свойство или переписывать код работы с файлами. Режим модальности тут ни при чём.

Диагностика: почему окно не появляется или выдаёт ошибку

Большая часть проблем укладывается в несколько сценариев. Найдите свой симптом:

Диагностика: выберите симптом

Порядок проверки, если причина неочевидна

  1. Посмотрите текст ошибки полностью и строку модуля, на которую она указывает (кнопка «Подробно» в окне ошибки).
  2. Уточните, в каком клиенте работает пользователь: тонкий, толстый или браузер.
  3. Проверьте значение свойства у корня конфигурации в Конфигураторе.
  4. Если ошибка во внешней обработке — откройте её в Конфигураторе через Файл → Открыть и найдите модальные методы поиском по тексту модуля.
  5. Если в обработке модальных вызовов нет, проверьте общие модули, которые она вызывает, и подписки на события.

Частые вопросы

Можно ли включить модальность только для одного пользователя?
Нет. Режим использования модальности — свойство всей конфигурации, оно действует одинаково для всех пользователей и всех сеансов этой базы.
Слетит ли настройка после обновления типовой конфигурации?
Если вы включили возможность изменения и поменяли свойство, при обновлении платформа покажет различие с конфигурацией поставщика. Какое значение останется — решаете вы на этапе сравнения и объединения.
Почему старая обработка работала, а после перехода на новую базу перестала?
Старая база, скорее всего, была на 8.2 или в режиме совместимости, где модальность разрешена. Новая типовая выпущена со значением «Не использовать», и те же вызовы теперь запрещены.
Влияет ли режим модальности на скорость работы?
Напрямую нет. Но немодальный код в веб-клиенте ведёт себя стабильнее: вкладка браузера не замирает в ожидании ответа.
Можно ли открыть внешнюю обработку с модальными окнами в веб-клиенте?
Только если в конфигурации разрешена модальность, и даже тогда результат зависит от браузера. Надёжный путь — переписать обработку через оповещения.