Using modal windows is not allowed in this mode

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

С уважением,
Владимир Милькин

8.3.10.1981 Использование модальных окон в данном режиме запрещено

0

haggart

09.03.17

15:05

Коллеги, добрый день.

Установил новый релиз и теперь на веб клиенте

«Использование модальных окон в данном режиме запрещено».

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

В тонком клиенте все работает, проблема только в web браузере Internet Explore. При откате на предыдущий релиз 8.3.9.1818 все работает.

Может кто сталкивался?

1

Aleksandr N

09.03.17

15:12

2

Amra

09.03.17

15:13

Вы тестируйте, тестируйте, глядишь когда 8.3.10 выйдет из тестового режима, то ошибок будет поменьше

3

Aleksandr N

09.03.17

15:15

(2) Это не ошибка.

4

Amra

09.03.17

15:16

(3) Да вижу уже) Значит ТС не читал перед обновлением

5

haggart

09.03.17

15:18

(1) Спасибо. 1С — казлы :)

6

elCust

09.03.17

15:20

(5) До вечного бана осталось 3…2…1

7

Провинциальный 1сник

09.03.17

15:25

(3) Это диверсия

8

Dmitry1c

09.03.17

15:28

(5) ух

The 1C:Enterprise developers forum

#1

Sep 25, 2013 06:34 AM

Active user


Rating:

5



Joined: Jun 4, 2013
Company:

when I was using version 8.2 I was using a the function DoMessageBox() easily, but now in the 8.3 version I cant use it, it gives me this error «Using modal windows is not allowed in this mode!».

what should I do to make it work ?!


 
Alexey Gerasimov

#2

Sep 25, 2013 08:15 AM

Interested


Rating:

32



Joined: Oct 27, 2011
Company: Abaco Soluciones S.A.

You can use compatibility mode to allow modal windows. It is in configuration object properties.


 
Sergey Polikarpov

#3

Sep 25, 2013 10:51 PM

Active user


Rating:

8



Joined: Jun 25, 2013
Company: 1C Company

We recommend that you use ShowMessageBox() instead. You can find examples in the last version of 1C:AccountingSuite.


 
Subscribe

О чем эта статья

Это финальная статья нашего цикла статей “Первые шаги в программировании на 1С”.

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

Применимость

В статье рассматриваются асинхронная модель построения бизнес-логики, добавленная платформу «1С:Предприятие» редакции 8.3. Представленная информация актуальна для текущих релизов платформы.

Отказ от использования модальных окон в платформе 1С:Предприятие 8.3

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

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

Такое поведение может обеспечить, например, следующий код:

&НаКлиенте
Процедура ЗаполнитьТовары(Команда)
Ответ = Вопрос(“Табличная часть будет очищена. Продолжить?”, РежимДиалогаВопрос.ДаНет);
Если Ответ = КодВозвратаДиалога.Да Тогда
//алгоритм заполнения
КонецЕсли;
КонецПроцедуры

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

Также к приостановке выполнения кода и блокировке интерфейса приводит открытие модальных окон при помощи вызова метода ОткрытьМодально().

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

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

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

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

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

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

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

У корневого элемента конфигурации существует свойство “Режим использования модальности”, которое определяет, можно ли в конфигурации открывать модальные окна.

Если выбран вариант “Использовать”, то модальные окна можно открывать. Если выбран вариант “Не использовать”, то модальные окна недопустимы. При попытке вызвать метод, открывающий модальное окно, система выводит сообщение об ошибке:

Режим Не использовать модальные окна

При таком значении свойства “Режим использования модальности” допустимы только блокирующие окна.

Если выбран вариант “Использовать с предупреждениями”, то при открытии модальных окон в окно сообщений выводится текст:

Использование модальных окон с предупреждением

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

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

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

Код нужно разделить на две части:

  • открытие блокирующего окна;
  • обработка выбора пользователя.

Фрагмент кода, приведенный в начале статьи, нужно переписать следующим образом:

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

После выполнения процедуры ПоказатьВопрос() система не останавливается, ожидая ответ пользователя, исполнение кода продолжается.

Пользователь сможет сделать выбор только после завершения работы всей процедуры. При этом будет вызвана экспортная процедура ЗаполнитьТоварыВопросЗавершение(). Ее название мы передали в конструктор объекта ОписаниеОповещения.

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

В рассмотренном примере вызываемая процедура расположена в модуле управляемой формы, поэтому мы передали в параметр ЭтотОбъект.

Рассмотрим вызов процедуры, расположенной в общем модуле. Для этого добавим новый общий модуль ОбработкаОповещений, установим для него флаг “Клиент (управляемое приложение)”, а признак “Глобальный” не устанавливаем. Расположим в этом модуле процедуру ЗаполнитьТоварыВопросЗавершение().

Тогда обработчик команды заполнения будет выглядеть так:

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

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

Для передачи контекста (вспомогательных данных, неких параметров, значений переменных) из процедуры, открывающей модальное окно, в процедуру, вызывающуюся при его закрытии, предусмотрен третий необязательный параметр конструктора объекта ОписаниеОповещения – ДополнительныеПараметры.

Этот объект (любого типа) будет передан в процедуру, описанную в ОписаниеОповещения, последним параметром.

На примере рассмотренного выше участка кода это можно сделать так:

&НаКлиенте
Процедура ЗаполнитьТовары(Команда)
Параметр1 = 0;
Параметр2 = 0;
СписокПараметров = Новый Структура(“Параметр1, Параметр2″, Параметр1, Параметр2);
Оповещение = Новый ОписаниеОповещения(“ЗаполнитьТоварыВопросЗавершение”, ЭтотОбъект,
СписокПараметров);
ПоказатьВопрос(Оповещение, “Табличная часть будет очищена. Продолжить?”,
РежимДиалогаВопрос.ДаНет);
КонецПроцедуры
&НаКлиенте
Процедура ЗаполнитьТоварыВопросЗавершение(Результат, ДополнительныеПараметры) Экспорт
Если Результат = КодВозвратаДиалога.Да Тогда
//анализируем ДополнительныеПараметры.Параметр1
//анализируем ДополнительныеПараметры.Параметр2
КонецЕсли;
КонецПроцедуры

Если нужно передать только одно значение, то структуру можно не использовать, а присвоить это значение параметру ДополнительныеПараметры конструктора объекта ОписаниеОповещения.

Рассмотрим несколько примеров работы с блокирующими окнами.

Задача 1. Открытие другой формы

Из формы документа по нажатию на кнопку “Открыть параметры” нужно открыть форму, на которой расположены два флажка Параметр1 и Параметр2, которые должен установить пользователь. После закрытия формы вывести в строку сообщений значения параметров.

Создаем общую форму “ФормаПараметров”, на которой размещаем реквизиты Параметр1 и Параметр2, а также команду ЗакрытьФорму:

Форма параметров

Обработчик команды выглядит следующим образом:

Обработчик команды выглядит следующим образом:

&НаКлиенте
Процедура ЗакрытьФорму(Команда)
СписокПараметров = Новый Структура(“Параметр1, Параметр2”, Параметр1, Параметр2);
Закрыть(СписокПараметров);

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

Для формы свойство РежимОткрытияОкна устанавливаем в “Блокировать весь интерфейс”:

Свойства формы

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

&НаКлиенте
Процедура ОткрытьПараметры(Команда)
Оповещение = Новый ОписаниеОповещения(“ОткрытьПараметрыЗавершение”, ЭтотОбъект);
ОткрытьФорму(“ОбщаяФорма.ФормаПараметров”, , , , , , Оповещение);
КонецПроцедуры
&НаКлиенте
Процедура ОткрытьПараметрыЗавершение(Результат, ДополнительныеПараметры) Экспорт
Если ТипЗнч(Результат) = Тип(“Структура”) Тогда
Для каждого КлючЗначение Из Результат Цикл
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = “Ключ: “”” + КлючЗначение.Ключ + “””, значение =
+
КлючЗначение.Значение;
Сообщение.Сообщить();
КонецЦикла;
КонецЕсли;
КонецПроцедуры

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

Форма параметров в пользовательском режиме

Для увеличения нажмите на изображение.

Сообщения в пользовательском режиме

Режим открытия окна можно также указывать в последнем параметре процедуры ОткрытьФорму.

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

Задача 2. Вопрос при закрытии формы

При закрытии окна обработки задавать пользователю вопрос, действительно ли он хочет закрыть окно.

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

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

В процедуре ПередЗакрытием формы пользователю задается вопрос, флаг Отказ выставляется в Истина, закрытие формы отменяется.

После утвердительного ответа на вопрос переменная НужноЗакрыватьФорму устанавливается в Истина, форма закрывается повторно.

Задача 3. Ввод числового значения

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

Для этого необходимо воспользоваться методом ПоказатьВводЧисла() вместо ВвестиЧисло(), который открывает блокирующее окно вместо модального.

&НаКлиенте
Процедура ВводЧисла(Команда)
Оповещение = Новый ОписаниеОповещения(“ВводЧислаЗавершение”, ЭтотОбъект);
ПоказатьВводЧисла(Оповещение, 0, “Введите количество”, 15, 3);
КонецПроцедуры
&НаКлиенте
Процедура ВводЧислаЗавершение(Результат, ДополнительныеПараметры) Экспорт
Если НЕ Результат = Неопределено Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = “Вы ввели количество + Результат;
Сообщение.Сообщить();
КонецЕсли;
КонецПроцедуры

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

Задача 4. Выбор цвета

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

Добавим на форму команду ВыборЦвета со следующим обработчиком:

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

Выбор цвета в 1С

Выбор фона нажимаемой кнопки в 1С

Для объектов ДиалогВыбораЦвета (а также ДиалогРедактированияСтандартногоПериода, КонструкторФорматнойСтроки, ДиалогРасписанияРегламентногоЗадания, ДиалогВыбораШрифта) метод Показать() открывает блокирующее окно.

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

Следует обратить внимание, что объект ДиалогВыбораФайла не имеет метода Показать() в отличие от диалогов выбора цвета или шрифта, поскольку реализация этих диалогов существенно разная.

Для использования диалога выбора файла на веб-клиенте необходимо предварительно подключить расширение работы с файлами.

Диалоги, реализуемые через расширение работы с файлами, не создают таких проблем в работе, как модальные окна браузеров, поэтому не было реализовано открытие блокирующих окон для объекта ДиалогВыбораФайла.

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

Какой практический вывод можно сделать из этой информации? А вывод довольно простой – если по какой-то причине в вашей конфигурации до сих пор существуют модальные вызовы, то в этих местах в в веб-клиенте будет выдаваться окно с сообщением об ошибке. Хочется предостеречь от попыток “нагуглить” какое-то быстрое решение данной проблемы, т.к. основная масса советов сводится к такому рецепту: в конфигураторе на уровне конфигурации в свойстве «Режим использования модальности» поставить значение «Использовать». Естественно, в данный момент, это работать не будет только из-за того, что сами современные браузеры уже не поддерживают модальные вызовы.

И у вас есть всего два пути, каким образом решить описанную выше проблему:

  1. Обновить платформу до релиза 8.3.10+ (8.3.11), установить свойство конфигурации «Режим совместимости» в «Не использовать» и переписать фрагменты кода, использующие модальные методы на асинхронную модель построения бизнес-логики
  2. Рекомендовать вашим клиентам пользоваться устаревшими браузерами, где модальные вызовы еще поддерживались (Mozilla Firefox версии 37 и ниже, Chrоme ниже 37 версии и т.д.).

Кстати, начиная с релиза 8.3.11, больше не поддерживаются веб-браузеры Microsoft Internet Explorer версий 8 и 9.

С веб-браузерами в свете модальности мы разобрались, теперь настала пора прояснить ситуацию и с остальными клиентами.

Начиная с версии 8.3.5 свойство «Режим использования модальности» в тонком и толстом клиентах учитывается, только если указан параметр командной строки /EnableCheckModal. Этот параметр автоматически подставляется в командную строку только при запуске приложения из конфигуратора. Если же этот параметр не указан, то генерация исключений не происходит и соответствующие предупреждения не показываются. Т.е. на практике в случае использования толстого и тонкого клиента никакого кардинального изменения в работе при использовании режима модальности не наблюдается – модальные вызовы будут работать так же, как и работали ранее, при этом не выдавая никаких предупреждений, как в веб-клиенте.

Чтобы расставить все точки над “i”, заметим, что начиная с редакции 8.3.9 в толстом клиенте игнорируется свойство конфигурации «Режим использования синхронных вызовов расширений платформы и внешних компонент», при этом соответствующие синхронные методы работают без генерации исключений и вывода предупреждений. Указанное игнорируемое свойство было добавлено в редакции 8.3.5 с целью поддержки асинхронной работы с внешними компонентами, криптографией и расширениями для работы с файлами в веб-браузере Google Chrome. Понятно, что к толстому клиенту это никакого отношения не имеет, и поэтому “тихое” игнорирование данного свойства просто исключило лишние проверки использования синхронных методов при использовании конфигурации.

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

Коллеги, существуют две вещи которые можно читать бесконечно: ленту вконтакте и список изменений в очередном релизе платформе, поэтому, давайте подводить окончательные итоги ;)

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

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

Вместо заключения

Вот и подошел к концу наш цикл «Первые шаги в разработке на 1С». Если вы прочли его целиком, то скорее всего, уже заметили, какими семимильными шагами развивается платформа в последнее время. Материал данного цикла был написан относительно недавно, однако мы были вынуждены его серьезно актуализировать, т.к. даже за такой короткий срок появилась масса новых важных функциональных возможностей и изменений. Такие крупные изменения могут несколько озадачить программиста 1С, если он не рос и не развивался в профессиональном плане с платформой все это время.

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

А как же «не переключайтесь»? Естественно! У нас еще тонны интересного и полезного материала по разработке, оптимизации и еще многому чему. Так что, изучайте, применяйте и да прибудет с вами сила ;)

PDF-версия статьи для участников группы ВКонтакте

Мы ведем группу ВКонтакте – http://vk.com/kursypo1c.

Если Вы еще не вступили в группу – сделайте это сейчас и в блоке ниже (на этой странице) появятся ссылка на скачивание материалов.

Ссылка доступна для зарегистрированных пользователей)
Ссылка доступна для зарегистрированных пользователей)
Ссылка доступна для зарегистрированных пользователей)

Если Вы уже участник группы – нужно просто повторно авторизоваться в ВКонтакте, чтобы скрипт Вас узнал. В случае проблем решение стандартное: очистить кеш браузера или подписаться через другой браузер.

We will use the example from the previous section (picking materials and services for a goods receipt tabular section) to explain how to avoid modal windows in the user interface.

In new configurations modal windows are not allowed by default. This is defined by the Modality usage mode configuration property.

Theory

Before you proceed to the practical examples, we will explain why this interface mode is recommended.

As a rule, applications for desktop computers use modal windows. 1C:Enterprise is no exception. Modal windows are handy in scenarios where user input is required for further execution of an algorithm. Such windows block the entire applied solution interface and pause the script execution until they are closed.

But 1C:Enterprise is no longer a desktop-only application, it eventually acquired a web client and mobile device support, which introduced some issues related to modal windows.

In order to display modal windows properly, desktop browsers require specific setup, while mobile browsers do not support modal windows at all.

This is why a special interface mode that does not use modal windows is implemented in 1C:Enterprise. In this mode a window that should normally be modal is displayed within the parent window area and blocks the entire interface. From the user perspective it looks exactly like a modal window because a user cannot perform any other operations until they close the window.

But it does not work this way from the developer perspective. That «blocking window» does not pause the script execution. This means that an algorithm that was previously implemented as a solid script fragment must be divided into two parts: one part is executed before opening the window and the other one is executed when the window is closed.

To inform the platform which script should be executed once the window is closed, the name of the procedure to be executed is passed to the window.

The following example demonstrates how it works. While it is obviously artificial and not suitable for commercial solutions, it prepares you for understanding the second example.

Requesting user input in a form command

Suppose that you need to request a user confirmation before picking materials and services for a goods receipt tabular section.

Requesting user input in an event handler

Let us implement a more complex example where user input is requested in an event handler. Suppose that you need a user confirmation before adding materials to a goods receipt tabular section, and a single confirmation is required for each document.

Just like the previous example, this one does not fit any commercial solution. Still, both examples perfectly illustrate the general approach to avoiding modal windows, which is described earlier in this section.

The new procedure will include single picking with multiple selection available. 

  1. In the GoodsReceipt document form, open the Pick command property palette and then, in the Action field, select the Pick procedure.
  2. Update the Pick command handler as shown in listing 26.8.

    Listing 26.8. Pick button click handler

    &AtClient
    Procedure Pick (Command)
     
        FormParameters = New Structure ("MultipleChoice", True);
        OpenForm("Catalog.MaterialsAndServices.ChoiceForm", FormParameters, Items.Materials);
     
    EndProcedure
  3. Add a blocking confirmation dialog box to the ChoiceProcessing handler of the Materials table (listing 26.9).

    Listing 26.9. ChoiceProcessing event handler of the Materials table with a confirmation dialog box

    &AtClient
    Procedure MaterialChoiceProcessing(Item, SelectedValue, StandardProcessing)
     
        If AnswerBeforeAdd <> True Then
            StandardProcessing = False;
            Notification = New NotifyDescription("AddCompletion", ThisObject, SelectedValue);
            ShowQueryBox(Notification, "Do you want to add materials to the tabular section?",
                QuestionDialogMode.YesNo);
        Else
            For Each SelectedItem In SelectedValue Do
                NewRow = Object.Materials.Add();
                NewRow.Material = SelectedItem;
            EndDo;
        EndIf;
     
    EndProcedure

    The AnswerBeforeAdd variable is used to determine whether a user answered the question.

    If a user has not answered the question, the procedure cancels the standard processing and displays the blocking confirmation dialog box. If a user answered the question earlier, the list of materials is added to the tabular section without any confirmations.

    If the AnswerBeforeAdd variable value is not true, the procedure creates a NotifyDescription object. The first parameter of the object constructor is the name of the notification handler procedure, which is executed once the user input is received. The second parameter is the name of the module where the procedure is located (in this example it is the form module). And the third optional parameter contains an array of selected material values (SelectedValue).

    Then a nonmodal method ShowQueryBox() displays the confirmation dialog box. The method accepts the NotifyDescription object as a parameter. This object points to the exported module procedure (AddCompletion) that is executed once a user makes a selection in the blocking dialog box.

    The MaterialsList parameter of the AddCompletion procedure contains the array of selected material values. The Result parameter contains the user input. If the user answer is Yes, the procedure sets AnswerBeforeAdd to True and then adds the selected materials to the document tabular section.

  4. Add the procedure shown in listing 26.10 to the form module.

    Listing 26.10. AddCompletion() notification handler procedure

    &AtClient
    Procedure AddCompletion(Result, MaterialsList) Export
        If Result = DialogReturnCode.Yes Then
            AnswerBeforeAdd = True;
     
            For Each selectedItem In MaterialsList Do
                NewRow = Object.Materials.Add();
                NewRow.Material = SelectedItem;
            EndDo;
     
        EndIf;
     
    EndProcedure

    Note that once a user confirms that they want to add materials to the document, the confirmation is never requested again because the value of the AnswerBeforeAdd variable is set to True.

    The last thing to do is declare that variable.

  5. Add the script from listing 26.11 to the beginning of the form module.

    Listing 26.11. Variable declaration in a form module

    &AtClient
    Var AnswerBeforeAdd;

In Designer mode

Let us implement the confirmation window.

  1. Open the configuration property palette and look at the Modality usage mode property (fig. 26.3).

    Fig. 26.3. Modality usage mode configuration property

    It has the default value «Do not use», which is the recommended mode.

    An attempt to open a modal window in this mode returns an error.

    To avoid this error, let us use the nonmodal method ShowQueryBox() instead of the modal method DoQueryBox() in the Pick command handler.

    For each modal method, the platform has a matching nonmodal method that does not block script execution and does not use a modal window. Nonmodal methods do not cause any web application issues. They have the following specifics:

    • Method names begin with Show or Begin. Examples: ShowQueryBox() instead of DoQueryBox(), BeginPutFile instead of PutFile, and so on.
    • The first parameter is a NotifyDescription object that points to the module procedure to be executed once the user input is received.
    • There is no return value. Istead, the user input is passed to the module procedure described by the NotifyDescription object.

    Learn more! The full mapping between modal and nonmodal methods is available in section «Forms. Different approaches to modality. Method mapping» of 1C:Enterprise 8.3 Developer Guide.

  2. Add the script shown in listing 26.7 to the GoodsReceipt document form module.

    Listing 26.7. Pick button click handler with a confirmation dialog box

    &AtClient
    Procedure PickConfirmation(Command)
     
        Notification = New NotifyDescription("PickCompletion", ThisObject);
        ShowQueryBox(Notification, "Do you want to pick materials and services?", 
            QuestionDialogMode.YesNo);
     
    EndProcedure
     
    &AtClient
    Procedure PickCompletion(Result, Parameters) Export
     
        If Result = DialogReturnCode.Yes Then
            FormParameters = New Structure ("MultipleChoice", True);
            OpenForm("Catalog.MaterialsAndServices.ChoiceForm", FormParameters, 
                Items.Materials);
        EndIf
     
    EndProcedure

    The PickConfirmation procedure first creates a NotifyDescription object. The first parameter of the object constructor is the name of the notification handler procedure, which is executed once the user input is received. The second parameter is the name of the module where the procedure is located.

    A notification handler procedure can be stored in a managed form module, in a nonglobal common client module, or in a command module. In this example the procedure is located in the module of this form, which is described by the ThisObject reference.

    Then a nonmodal method ShowQueryBox() is executed. It displays the confirmation dialog box. The method accepts the NotifyDescription object as a parameter. This object points to the module procedure (PickCompletion) that is executed once a user makes a selection in the blocking dialog box.

    A notification handler procedure must be declared as an export procedure (using the Export keyword). The Result parameter contains the user answer. If the user answer is Yes, the procedure opens the materials and services list for picking.

    Let us replace the old Pick command handler with a new one.

  3. In the Pick command property palette, in the Action field, select the PickConfirmation procedure (fig. 26.4).

    Fig. 26.4. Specifying the action for the Pick command

In 1C:Enterprise mode

Let us test the changes.

  1. Start 1C:Enterprise in the debug mode.
  2. In the Inventory section, open the list of goods receipts and start creating a new one.
  3. In the command bar, click the Pick button.

    This opens the confirmation dialog box. The dialog box blocks the interface but does not block the applied solution execution. You can only proceed to picking materials and services when you confirm that you want to perform this operation.

In 1C:Enterprise mode

Let us test the changes.

  • Start 1C:Enterprise in the debug mode.

    You can see that the application behavior is almost identical to the previous example, with the following differences: first, the confirmation is requested after the materials are selected, and second, the confirmation is only requested once.

    Note. To check whether your configuration includes any modal methods, in Designer, on the Configuration menu, click Check configuration and select the Search for methods that open modal windows check box.

1C:Enterprise Developer’s Community

Понравилась статья? Поделить с друзьями:
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
  • Как посмотреть чипсет материнской платы windows 10
  • Rufus режим windows to go
  • Как повысить скорость скачивания в торренте на windows 10
  • Tf 3200 сетевая карта драйвер на windows 10
  • Flash плеер для windows 10