1С. Интерфейс без модальных окон

Задача

…перед выполнением команды необходимо пользователю задать вопрос «Табличная часть будет очищена. Продолжить?» с вариантами ответа «Да», «Нет». При ответе пользователя «Да» очищать табличную часть, при ответе «Нет» прерывать выполнение команды. …

Реализация

Как обычно пишу код:

Процедура ВыполнитьКоманду(Команда)
	
	Ответ = Вопрос("Табличная часть будет очищена. Продолжить?", РежимДиалогаВопрос.ДаНет);
	
	Если Ответ = КодВозвратаДиалога.Да Тогда	 
		Возврат;
	КонецЕсли;
	
	//Алгоритм заполнения
	
КонецПроцедуры

При выполнении обработки в БП 3.0 получаю ошибку «Использование модальных окон в данном режиме запрещено».
error_modal_window

Вспоминаем, что еще в январе в зазеркалье была написана статья по работе без модальных окон.

Правильная реализация

Из статьи узнаем, что теперь необходимо создавать новый системный объект «ОписаниеОповещения»

Описание объекта ОписаниеОповещения:

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

Так же теперь нужно заменять операторы, которые вызывали модальные окна:

  1. Вопрос()                                            ПоказатьВопрос();
  2. Предупреждение()                      ПоказатьПредупреждение();
  3. ВвестиЧисло()                               ПоказатьВводЧисла();

Подробную информацию по используемым объектам и методам можно посмотреть в справке 1С.

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

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

Источник: Зазеркалье 1С

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *