Как в 1с разрешить открытие модальных окон. Почему возникает ошибка "Использование модальных окон в данном режиме запрещено"? Правильное решение задачи

В свойствах конфигурации на платформе 1С:Предприятие 8.3 есть Режим использования модальности. Если значение этого поля "Не использовать", то при попытке открыть модальное окно платформа выдаст сообщение "Использование модальных окон в данном режиме запрещено". При этом выполнение программного кода прекращается.

В данной статья показан механизм изменения программного кода, на примере вопроса пользователю, при отключенном модальном режиме.

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

Часть кода с вопросом может выглядеть примерно так:

Если ТЧ. Количество() < > 0 Тогда Ответ = Вопрос(" // В этой строке произойдет вывод модального окна с вопросом и выполнение кода остановится до ответа пользователя Если Ответ = КодВозвратаДиалога. Нет Тогда Возврат ; КонецЕсли ; // Пользователь согласился продолжить ТЧ. Очистить() ; КонецЕсли ; // Выполнение дальнейших действия // Сюда программа попадет если ТЧ была пустая или пользователь положительно ответил на вопрос о перезаполнении ВыполнениеДальнейшихДействий() ;

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

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

Как изменится раннее написанный код:

// Необходимо заполнить ТЧ данными // Проверка ТЧ на заполненность Если ТЧ. Количество() < > 0 Тогда // ТЧ не пустая, необходимо спросить пользователя о перезаполнении ПоказатьВопрос(Новый ОписаниеОповещения(" ПерезаполнениеТЧЗавершение " , ЭтотОбъект, ДополнительныеПараметры) , " ТЧ будет перезаполнена. Продолжить ? " , РежимДиалогаВопрос. ДаНет) ; // В этой строке произойдет вывод окна с вопросом, но выполнение кода не остановится Иначе // Сюда программа попадет если ТЧ была пустой ВыполнитьДальнейшиеДействия() ; КонецЕсли ; // Сюда программа попадет в любом случае, была ТЧ пустая или нет // (если, конечно, не произошло ошибки в предыдущем коде) . . . // Экспортная процедура в том же модуле // Вызывается после ответа пользователя на вопрос & НаКлиенте Процедура ПерезаполнениеТЧЗавершение(РезультатОтвета, ДополниетельныеПараметры) Экспорт Если РезультатОтвета = КодВозвратаДиалога. Нет Тогда // Пользователь отказался от продолжения Возврат ; КонецЕсли ; // Выполнение дальнейших дейтсвий // Сюда программа попадет если ТЧ была не пустая и пользователь положительно ответил на вопрос о перезаполнении ТЧ. Очистить() ; ВыполнитьДальнейшиеДействия() ; КонецПроцедуры

Таким образом, так как программа не остановится при выполнении процедуры ПоказатьВопрос, необходимо аккуратно обработать все события
При решении данной задачи выполнение дальнейших действий может произойти при двух событиях:
1. Если ТЧ была пустой
2. Если ТЧ была не пустой и положительном ответе пользователя на вопрос перезаполнении

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

Подобный механизм используется при подобных функциях взаимодействия с пользователем (ВыборЗначения, ВыбратьИзСписка и т.п.)

Если в процессе выполнения уроков у вас появилась такая ошибка - исправить её очень легко.

Вернитесь в конфигуратор и выберите пункт меню "Конфигурация" -> "Открыть конфигурацию":

В открывшемся окне нажмите правой кнопкой на пункте "Конфигурация" и выберите из раскрывшегося меню пункт "Свойства":

Откроется окно со свойствами конфигурации (справа):

Пролистайте его в самый низ и найдите там пункт "Режим использования модальности":

Установите его значение в "Использовать" :

Внимание! Обратите внимание, что если вы используете платформу 1С, отличную от той, что мы скачивали в первом уроке (более поздней версии), то у вас также будет присутствовать поле "Режим использования синхронных вызовов...". Его также нужно установить в "Использовать".

Наконец, выберите пункт меню "Конфигурация" -> "Сохранить конфигурацию":

Готово! Теперь ошибки больше не возникнет.

Пояснения ниже - для тех кому интересно, что мы сделали.

Мы включили режим использования модальности в нашей конфигурации. По умолчанию этот режим выключен и это не позволяет нам использовать такие команды как ВвестиЧисло, ВвестиСтроку, ВвестиДату, ОткрытьЗначение.

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

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

Мы же можем смело включать его, так как пишем учебные примеры, не рассчитанные на работу в интернете.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Например:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Внедрение нового интерфейса платформы 1С 8.3 — "такси" — привело к тому, что пользователи и программисты столкнулись с ошибкой следующего содержания: "Использование модальных окон в данном режиме запрещено".
Рис. 1

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

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

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

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

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

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

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


Рис. 3

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


Рис. 4

Сохраните и примените совершенные изменения нажатием клавиши "F7".