Использование ПоказатьВопрос() в событии НачалоВыбора()

20.07.20

Разработка - Механизмы типовых конфигураций

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

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

В обычных формах было допустимо использование конструкции "Ответ = Вопрос()"... При вызове этой функции окно программы блокируется (т.е. работает в модальном режиме). Следовательно в пользовательском режиме будет выдана ошибка "Использование модальных окон в данном режиме запрещено".

Какую задачу решал я: 

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

Для этого мне необходимо такую проверку написать в событии "НачалоВыбора". 

Почему именно здесь? Потому как в этом событии есть параметр "СтандартнаяОбработка". 

&НаКлиенте
Процедура СпособОпределенияСпискаСотрудниковНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

Если данный параметр установить в значение Ложь, и написать Возврат, то выбор даже не начнётся. Но, к сожалению здесь использовать конструкцию ПоказатьВопрос не получится по следующим причинам:

1. Если установить параметр СтандартнаяОбработка = Ложь сразу в процедуре, то не сработает стандартный механизм выбора, который нам нужен при положительном ответе пользователя. 

2. Передать это как параметр в Оповещение тоже нельзя, т.к. назад значение не вернётся. Связано это с тем, что ПоказатьВопрос должно быть последним выполняемым действием в процедуре/функции. 

3. Возможно пользователь ничего не поменял! Тогда и смысла нет ему лишний раз показывать вопрос. Понять произошли изменения или нет можно в событиях "ПриИзменении" либо "ОбработкаВыбора".

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

1. Создаем реквизит формы с постфиксом "Исходный".

2. Запоминаем его значение до изменения в событии "НачалоВыбора":

&НаКлиенте
Процедура СпособОпределенияСпискаСотрудниковНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	
	Если Не ТаблицаПоказателей.Количество() = 0 Тогда
		СпособОпределенияСпискаСотрудниковИсходный = Объект.СпособОпределенияСпискаСотрудников;
	КонецЕсли;
	
КонецПроцедуры

3. Обрабатываем выбор в событии "ОбработкаВыбора". Здесь мы проверяем, изменилось ли вообще значение. Может и смысла нет задавать пользователю лишний вопрос, ведь он ничего не поменял!

4. Если вспомогательная таблица пустая, то вызываем процедуру, которая является оповещением, как будто пользователь нажал на кнопку "Да". Таким образом ещё уменьшаем количество сценариев, где необходимо вмешательство пользователя.

5. Если вспомогательная таблица не пуста, и значение изменилось - задаем вопрос. 

6. В случае с обычными формами, мы бы обработали выбор в обработчике "При изменении". В данной ситуации код этого обработчика ушел в оповещение. Также в оповещение через параметр передаем СтандартнаяОбработка. Ниже по коду видно, что в одном из случаев, мы устанавливаем её в значение "Ложь". Делаем это ДО ВХОДА в оповещение.

&НаКлиенте
Процедура СпособОпределенияСпискаСотрудниковОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
	
	Если Не ТаблицаПоказателей.Количество() = 0 И Не СпособОпределенияСпискаСотрудниковИсходный = Объект.СпособОпределенияСпискаСотрудников Тогда
		СтандартнаяОбработка = Ложь;
		СтруктураПараметров = Новый Структура("ВыбранноеЗначение, СтандартнаяОбработка", ВыбранноеЗначение, СтандартнаяОбработка);
		
		Оповещение = Новый ОписаниеОповещения("СпособОпределенияСпискаСотрудниковЗавершениеВыбора", ЭтотОбъект, СтруктураПараметров);
		ПоказатьВопрос(Оповещение, "Уже выбраны показатели. Некоторые могут пропасть при изменении способа определения списка сотрудников! Продолжить?", РежимДиалогаВопрос.ДаНет);
	Иначе
		СтруктураПараметров = Новый Структура("ВыбранноеЗначение, СтандартнаяОбработка", ВыбранноеЗначение, СтандартнаяОбработка);
		
		СпособОпределенияСпискаСотрудниковЗавершениеВыбора(КодВозвратаДиалога.Да, СтруктураПараметров);
	КонецЕсли;
	
КонецПроцедуры

7. Последняя задача - обработать выбор пользователя в оповещении. Если пользователь ответил "Нет", то возвращаем исходное значение реквизита из реквизита формы. 

8. Выполняем необходимые действия при изменении:

&НаКлиенте
Процедура СпособОпределенияСпискаСотрудниковЗавершениеВыбора(Результат, ПараметрыКоманды) Экспорт
	
	Если Результат = КодВозвратаДиалога.Нет Тогда
	    Объект.СпособОпределенияСпискаСотрудников = СпособОпределенияСпискаСотрудниковИсходный;
		
		Возврат;
	ИначеЕсли Результат = КодВозвратаДиалога.Да Тогда
		Если Не ПараметрыКоманды.СтандартнаяОбработка Тогда
		    Объект.СпособОпределенияСпискаСотрудников = ПараметрыКоманды.ВыбранноеЗначение;
		КонецЕсли; 
	КонецЕсли; 

 	ЗаполнитьДостуныеИИспользуемыеДанные(Объект.ТипВыгрузки, Объект.СпособОпределенияСпискаСотрудников);
	
	УстановитьВидимость();

КонецПроцедуры // СпособОпределенияСпискаСотрудниковЗавершениеВыбора()

Обратите внимание на то, что процедура СпособОпределенияСпискаСотрудниковЗавершениеВыбора экспортная. Не забывайте для оповещений ставить Экспорт.

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

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

НачалоВыбора асинхронный вызов ПоказатьВопрос модальность вопрос

См. также

Ценовая власть. Выносим из цикла схему СКД

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

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

1 стартмани

11.04.2024    499    tango    0    

3

Формула в реквизите. Приквелл к сериалу "Ценовая власть"

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

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

10 стартмани

11.04.2024    385    tango    5    

3

Ценовая власть. Второй сезон

Механизмы типовых конфигураций Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 Россия Бесплатно (free)

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

08.04.2024    638    tango    0    

2

Ценовая власть (УТ 11.5) - 2

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

В прошлый раз специальной обработкой мы выбрали объекты УТ 1.5, группируя по подсистемам. Оказалось, что состав подсистем не вполне корректно отображает функциональную структуру, но зато мы нашли процедуру, которая, вроде бы, должна содержать в себе всё, что нас интересует. Обновление цен должно ведь следовать выбранной стратегии ценообразования, верно? Иначе что она обновляет...

06.04.2024    446    tango    1    

1

Ценовая власть или Управление ценообразованием (УТ 11.5)

Ценообразование, анализ цен Механизмы типовых конфигураций Платформа 1С v8.3 Оперативный учет 1С:Управление торговлей 11 Россия Управленческий учет Абонемент ($m)

Ценовая власть - это способность (возможность) компании изменять в некоторых пределах отпускную цену своего товара (услуг, продукции). Чем в более широких пределах вы можете играть в цену продажи, тем больше этой власти у вас. Если вы не можете управлять отпускной ценой, то это или не ваш бизнес, или не бизнес вовсе. Здесь в рубрике "База знаний аналитика и руководителя проекта" слово проект не ограничено "проектом в 1С". Посмотрим, что для этого есть в УТ 11.5.

1 стартмани

05.04.2024    534    tango    12    

2

Расширяем возможности дополнительных обработок и настраиваем их отладку

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

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

07.02.2024    2607    YA_418728146    11    

43

Регистры накопления в 1С:КА2 и 1С:ERP для расчета НДФЛ, страховых взносов и взаиморасчетов с сотрудниками на январь 2024 года. Краткое описание

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

Для расчета зарплаты и соответствующих налогов в конфигурациях 1С:КА2 и 1С:ERP используется 22 регистра накопления, 7 регистров сведений, 1 регистр расчета и бухгалтерские проводки. В таблице приведены названия этих регистров, указаны основные регистраторы и виды движений приход/расход. В описании приводится краткое функциональное назначение регистров в основных зарплатных процессах. Описание регистров родилось из черновиков при написании различных отчетов и обработок при эксплуатации 1С-овских конфигураций и исправлении ошибок по НДФЛ, взаиморасчетов с сотрудниками и прочих. Информация не претендует на полноценное описание работы регистров, скорее это дискуссионный материал. Но, возможно, кому-то пригодится и сократит время при подготовке отчетности за непростой (в плане учета зарплаты) 2023 год. А возможно, кто-то поделится своим опытом.

1 стартмани

10.01.2024    1150    8    2ncom    6    

8

Шаблоны новых объектов 1С для 1С:Бухгалтерии предприятия

Инструментарий разработчика БСП (Библиотека стандартных подсистем) Механизмы типовых конфигураций Платформа 1С v8.3 1С:Бухгалтерия 3.0 Бесплатно (free)

Используются для создания новых объектов в конфигурации, чтобы не забыть, что нужно сделать. Сделано на примере 1С:Бухгалтерия предприятия, в других конфигурациях могут быть другие, а могут быть и похожие объекты.

28.12.2023    4972    mrXoxot    11    

100
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Cirdan 07.08.20 13:09 Сейчас в теме
Посмотрите у поля формы свойство ПредупреждениеПриРедактировании и ОтображениеПредупрежденияПриРедактировании. С помощью них можно решить вашу задачу если правильно ее понял.
перед началом редактирования будет выведено диалоговое окно с текстом из свойтва ПредупреждениеПриРедактировании и вопросом "Продолжить редактирование?"
vlastek; Oxygraphis; Pyryrym; +3
2. biimmap 1860 07.08.20 15:31 Сейчас в теме
(1) Это подходит если при любом выборе требуется предупреждение. В моей задаче оно нужно только в одном сценарии. Этот сценарий описан в статье. При остальных сценариях ничего быть не должно. Ну и собственно обработчика предложенный механизм не имеет.
+
Оставьте свое сообщение