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

14.11.22

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

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

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

 
 Схема 1.

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

 
 Схема 2.

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

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

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

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

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

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

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

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

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

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

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

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

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

См. также

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

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

23.06.2024    4175    bayselonarrend    18    

144

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

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

21.05.2024    12260    dimanich70    81    

126

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

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

11.12.2023    8959    dsdred    44    

125

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

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

06.10.2023    21171    SeiOkami    46    

129

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

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

28.08.2023    11681    YA_418728146    7    

157

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

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

2 стартмани

22.08.2023    2873    43    progmaster    8    

4

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

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

27.03.2023    7728    SeiOkami    10    

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

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

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

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