IE2017

Прием программирования для компактного оформления последовательных немодальных диалогов (ПоказатьВопрос, ПоказатьВводЗначения и прочее)

Программирование - Практика программирования

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

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

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

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

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

Примерная реализация подхода:

// ВЦОСНИК - Выполнить Цепочку Операций С Немодальным Интерактивом Компактно
Процедура ВЦОСНИК(Значение = Неопределено, ДопПараметры = Неопределено) Экспорт
    
    Если ДопПараметры = Неопределено Тогда
        ДопПараметры = Новый Структура("НазваниеЗавершаемойОперации", "0");
	ИначеЕсли НЕ ДопПараметры.Свойство("НазваниеЗавершаемойОперации") Тогда
        ДопПараметры.Вставить("НазваниеЗавершаемойОперации", "0");
    КонецЕсли;

	Если ДопПараметры.НазваниеЗавершаемойОперации = "0" Тогда
		// начало первой операции
		...
		ДопПараметры.Вставить("НазваниеЗавершаемойОперации", "1");
	    Показать...(Новый ОписаниеОповещения("ВЦОСНИК", ЭтаФорма, ДопПараметры), ...);
	ИначеЕсли ДопПараметры.НазваниеЗавершаемойОперации = "1" Тогда
		// анализ ответа пользователя в диалоге из предыдущей операции и начало
		// следующей операции
		.....................................
        ДопПараметры.Вставить("НазваниеЗавершаемойОперации", "2");
	    Показать...(Новый ОписаниеОповещения("ВЦОСНИК", ЭтаФорма, ДопПараметры), ...);
	ИначеЕсли ДопПараметры.НазваниеЗавершаемойОперации = N-1 Тогда
		// анализ ответа пользователя в диалоге предпоследней операции и начало
		// последней операции
		.....................................
	КонецЕсли;
    
КонецПроцедуры

См. также

Комментарии
1. Сергей Галюк (dj_serega) 248 24.07.15 17:13 Сейчас в теме
За "ВЦОСНИК" + однозначно :)
корум; kuzyara; nSpirit2; CyberCerber; k_vasil; Aleksey.Bochkov; +6 Ответить
2. Франко Деллиани (Franco) 65 24.07.15 17:42 Сейчас в теме
3. Сергѣй Батанов (baton_pk) 207 24.07.15 18:46 Сейчас в теме
За находчивость плюс, но...
задать более одного вопроса, то линейный по своей сути код

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

ну и опять же процедура должна делать что-то одно и её название должно отражать, что она делает.
корум; Irwin; awk; delete; bonv; zqzq; Yashazz; +7 Ответить 1
4. Яков Коган (Yashazz) 2095 24.07.15 20:33 Сейчас в теме
Если мне склероз не изменяет, среди обработчиков оповещений есть парочка процедур, НЕ подразумевающих второй параметр или подразумевающих третий. Нэ?

Ну и согласен, более 2 вопросов означает неверную организацию диалога с юзером, надо делать спецформу.
5. Андрей Кайгородов (mszsuz) 65 24.07.15 20:40 Сейчас в теме
Откройте свой ВЦОсник через год и попытайтесь разобраться
корум; +1 Ответить 1
6. Иван Устьянцев (nSpirit2) 27.07.15 13:11 Сейчас в теме
Кажется что отказ от модальности должен еще и сопровождаться отказам от показа 100 окон вопросов после того как вы уже тыкнули в кнопку "записать" :)
Меня честно как пользователя очень бесят такие программы которые выкидывают кучу окон с вопросами :)
7. Сан Саныч (herfis) 117 28.07.15 15:21 Сейчас в теме
(3) baton_pk,
Насчет линейности - возможно не очень удачная формулировка. Но мне кажется все поняли, что подразумевалось на самом деле.
Соглашусь, что такая потребность (более одного окна диалога в одном блоке) возникает нечасто.
Чего уж там - очень редко возникает. Но если уж возникла необходимость даже двух диалогов, то этот вариант показался мне значительно меньшим злом.
Может, кто-то когда-то спасибо и скажет :)
8. Сан Саныч (herfis) 117 28.07.15 15:30 Сейчас в теме
(4) Yashazz,
Да, универсальность не стопроцентная для всех видов немодальных диалогов.
Обработчики для ПоказатьВводДаты, ПоказатьВводЗначения, ПоказатьВводСтроки, ПоказатьВводЧисла, ПоказатьВопрос, ПоказатьВыборИзМеню, ПоказатьВыборИзСписка, ПоказатьВыборЭлемента - имеют одинаковые сигнатуры (значение и ДопПараметры).
А вот более специфичные системные диалоги, такие как ПоказатьВыборДействия для расшифровки или НачатьПомещениеФайла - там больше параметров.
9. Сан Саныч (herfis) 117 28.07.15 15:31 Сейчас в теме
(5) mszsuz, Комментарии никто не отменял.
10. Сан Саныч (herfis) 117 28.07.15 15:39 Сейчас в теме
(6) nSpirit2, Мне нечего возразить. Всё так.
Как правило, такой необходимости не возникает.
Давно разрабатываю на УФ и никаких проблем с этим не возникало.
Но вот недавно встал перед выбором - рисовать специальную промежуточную форму (чего задача явно не стоила в своем текущем виде) или обойтись вводом единичного значения и подтверждением операции.
Выбрал второе и умылся слезами. Так и родилась идея.
11. Maximilian Alekseevich (1cmax) 151 28.07.15 22:26 Сейчас в теме
Сначала подумал, причем здесь ВЦИОМ.. показалось (trollface)
а вообще пока активно не начал работать с немодальностью, но понял, что усложнение кода - не подарок.
так что идея правильная
12. Сан Саныч (herfis) 117 16.09.16 09:53 Сейчас в теме
Кстати, по-поводу маловероятности длинных цепочек на практике.
В БСП при сохранении файла обработки из справочника дополнительных отчетов и обработок:

- ВыгрузитьВФайл
- ПоказатьВопросОбУстановкеРасширенияРаботыСФайламиПриУстановк­еРасширения
- ПоказатьВопросОбУстановкеРасширенияРаботыСФайламиЗавершение
- ВыгрузитьВФайлЗавершение
- ДиалогСохраненияФайла.Показать
- ВыгрузитьФайлВыборФайла
- НачатьПолучениеФайлов
- ВыгрузитьФайлПолучениеФайла

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