Несколько немодальных вопросов пользователю подряд. Вариант реализации через рекурсивный вызов "ПоказатьВопрос"

14.11.22

Разработка - Универсальные функции

Современные версии платформы серьезно сократили асинхронный код, но не все предприятия могут себе позволить быстрый переход на "свежую" платформу. Ещё долго будет жить реализация через описание оповещений, которая порождает большое количество кода, усложняет понимание и провоцирует ошибки при внесении изменений. В статье рассмотрен подход, позволяющий уменьшить количество кода при вызове нескольких методов "ПоказатьВопрос" подряд.

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

 
 Схема 1.

Однако в моём случае пришлось использовать метод "ПоказатьВопрос" и в этом случае кода стало сильно больше, как на схеме 2.

 
 Схема 2.

Тут я испугался, что скоро понадобится добавить третий вопрос и понял, что надо что-то делать. Понятно, что действия в блоке "Продолжение программы" нужно вынести в отдельную процедуру и вызывать её из разных мест. Но код всё еще будет путано выглядеть, да и каждый новый вопрос будет увеличивать количество строк кода, как снежный ком. Решение было очевидным - рекурсия!

Я люблю рекурсию, к сожалению она не отвечает мне взаимностью. Поэтому пришлось потратить время на отладку кода. И, дабы не терять время в будущем самому и уберечь от этого коллег, родилась эта статья. 

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

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

 
 Задаём массив вопросов пользователю

Далее вызываем рекурсивную процедуру ПоказатьВопросПользователю, но сначала проверим, что вопросы вообще есть и сформируем структуру дополнительных параметров:

Если МассивВопросовПользователю.Количество() > 0 Тогда
	ДопПараметрыВОповещенииПоказатьВопросПользователю = Новый Структура;
	ДопПараметрыВОповещенииПоказатьВопросПользователю.Вставить("МассивВопросовПользователю",МассивВопросовПользователю);
	ДопПараметрыВОповещенииПоказатьВопросПользователю.Вставить("СчетчикВопросов",-1); //первый проход будет холостой и счетчик станет 0
	ПоказатьВопросПользователю(Неопределено,ДопПараметрыВОповещенииПоказатьВопросПользователю);
КонецЕсли;

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

&НаКлиенте
Процедура ОбработкаОтветовПользователя(Параметры)
	Для каждого элт из Параметры.МассивВопросовПользователю цикл
		Сообщить(элт.ИдентификаторВопроса);
		Если элт.Свойство("ОтветНаВопрос") Тогда //если вопрос не задавался, то ответа не будет
			Сообщить(элт.ОтветНаВопрос); //вот тут имеем пару ИдентификаторВопроса:ответНаВопрос
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры

Ниже универсальный код, его можно забрать себе. Единственное, что там жестко указано - вызовы процедуры "ОбработкаОтветовПользователя". Если требуется её переименовать, не забудьте их изменить.

 
 Функция СоздатьВопросПользователю
 
 Процедура ПоказатьВопросПользователю

На этом всё. Надеюсь, кому-нибудь пригодится.

Немодальные вызовы ПоказатьВопрос Рекурсия Приемы разработки

См. также

Планы обмена VS История данных

Обмен между базами 1C Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    7146    dsdred    36    

114

1С-ная магия

Механизмы платформы 1С Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    19252    SeiOkami    46    

119

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    9572    YA_418728146    6    

143

Печать непроведенных документов для УТ, КА, ERP. Настройка печати по пользователям, документам и печатным формам

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    2298    28    progmaster    8    

3

Расширение глобального поиска 1С, или Глобальный поиск "на максималках"

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Мало кто знает, что поле "Глобального поиска" в 1С можно доработать. Добавить свои варианты поиска, кнопочки в результатах и даже целые пользовательские меню.

27.03.2023    7194    SeiOkami    10    

141

Версионирование объектов VS История данных

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Давайте разберемся в механизме «История данных» и поэкспериментируем для наглядности. Сравним «Версионирование объектов» и «Историю данных».

06.03.2023    20212    dsdred    54    

196

Практическая шпаргалка по новым возможностям языка запросов 1С

Механизмы платформы 1С Запросы Платформа 1С v8.3 Запросы Конфигурации 1cv8 Бесплатно (free)

В предлагаемой статье решил привести примеры применения новых возможностей языка запросов 1С, начиная с версии платформы 8.3.20.

21.11.2022    24064    quazare    36    

123

Расширение: Быстрые отборы через буфер [Alt+C] Копировать список, [Alt+V] Вставить список, [Ctrl+C] Копировать из файлов

Инструментарий разработчика Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

Копирует в буфер значения из списков, из ячеек отчетов, таблиц, настроек списков, других отборов и вставляет в выбранную настройку отбора. Работает с Объект не найден. Работает как в одной так и между разными базами 1С. Использует комбинации [Alt+C] Копировать список, [Alt+V] Вставить список. Также для копирования данных используется стандартная [Ctrl+C] (например из открытого xls, mxl, doc и т.п. файла скопировать список наименований)

1 стартмани

13.10.2022    16433    143    sapervodichka    112    

130
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. dhurricane 14.11.22 11:31 Сейчас в теме
Извините, если мой комментарий покажется токсичным, но если так рисовать блок-схемы, как у Вас под номером 2, то действительно есть чего испугаться.
Прикрепленные файлы:
2. tambu 66 14.11.22 22:40 Сейчас в теме
Если следовать Вашей схеме, Вопрос 2 и условие его проверки придется расположить в новой процедуре, но условие зависит от контекста в начальной процедуре. Значит придется весь контекст туда "тащить", это добавит количество кода и сделает его менее читаемым. Для двух вопросов ещё можно так сделать, но если их будет три-четыре, уже сложно и куча копи-пасты. Именно этого я пытался избежать.
3. dhurricane 14.11.22 23:42 Сейчас в теме
(2) А разве в Вашей схеме для "Вопроса 2", который справа, "тащить" контекст не нужно? Моя схема ничего нового не вводит, она является упрощением Вашей, где удалены дубли элементов.

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

Ну и не совсем понятно, о какой "копи-пасте" речь при передаче контекста. Почему бы не сделать его сквозным, покрывающим потребности всех вопросов и обработчиков, да наполняемым по мере необходимости?
4. tambu 66 15.11.22 10:03 Сейчас в теме
Вы не поняли, я как раз акцентирую внимание, что после обработчиков будут новые процедуры. На Вашей схеме это не очевидно, потому заострил на этом внимание. То есть цель моей схемы изначально была показать, что "есть чего пугаться". И судя по Вашему первому комментарию я своей цели достиг :)

С остальным даже спорить не буду - вы все правильно пишите, только это называется рефакторинг. Такие масштабные изменения должны быть оправданы.
Оставьте свое сообщение