Довідковий матеріал

Відмова від використання модальних вікон

У статті буде розглянуто причини відмови від подальшої підтримки модальних вікон у платформі «1С:Підприємство» та типові сценарії переведення наявного функціоналу на нову модель.Розвиток продуктів «1С» і платформи «1С:Підприємство». Проблеми підтримки модальних вікон у середовищі Інтернет. Кілька термінів і визначень. Загальні принципи під час переходу на асинхронну модель побудови бізнес-логіки. Нові асинхронні засоби платформи для взаємодії з користувачем. Особливості реалізації асинхронної бізнес-логіки. Типові сценарії під час переходу на асинхронну модель. Запитання користувачеві в команді форми. Запитання користувачеві під час закриття форми. Запитання користувачеві у вкладених процедурах. Висновок

Розвиток продуктів «1С» і платформи «1С:Підприємство»

Проблеми підтримки модальних вікон у середовищі Інтернет

Кілька термінів і визначень

Загальні принципи під час переходу на асинхронну модель побудови бізнес-логіки

Нові асинхронні засоби платформи для взаємодії з користувачем

Особливості реалізації асинхронної бізнес-логіки

Типові сценарії під час переходу на асинхронну модель

Запитання користувачеві в команді форми

Запитання користувачеві під час закриття форми

Запитання користувачеві у вкладених процедурах

Висновок

 

У статті буде розглянуто причини відмови від подальшої підтримки модальних вікон у платформі «1С:Підприємство» та типові сценарії переведення наявного функціоналу на нову модель.

Розвиток продуктів «1С» і платформи «1С:Підприємство»

Одним з основних векторів розвитку платформи «1С:Підприємство» є можливість її успішного використання в середовищі Інтернет.

Це середовище має низку обмежень, які відсутні в середовищі настільних застосунків:

  • Обмеження програм, що використовуються для роботи в Інтернеті (браузерів),
  • Обмеження, пов’язані з якістю зв’язку між клієнтським застосунком і сервером.

Застосунки, призначені для роботи через Інтернет, мають бути побудовані з урахуванням цих обмежень, тому їхня модель відрізняється від настільних застосунків.

Усі інтернет-застосунки створюються з використанням асинхронної (керованої подіями) моделі керування логікою, на відміну від прийнятої в настільних застосунках синхронної (послідовної) моделі.

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

Проблеми підтримки модальних вікон у середовищі Інтернет

Модальні вікна є елементом синхронної моделі. Вони блокують виконання логіки застосунку, даючи змогу виконувати її ділянки послідовно, одна за одною, залежно від результату, отриманого від користувача.

Такі вікна не входять до стандарту веброзробки, тому не підтримуються всіма браузерами, за допомогою яких користувач отримує доступ до застосунків «1С».

Для розробки якісних вебзастосунків потрібні асинхронні засоби забезпечення взаємодії з користувачем.

Такі засоби були додані до платформи «1С:Підприємство» у версії 8.3.3.

Кілька термінів і визначень

Далі у статті використовуватимуться такі терміни:

  • Модальне вікно – вікно, що блокує весь інтерфейс застосунку, при цьому виконання коду зупиняється до моменту отримання відповіді користувача. Наприклад, вікно модальної форми.
  • Модальний метод – метод глобального контексту або об’єкта платформи, під час виконання якого відкривається модальне вікно. Наприклад, методи Вопрос(), ОткрытьМодально().
  • Блокувальне вікно – вікно, що блокує весь інтерфейс або його частину, але при цьому виконання коду не зупиняється. Наприклад, форма, що блокує власника.

Загальні принципи під час переходу на асинхронну модель побудови бізнес-логіки

У синхронній моделі код, що залежить від вибору користувача, виконується послідовно.

В асинхронній моделі ми можемо отримати результат лише обробляючи події, які виникають, коли користувач робить свій вибір. При цьому на час очікування вибору код застосунку не зупиняється, і він продовжує працювати.

Таким чином, виходить, що такий код розбивається на дві процедури:

  1. Процедура, яка створює блокувальне вікно, що очікує на дію користувача,
  2. Процедура — обробник сповіщення про те, що користувач зробив свій вибір і ми можемо використати результат його дій для подальшої роботи.

Нові асинхронні засоби платформи для взаємодії з користувачем

Для реалізації асинхронної моделі насамперед потрібна можливість опису процедур-обробників сповіщень, які будуть викликані системою після завершення вибору користувача.

Для цього до платформи було додано новий тип об’єктів — ОписаниеОповещения.

Цей об’єкт має конструктор з такими параметрами:

  • ИмяПроцедуры - Вказує ім’я процедури-обробника сповіщення, яка буде виконана після отримання відповіді користувача,
  • Модуль -Вказує, у якому модулі розташована ця процедура. Цей параметр може мати такі типи:
    • УправляемаяФорма - процедура розташована в модулі керованої форми,
    • ОбщийМодуль - процедура розташована в загальному неглобальному клієнтському модулі,
    • КомандаКомандногоИнтерфейса - процедура розташована в модулі команди.

Для отримання значення модуля до перелічених вище об’єктів додано загальну властивість ЭтотОбъект.

  • ДополнительныеПараметры - значення будь-якого типу, яке буде передано до процедури-обробника сповіщення під час її виклику.

Під час виклику зазначеної процедури система передає їй через параметри результат вибору користувача і значення ДополнительныеПараметры. У деяких випадках результат вибору може бути відсутнім (метод ПоказатьПредупреждение()) або передаватися кількома параметрами (метод НачатьПомещениеФайла()).

Для переходу на асинхронну модель до платформи було додано методи, аналогічні модальним методам, але, на відміну від них, такі, що не блокують потік виконання. Ці методи вже не є елементами синхронної логіки, тому можуть безперешкодно використовуватися під час розробки вебзастосунків.

Група цих методів відрізняється таким:

  • Їхні імена починаються зі слова Показать або Начать, наприклад ПоказатьВопрос() замість Вопрос(), НачатьПомещениеФайла() замість ПоместитьФайл(), і так далі,
  • Першим параметром приймають об’єкт ОписаниеОповещения, що вказує на процедуру модуля, яка буде виконана після того, як користувач зробить вибір у блокувальному вікні,
  • Не повертають значення, натомість результат вибору користувача буде передано до процедури модуля, описаної об’єктом ОписаниеОповещения.

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

  • Додано властивість форми ОписаниеОповещенияОЗакрытии, яка вказує на процедуру модуля, що буде викликана під час її закриття. Також це значення можна встановити за допомогою нового параметра методу ОткрытьФорму(),
  • Додано варіант режиму відкриття вікна форми — БлокироватьВеcьИнтерфейс, при використанні якого відкрита форма заблокує всі вікна, а не лише вікно батька.

Додатково реалізовано новий метод глобального контексту ВыполнитьОбработкуОповещения(), який дає змогу вручну здійснити виклик процедури-обробника. Це дає змогу реалізувати загальну процедуру, що виконує опитування користувача, яка викликається з різних місць.

Особливості реалізації асинхронної бізнес-логіки

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

Це підтверджується тим фактом, що всі сучасні вебзастосунки побудовані саме з використанням асинхронної моделі, і їхня кількість постійно зростає.

Типові сценарії під час переходу на асинхронну модель

Запитання користувачеві в команді форми

Найчастішим сценарієм є отримання інформації від користувача під час виконання будь-якої команди.
Припустімо, існує такий код, написаний у межах синхронної моделі:

&НаКлиенте
Процедура ДобавитьХарактеристику(Команда) 
	//Виберемо вид характеристики 
	ВидХарактеристики = ОткрытьФормуМодально("ПланВидовХарактеристик.ВидыХарактеристик.ФормаВыбора");
	Если ВидХарактеристики = Неопределено Тогда 
		Возврат;
	КонецЕсли;
	//Перевіримо наявність 
	Если ОписаниеХарактеристик.НайтиСтроки( 
		Новый Структура("ВидХарактеристики", ВидХарактеристики)).Количество() > 0 Тогда
		Предупреждение(НСтр("ru = 'Характеристика уже существует!'", "ru"));
		Возврат;
	КонецЕсли;
	//Додамо вид характеристики на форму 
	ДобавитьХарактеристикуНаСервере(ВидХарактеристики);
КонецПроцедуры

У межах асинхронної моделі з використанням нових засобів цей код матиме такий вигляд:

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

&НаКлиенте
Процедура ДобавитьХарактеристикуЗавершение(ВидХарактеристики, Параметры) Экспорт
	Если ВидХарактеристики = Неопределено Тогда
		Возврат;
	КонецЕсли; 
	//Перевіримо наявність 
	Если ОписаниеХарактеристик.НайтиСтроки(
		Новый Структура("ВидХарактеристики", ВидХарактеристики)).Количество() > 0 Тогда
		ПоказатьПредупреждение(, НСтр("ru = 'Характеристика уже существует!'", "ru"));
		Возврат;
	КонецЕсли; 
	//Додамо вид характеристики на форму
	ДобавитьХарактеристикуНаСервере(ВидХарактеристики);
КонецПроцедуры

Слід звернути увагу, що процедура-обробник оголошена експортованою. Це пов’язано з тим, що цю процедуру буде викликано не кодом самого модуля, а системним кодом платформи, тому модуль має надати до неї доступ.

Запитання користувачеві під час закриття форми

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

У таких випадках доступний такий алгоритм:

  1. Створити у формі змінну, яка зберігатиме відповідь користувача під час її закриття,
  2. Якщо відповіді ще не було отримано (змінна містить Неопределено), то в обробнику ПередЗакрытием потрібно показати користувачеві вікно вибору, наприклад, за допомогою методу ПоказатьВопрос() і перервати закриття форми, установивши Отказ=Истина,
  3. У процедурі-обробнику вибору слід установити змінній результат вибору та викликати метод Закрыть() форми,
  4. Якщо змінна містить будь-яке значення, це означає, що триває процес закриття, ініційований на попередньому кроці, результат вибору від користувача вже отримано й обробник ПередЗакрытием може використати його значення.

Нижче наведено приклад коду, що реалізує цей алгоритм:

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

&НаКлиенте
Процедура ПередЗакрытиемЗавершение(Результат, Параметры) Экспорт 
	Если Результат = КодВозвратаДиалога.Да Тогда 
		ОтветПередЗакрытием = Истина;
		Закрыть();
	КонецЕсли;
КонецПроцедуры

Запитання користувачеві у вкладених процедурах

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

Припустімо, існує загальна функція, яка повертає текст залежно від відповіді користувача:

&НаКлиенте
Функция ПолучитьТекстВыбора() 
	Результат = Вопрос("Продолжить операцию?", РежимДиалогаВопрос.ДаНет); 
	Возврат ?(Результат = КодВозвратаДиалога.Да,  "Продовжуємо виконувати операцію...", 
	"Операцію перервано!");
КонецФункции

В асинхронній моделі цю функцію та її виклики слід реалізовувати так:

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

&НаКлиенте
Процедура ВыполнитьОперациюЗавершение(Результат, Параметры) Экспорт 
	Сообщить(Результат);
КонецПроцедуры

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

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

Таким чином, виклики процедур можна пов’язувати в ланцюжки, передаючи їм результат за допомогою методу ВыполнитьОбработкуОповещения().

Висновок

У статті було розглянуто нові засоби, що дають змогу реалізовувати якісніші застосунки з використанням асинхронної моделі, прийнятої в середовищі Інтернет.

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

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

Записатися телефоном