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

Публикация № 1756608 14.11.22

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

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

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

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

 
 Схема 1.

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

 
 Схема 2.

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

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

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

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

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

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

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

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

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

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

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

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

Специальные предложения

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

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

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

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

См. также

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

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

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

27.03.2023    4308    SeiOkami    9    

121

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

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

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

06.03.2023    6091    dsdred    37    

126

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

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

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

21.11.2022    16543    quazare    34    

113

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

Универсальные обработки Инструментарий разработчика Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

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

1 стартмани

13.10.2022    11952    89    sapervodichka    92    

114

Шпаргалка по функциям АСИНХ

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

При знакомстве с новой механикой работы с асинхронностью (обещание, ждать и асинх) делал пометки, которыми и хочу поделиться. Ничего сверхъестественного в них нет, просто небольшие примеры и некоторые всплывшие нюансы использования.

29.07.2022    17757    zeltyr    17    

151

Динамическое обновление - это зло?

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

Копнем глубже в тему "Что же такое динамическое обновление" и почему оно может привести к проблемам. И может ли?

09.05.2022    18543    Infostart    80    

229

Модули общего назначения - готовые полезные функции и процедуры конфигураций на БСП

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

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

25.04.2022    10269    quazare    11    

130

Стек технологий для 1С

Инструментарий разработчика Рефакторинг и качество кода Групповая разработка (Git, хранилище) Механизмы платформы 1С Бесплатно (free)

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

29.11.2021    32559    mrXoxot    63    

429

Несколько простых приемов для удобной работы в конфигураторе

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

Простая и удобная среда разработки 1С:Предприятия позволяет практически любому человеку начать работать под капотом 1С - в конфигураторе. Время идет, новички становятся программистами, специалистами, а об удобных приемах работы узнают годами, по ходу своего карьерного пути. А здорово было бы, если бы все знали удобные приемы в начале своего пути? Эти несколько приемов будут полезны новичкам, так как они затрагивают ту область работы, с которой приходится сталкиваться в начале карьеры.

12.11.2021    13695    acces969    95    

142

Как спроектировать структуру регистра сведений

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

«Что может быть проще?» — это первое, что приходит в голову. Но что, если это не так? В этой статье мы попробуем затронуть некоторые вопросы, которые могут возникнуть при проектировании больших регистров.

08.11.2021    9253    Neti    60    

108

О формах 1С замолвите слово... Необычное использование знакомого всем объекта

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

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

13.01.2021    10896    CyberCerber    46    

101

Наследование свойств элементов, или Как пользователь может сломать вашу форму

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

В 1С можно установить свойства ТолькоПросмотр, Доступность и Видимость не только на элементы формы, но и на группы элементов. Но стоит ли так делать? Оказывается, пользователь может обойти запреты, которые установлены на папку. Об этом подробнее в видео.

12.01.2021    6849    SeiOkami    27    

112

Новое отображение ошибок в 1С

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

Рассмотрим развитие механизма отображения ошибок в 1С (начиная с 8.3.17)

10.08.2020    40553    SeiOkami    45    

147

Самый простой парсинг и обработка веб-страниц в 1С

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

Рассмотрим самый простой парсинг веб-страниц средствами платформы 1С и еще некоторые полезные приемы работы с веб-страницами.

07.08.2020    25094    Infostart    30    

146

Использование флажков в динамических списках

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

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

04.08.2020    25627    nekit_rdx    38    

131

Вы запускаете приложения, но делаете это без уважения

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

О запуске сторонних приложений и скриптов из кода встроенного языка платформы 1С.

21.07.2020    16235    Infostart    32    

137

Серверные вызовы, которые нельзя вызывать

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

Не баян, а классика. Рассмотрим особенность платформы настолько же древнюю, как сами УФ.

12.05.2020    14610    SeiOkami    34    

150

Форма выбора (подбор) в управляемых формах

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

Разбор небольших примеров того, как правильно открывать форму выбора (подбора) в управляемых формах, не прибегая к модальным окнам.

08.05.2020    180481    user5300    40    

291

Эволюция расширения конфигурации

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

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

06.02.2020    22722    Xershi    50    

194

Сходство Джаро - Винклера. Нечеткое сравнение строк

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

В области информатики и статистики сходство Джаро - Винклера представляет собой меру схожести строк для измерения расстояния между двумя последовательностями символов. В публикации рассмотрены некоторые особенности алгоритма, и представлен вариант его реализации на языке 1С.

25.12.2019    11347    brooho    21    

170

30 задач. Странных и не очень

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

30 задач на знание языка программирования 1С и некоторого поведения платформы. Маленьких. Странных и не очень.

02.12.2019    40797    Infostart    63    

161

Полезные процедуры и функции для программиста

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

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

07.10.2019    48048    HostHost    41    

284

Таблица значений. Нюансы

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

Обзор некоторых аспектов использования общеизвестного инструмента 1С.

01.10.2019    71784    Yashazz    62    

352

От чего можно отказаться при разработке расширений 1С

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

Разработка расширений 1С и оптимизация через механизм БСП: Дополнительные отчеты и обработки.

23.09.2019    12966    independ    34    

123

Критерии отбора. От простого к сложному

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

Небольшая заметка о работе с критериями отбора и их внутреннем устройстве.

22.09.2019    28335    Infostart    5    

125

Описание формата внутреннего представления данных 1С в контексте обмена данными

Механизмы платформы 1С Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

Фирма 1С не рекомендует использовать внутреннее представление данных для любых целей, которые отличны от обмена с 1С:Предприятием 7.7. Но сама возможность заглянуть на "внутреннюю кухню" платформы с помощью функций ЗначениеВСтрокуВнутр(), ЗначениеВФайл(), ЗначениеИзСтрокиВнутр() и ЗначениеИзФайла(), дала возможность сообществу программистов 1С разработать новые приемы разработки и анализа. Так, именно на использовании внутреннего представления был построен алгоритм "быстрого массива", который позволяет практически мгновенно создать массив в памяти на основании строки с разделителями. С помощью разбора внутреннего представления можно "на лету" программным кодом выполнить анализ обычной формы и даже сделать редактор графической схемы. Во внутреннем формате сохраняют свои данные между сеансами различные популярные внешние обработки. А еще это возможность сделать быстрый обмен с внешними системами.

1 стартмани

06.09.2019    25927    Dementor    32    

221

Три костыля. Сказ про фокусы в коде

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

Три интересных (или странных) костыля в коде, которые могут помочь в повседневных и не очень задачах.

03.09.2019    33188    Infostart    82    

191

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

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

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

2 стартмани

24.08.2019    24757    BenGunn    29    

132

Фоновое выполнение кода в 1С - это просто

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

Как легко запускать выполнение в фоне, не прибегая к долгому описанию фоновых процедур.

02.08.2019    89369    avalakh    33    

240

Регистры сведений. За кулисами

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

Небольшие заметки по внутреннему устройству регистров сведений.

09.07.2019    44647    Infostart    15    

175

Регистры накопления. Агрегаты в оборотных регистрах

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

Описание механизма агрегатов оборотных регистров накопления для платформы 1С 8.2. Рассмотрение хранения и принципа использования агрегатов платформой на стороне СУБД.

24.05.2019    31054    Infostart    5    

115

Регистры накопления. Виртуальные таблицы. Часть №2: "Остатки" и "Остатки и обороты"

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

Описание работы платформы 1С:Предприятие 8.2 с виртуальными таблицами регистров накопления "Остатки" и "Остатки и обороты". Анализ SQL-запрос при работе с виртуальными таблицами

22.05.2019    67258    Infostart    11    

153

Регистры накопления. Виртуальные таблицы. Часть №1: Обороты

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

Описание работы платформы 1С:Предприятие 8.2 с виртуальной таблицей "Обороты" регистров накопления.

20.05.2019    72811    Infostart    9    

154

Регистры накопления. Структура хранения в базе данных

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

Структура хранения регистров накопления в базе данных для платформы 1С:Предприятие 8.x. Первая часть в серии публикаций.

16.05.2019    88405    Infostart    35    

238

Как прикрутить ГУИД к регистру сведений

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

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

16.04.2019    25118    m-rv    18    

29

О расширениях замолвите слово...

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

О чём стоит задуматься при принятии решения о создании расширения конфигурации…

07.04.2019    47052    ellavs    131    

230

О времени и 1С

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

Основы и особенности работы со временем в 1С. Как избавиться от боли при работе в разных часовых поясах. Что такое момент времени. И другое.

01.04.2019    88739    Infostart    73    

301