Модальные окна 1с 8.3. Что делать если "использование модальных окон в данном режиме запрещено". Отказ от модальности

«Использование модальных окон в данном режиме запрещено» — такая ошибка сейчас начинает беспокоить пользователей и программистов 1С с приходом нового интерфейса платформы 1С 8.3 — « «.

Разработчики технологической платформы 1С идут в ногу со временем, стандартизируя своё решение под мировые стандарты разработки программного обеспечения. Все стандарты так или иначе сводятся к единому интерфейсу, близкому к веб-страницам.

Модальные и всплывающие (pop-up) окна считаются плохим тоном и уже давно перестали быть нормальным при разработке софта. Пользователи привыкли к работе «в одном окне».

Особенно часто мы видим ошибку модальности у следующих методов 1С:

  • Вопрос;
  • Предупреждение;
  • ОткрытьЗначение.

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

Быстрое исправление проблемы

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

Для этого зайдите в систему в режиме , откройте конфигурацию:

В открытой конфигурации вызовите контекстное меню, нажав на корень конфигурации правой кнопкой, выбрав «Свойства»:

Получите 267 видеоуроков по 1С бесплатно:

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

После этого сохраните и примените изменения, нажав клавишу «F7».

Правильное решение задачи

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

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

Встроенные операторы, которые вызывали модальные окна, необходимо заменить на дублирующие функции.

Например:

  • Предупреждение — ПоказатьПредупреждение;
  • Вопрос — ПоказатьВопрос (подробно — );
  • — ПоказатьВводЧисла.

При этом появился специализированный объект — ОписаниеОпевещения.

Пример замены:

Строка = "" ; ВвестиСтроку(Строка, "Введите строковое значение" ) Сообщить("Вы ввели " + Строка) ;

Необходимо заменить на:

Строка = "" ; ОписаниеОповещения = Новый ОписаниеОповещения("ТестовыйВводСтроки" , ЭтаФорма) ; ПоказатьВводСтроки(ОписаниеОповещения, Строка, "Введите строковое значение" ) ;

При этом добавить подобную процедуру на клиенте, которая отработает, когда значение будет введено пользователем:

&НаКлиенте Процедура ТестовыйВводСтроки(ПолученноеЗначение, ПереданныеПараметры) Экспорт Сообщить("Вы ввели " + Строка) ; КонецПроцедуры

Формы, которые разрабатываются внутри конфигурации, открываются точно так же. Достаточно заменить метод «ОткрытьФормуМодально» на «ОткрытьФорму», прописав описание оповещения и нужную для него новую процедуру.

Чтобы открывающейся формой закрыть доступ к вызываемой форме, достаточно в свойстве формы указать в свойстве «РежимОткрытияОкна» значение «Блокировать окно владельца»:

В платформе 1С версии 8.3 появился новый режим работы программы - без использования модальности. Точнее новых режимов появилось 2: без использования модальности и использовать модальность, но с предупреждением. А старый режим работы обозначен как использовать модальность.

Что это все значит? В ранних версиях платформы мы использовали различные модальные окошки и особо не задумывались об этом. Например, надо вывести предупреждение пользователю или надо задать вопрос или ввести какое-то значение или выбрать файл. Все это модальные окошки.

Что значит модальные? Это значит, что при вызове данного окна оно перекрывает собой все другие окна, то есть выводится на самый верх и блокирует работу с другими окнами до завершения работы с этим окном. Кроме блокировки окон останавливается выполнение кода ровно на том месте, где происходит вызов этого окна и продолжение выполнения кода осуществляется только после закрытия такого окна. С того места, где выполнение остановилось. Проиллюстрирую вызов модального окна на примере вызова формы выбора периода:

&НаКлиенте

СтандартнаяОбработка = Ложь;




Если Диалог.Редактировать() Тогда //Вызов модальной формы. Продолжение выполнения кода произойдет только после закрытия формы.
Элементы.Услуги.ТекущиеДанные.ДатаНачала = Диалог.Период.ДатаНачала;
Элементы.Услуги.ТекущиеДанные.ДатаОкончания = Диалог.Период.ДатаОкончания;
КонецЕсли;

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


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

Почему модальные окна это плохо? Теперь разберемся, почему фирма 1С решила отказаться от использования модальных окон. Ну прежде всего это следствие того, что платформа 1С может использоваться не только в обычном виде - в виде десктоп приложения, но и может запускаться в браузере и может запускаться в виде мобильного приложения.

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

Отдельный нюанс с браузерами для планшетных компьютеров и браузерами для телефонов. В большинстве случаев такие браузеры не поддерживают всплывающие окна. Не совместимы интерфейсы (мониторы и устройства ввода) таких устройств с всплывающими окнами.

Ну и наконец мобильное приложение 1С тоже не совсем сдружилось с модальными окнами.

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

&НаКлиенте
Процедура УслугиДатаНачалаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

СтандартнаяОбработка = Ложь;

Диалог = Новый ДиалогРедактированияСтандартногоПериода();
СтандартныйПериод = Новый СтандартныйПериод();

ДатаНачала = Элементы.Услуги.ТекущиеДанные.ДатаНачала;
ДатаОкончания = Элементы.Услуги.ТекущиеДанные.ДатаОкончания;

СтандартныйПериод.ДатаНачала = ДатаНачала;
СтандартныйПериод.ДатаОкончания = ДатаОкончания;
Диалог.Период = СтандартныйПериод;

ОписаниеОповещения = Новый ОписаниеОповещения("ОбработкаВыбораПериода",ЭтаФорма);

Диалог.Показать(ОписаниеОповещения)

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

&НаКлиенте
Процедура ОбработкаВыбораПериода(Период,Параметры) Экспорт

Если Период <> Неопределено Тогда

Элементы.Услуги.ТекущиеДанные.ДатаНачала = Период.ДатаНачала;
Элементы.Услуги.ТекущиеДанные.ДатаОкончания = Период.ДатаОкончания;

КонецЕсли;

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


Как мы видим вместо Редактировать() вызывается Показать(). И обработка события выбора уже в другой процедуре.

Итак, как обходится без модальности мы разобрались. Теперь разберемся для чего нужен режим использования модальности с предупреждением. По сути это такой переходный режим. Когда вы еще не успели переделать всю свою конфигурацию на режим без использования модальности, но уже стремитесь к этому. И при каждом вызове модального окна программа будет выдавать вам предупреждение, что в данном режиме нежелательно вызывать модальные окна.

Ну что ж отказываемся от модальности и осваиваем новые технологии для 1С работы в браузерах и мобильных компьютерах.

15
Для принудительного запуска предприятия в Обычном или Управляемом приложении используются следующие ключи: /RunModeOrdinaryApplication запуск толстого клиента в обычном режиме, несмотря на настройки конфигурации и пользователя, от имени которого 3
Нужно чтобы пользователи не могли менять настроенный для них интерфейс! Решение: Для отключения нужно в правах доступа у корневого элемента конфигурации убрать право " Сохранение данных пользователя ". Отключатся настройка панелей и пункт ме 2
В текущей работе пользователь обычно открывает несколько объектов. Это может быть документ, справочник, отчет и т.д. В предыдущем интерфейсе не было проблем быстро найти открытый объект и актуализировать его для дальнейшей работы используя окна или 2
В прошлой статье: Установка адресного классификатора (KLADR) в 1С я рассказал Вам что такое Кладр и как его загрузить в 1С обычные формы (8.0-8.2). В данной статье я расскажу как загрузить Адресный классификатор (KLADR) в управляемом интерфейсе и 2
Часто разрабатывая некую конфигурацию, пользователи хотят прикреплять к элементу справочника фото и чтобы они хранились в базе данных. В этой статье я расскажу как к справочнику объекты строительства подключить хранилище фотографий в виде справочни

Реализовано в версии 8.3.3.641.

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

С появлением веб-клиента и с переходом 1С:Предприятия на мобильные платформы, модальные окна оказались источником большого количества неудобств и проблем, зачастую неразрешимых.

Как правило "десктопные" браузеры лучше или хуже, но поддерживают модальные окна и открывают их в новом окне браузера как "всплывающее окно":

Но из-за того, что технология всплывающих окон массово используется в Интернете для размещения рекламы, практически во всех браузерах стандартно отключен показ всплывающих окон. В подавляющем большинстве случаев без изменения этой настройки браузера работа веб-клиента становится невозможной.

Другая проблема заключается в том, что мобильные браузеры вообще не поддерживают модальные окна. И чтобы 1С:Предприятие могло в них работать, в веб-клиенте был реализован специальный механизм. Это достаточно сложный механизм и он, к сожалению, не покрывает все необходимые ситуации. В результате работа конфигураций на iPad, например, обеспечивается с большим трудом.

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

При этом не происходит отказа от функциональности, которая обеспечивалась ранее модальными окнами. Но эта функциональность реализуется другими технологиями, которые не препятствуют работе 1С:Предприятия в браузерах.

В новом режиме работы интерфейса окно, которое раньше было бы модальным, рисуется в пределах родительского окна, и точно так же блокирует весь остальной интерфейс веб-клиента:

В результате:

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

Естественно, чудес не бывает, и новый режим работы невозможно включить "взмахом волшебной палочки". Требуется изменение логики работы с новыми, блокирующими окнами. Но хорошая новость заключается в том, что эти изменения несложные, и есть возможность проконтролировать все "подозрительные" места программы. В платформе реализован специальный механизм, позволяющий на этапе разработки проверить, что вся конфигурация использует новые механизмы и будет работать без модальных окон.

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

А значит алгоритм, который раньше являлся одним целым, теперь придётся разделить на две части. Одну, которая заканчивается открытием блокирующего окна, и вторую, которая будет выполнена тогда, когда пользователь закроет это окно. Чтобы система знала, с какого места продолжать исполнение программного кода, блокирующему окну передаётся имя процедуры, которая должна быть выполнена тогда, когда пользователь закроет это окно.

Суть этих изменений проще всего увидеть на примере. Старая процедура, открывавшая модальное окно и обрабатывавшая полученные им данные, могла выглядеть так:

В новом варианте для формы ФормаВводТекста (которая будет открываться в блокирующем окне) нужно установить свойство РежимОткрытияОкна в значение БлокироватьВесьИнтерфейс . Это обеспечит модальность для пользователя:

А программный код вместо одной процедуры, как раньше, будет содержать уже две процедуры:

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

Когда пользователь введёт данные и закроет форму, они будут обработаны в указанной нами второй процедуре, в которую мы просто перенесли "старый" код, обрабатывающий полученные данные.

Кроме форм, которые разработчик может открыть в модальном режиме (по своему желанию), существуют методы встроенного языка, которые всегда, независимо от желания разработчика, открывали модальные формы для ввода или выбора данных. Например, метод ВвестиЗначение() .

Использовать такие методы в немодальном режиме ещё проще. Для всех таких методов в платформе сделаны методы-дублёры, при вызове которых нужно так же указать местонахождение процедуры, которая будет выполнена после того, как пользователь закроет окно.

Например, ниже показано использование старого метода ВвестиЗначение() и его нового метода-дублёра ПоказатьВводЗначения() :

Нужно сказать что, помимо перечисленных случаев, некоторые механизмы платформы тоже используют модальные окна для взаимодействия с пользователем. И это уже никак не зависит от действий разработчика.

Поэтому все такие системные диалоги платформы также переведены на немодальный вариант работы.

Планируется постепенный отказ от использования модальных окон в прикладных решениях. Поэтому для совместимости с прикладными решениями, написанными ранее, в платформе сохранена возможность работы в старом варианте интерфейса, с использованием модальных окон.

В Синтаксис-Помощнике для этих команд указано, что в случае, если для конфигурации свойство РежимИспользованияМодальности установлено в НеИспользовать , то следует использовать в программном коде другие команды, такие как ПоказатьВопрос(), ПоказатьПредупреждение() , ПоказатьВводЧисла():

Для работы с этими ситуациями в программе 1С 8.3 предусмотрен новый системный объект «ОписаниеОповещения», который используется для описания вызова процедуры программного модуля при наступлении какого-либо ожидаемого события, такого как закрытие формы или немодального диалога:

Это взгляд на проблему «изнутри» для тех, кто хочет разобраться с первопричиной. В первую очередь для программистов 1С. Как в этой ситуации обычным пользователям исправить ошибку без проработки программного кода? Есть очень простой метод.

Инструкция по исправлению ошибки для обычных пользователей

Шаг 1. Завершить работу:

Шаг 2. Возвращаемся в стартовое меню для запуска конфигурации. Выбираем пункт меню «Конфигурация»:

Шаг 3. Открываем «Конфигуратор»: на верхней панели находим кнопку «Конфигурация», и в предложенном списке выбираем меню «Открыть конфигурацию»:

Шаг 4. Устанавливаем курсор на Конфигурацию и по правой кнопке мышки вызываем контекстное меню, в котором выбираем пункт «Свойства»:

Шаг 5. Открываем форму «Свойства»:

Шаг 6. Находим строчку «Режим использования модальности” (внизу списка):

По умолчанию в программе 1С 8.3 стоит значение «Не использовать». Переводим значение «Не использовать» в значение « Использовать»:

Результат:

Если ошибка «Использование модальных окон в данном режиме запрещено» в 1С 8.3 ушла, то можно работать дальше. Обычно, так и происходит.

Но если ошибка модальности в 1С осталась после выполнения всех этих действий, то следует обратиться к программистам, обслуживающим и поддерживающим вашу программу 1С.

Как работать в интерфейсе “Такси”, как сделать настройку рабочего места “под себя”, настройка панели навигации Избранное, как осуществлять полнотекстовый поиск, приемы работы с журналами, кнопка “выбора” в документах, передача ссылок на документы, верификация и другие возможности в новом интерфейсе – все это можно узнать из нашего видео:

Более подробно о том, как правильно и быстро организовать навигацию по программе 1С 8.3, используя новый интерфейс ТАКСИ, о новых возможностях в использовании привычных инструментов, таких как встроенный калькулятор, календарь, сравнение файлов, передача ссылок на документы коллегам рассмотрено на нашем курсе ““


Поставьте вашу оценку этой статье:

Публикации по теме