Клиентские приложения все чаще используются при помощи веб-клиента, что предъявляет определенные требования к коду. В этой статье я постараюсь рассказать о модальности в 1С — когда и почему следует от нее отказаться и как это сделать.
Общая информация
В начале рассмотрим общие вопросы связанные с модальными окнами в 1С.
Что не так с модальными окнами?
С модальными окнами все в порядке. Они широко используются в 1С в тех случаях, когда от пользователя требуется ввод информации без которой невозможно дальнейшее выполнение программы. Остальной интерфейс при этом блокируется, а выполнение кода приостанавливается до тех пор, пока модальное окно не будет закрыто.
Все это прекрасно работает в тонком и толстом клиенте и с большим трудом в веб-клиенте. Современные браузеры как правило поддерживают модальные окна (какие-то лучше, какие-то хуже) — открывая их в новом окне как «всплывающее окно». Но из-за того, что всплывающие окна используются в основном для рекламы, их показ отключен по умолчанию практических во всех современных браузерах. Следовательно, в подавляющем большинстве случаев необходима предварительная настройка браузера.
Когда следует отказаться от модальности?
Разумеется отказ от модальности необходим далеко не всегда.
Во-первых, режим работы интерфейса без использования модальности появился в версии технологической платформы 8.3.3.721 (от 06.09.2013) — следовательно, при использовании предыдущих версий технологической платформы, не нужно задумываться об отказе от модальности.
Во-вторых, не все прикладные решения обязаны использовать этот режим. Отказ от модальности является критичным для приложений которые будут использоваться:
- на iPad;
- через веб-клиент;
- в режиме сервиса (например, размещенные на 1cfresh.com).
Нужно отметить, что во всех типовых конфигурациях (речь о новых или не слишком старых версиях) основной режим работы интерфейса — режим без использования модальности. Об этом нужно помнить при внесении изменений в эти конфигурации.
Как все поправить?
Отказ от модальности в любой серьезной конфигурации (существующей и использующей модальные окна) — дело непростое. В значительном количестве случаев будет недостаточно заменить один метод на другой — может потребоваться изменение значительной части интерфейса прикладного решения.
Каждый раз, перед тем как начать переделывать модальный диалог, стоит очень серьезно подумать — не проще ли будет избавиться от этого диалога совсем.
Помимо изменения самих диалогов (создание вызываемых процедур, изменение кода вызовов и тд.), отказ от модальности — это еще и существенный шаг в сторону асинхронной модели работы клиентского приложения, со всеми вытекающими отсюда последствиями. Подробнее об асинхронной модели клиентского приложения в отдельной статье.
Непосредственно при отказе от модальности очень поможет механизм рефакторинга о котором подробно написано в отдельной статье.
Соответствие синхронных методов асинхронным аналогам (на момент написания статьи) можно посмотреть тут.
Практические примеры
В качестве практических примеров рассмотрим основные приемы работы с блокирующими окнами.
Работа с блокирующими окнами
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | &НаКлиенте Процедура Спросить() //создаем описание оповещения ОбратныйВызов = Новый ОписаниеОповещения("ОбработкаОтвета", ЭтотОбъект); Если Модифицированность Тогда ПоказатьВопрос(ОбратныйВызов, "Данные были изменены. Записать изменения?", РежимДиалогаВопрос.ДаНет); Иначе //мы можем выполнить обработку оповещения //в этом случае РезультатВопрос = Неопределено ВыполнитьОбработкуОповещения(ОбратныйВызов); //в том числе с заданным результатом ВыполнитьОбработкуОповещения(ОбратныйВызов, КодВозвратаДиалога.Да); КонецЕсли; КонецПроцедуры &НаКлиенте Процедура ОбработкаОтвета(РезультатВопроса, ДополнительныеПараметры) Экспорт Если РезультатВопроса = КодВозвратаДиалога.Да Тогда Сообщить("Данные записаны"); ИначеЕсли РезультатВопроса = КодВозвратаДиалога.Нет Тогда Сообщить("Данные не записаны"); ИначеЕсли РезультатВопроса = Неопределено Тогда Сообщить("Данные не были изменены"); КонецЕсли; КонецПроцедуры |
Блокирующие окна и закрытие приложения
Нельзя забывать, что даже при открытии формы в блокирующем режиме, исполнение кода приложения продолжается, в результате может сложиться ситуация, при которой открытая форма закрывается из-за закрытия всего приложения. Для отслеживания подобной ситуации в обработчиках событий формы ПередЗакрытием и ПриЗакрытии реализован параметр ЗавершениеРаботы.
Кроме этого, в обработчике события формы ПередЗакрытием и в обработчике события управляемого приложения ПередЗавершениемРаботыСистемы реализован параметр ТекстПредупреждения.
Взаимодействие этих параметров показано в примере. Сначала открываем форму и сразу после этого завершаем работу приложения:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | &НаКлиенте Процедура ОткрытьФормуТест(Команда) ОбработкаЗакрытия = Новый ОписаниеОповещения("ОбработкаЗакрытияФормы", ЭтотОбъект); //открываем общую форму в блокирующем режиме ОткрытьФорму("ОбщаяФорма.Форма",,,,,,ОбработкаЗакрытия, РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс); //завершаем работу всего приложения ЗавершитьРаботуСистемы(); //в этом случае приложение закроется не задавая никаких вопросов //ЗавершитьРаботуСистемы(Ложь); КонецПроцедуры &НаКлиенте Процедура ОбработкаЗакрытияФормы(РезультатЗакрытия, ДополнительныеПараметры) Экспорт Сообщить("Форма закрыта"); КонецПроцедуры |
Затем в модуле открытой формы выясняем, что закрывается не сама форма, а все приложение и пытаемся предотвратить это:
1 2 3 4 5 6 7 8 9 10 11 12 13 | &НаКлиенте Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка) //флаг завершения работы приложения Если ЗавершениеРаботы Тогда //пробуем вывести сообщение для пользователя Отказ = Истина; ТекстПредупреждения = "Закрывать приложение нельзя"; КонецЕсли; КонецПроцедуры |
Результат будет выглядеть примерно так:
На этом все, надеюсь, что эта статья была Вам полезна.
Загрузка...