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

14.11.22

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

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

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

 
 Схема 1.

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

 
 Схема 2.

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

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

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

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

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

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

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

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

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

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

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

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

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

См. также

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

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

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

11.12.2023    7710    dsdred    36    

115

1С-ная магия

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

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

06.10.2023    20060    SeiOkami    46    

124

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

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

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

28.08.2023    10348    YA_418728146    7    

148

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

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

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

2 стартмани

22.08.2023    2524    35    progmaster    8    

4

Все скопируем и вставим! (Буфер обмена в 1С 8.3.24)

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

Рассмотрим новую возможность 8.3.24 и как её можно эффективно использовать

27.06.2023    18286    SeiOkami    31    

108

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

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

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

27.03.2023    7407    SeiOkami    10    

142

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

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

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

06.03.2023    21687    dsdred    60    

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

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

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

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