Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
14 дек 2024, 00:40

Скажи НЕТ модальности

Автор MuI_I_Ika, 05 окт 2013, 14:46

0 Пользователей и 1 гость просматривают эту тему.

MuI_I_Ika



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



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

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




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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

КонецЕсли;

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


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

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

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

Рейтинг@Mail.ru

Поиск