gifts2017

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

Опубликовал Сан Саныч (herfis) в раздел Программирование - Практика программирования

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

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

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

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

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

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

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

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

См. также

Подписаться Добавить вознаграждение

Комментарии

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

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

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

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

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

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