ошибка 1с Использование модальных окон в данном режиме запрещено!

1с вопрос() убираю ошибку модального окна

Отказ от модальности

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

Режим использования модальности не использовать
Режим использования модальности не использовать

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

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

Отказ от модальности, заметка от 1с от января 2013 года.

Использование модальных окон в данном режиме запрещено!

Ошибка при использовании модальных функций

На днях в работе столкнулся вот с таким кодом.

&НаКлиенте
Процедура СоздатьЗаказНаПроизводство(Команда
     Если Модифицированность Тогда
		Режим = РежимДиалогаВопрос.ДаНет;	
		Ответ = Вопрос(НСтр("ru = 'В документе есть изменения. Записать?';"
		+ " en = 'Do you want to continue?'"), Режим, 0);
		Если Ответ = КодВозвратаДиалога.Нет Тогда
			Возврат;
		Иначе
			Записать();
		КонецЕсли;
	КонецЕсли;
	//Код прикладного решения
КонецПроцедуры

Код будет работать в толстом клиенте, на обычных формах, но в современных конфигурациях выдаст ошибку «Использование модальных окон в данном режиме запрещено!».

Что бы убрать модальность, нужно заменить функцию «Вопрос» на функцию «ПоказатьВопрос».

Разница в синтаксисе

Синтаксис команд очень похож, но из-за асинхронности команды показать вопрос, он немного отличается.

Вопрос()

Вопрос(<ТекстВопроса>, <Кнопки>, <Таймаут>, <КнопкаПоУмолчанию>, <Заголовок>, <КнопкаТаймаута>)

Работает в 1с начиная с версии 8.0.

ПоказатьВопрос()

ПоказатьВопрос(<ОписаниеОповещенияОЗавершении>, <ТекстВопроса>, <Кнопки>, <Таймаут>, <КнопкаПоУмолчанию>, <Заголовок>, <КнопкаТаймаута>)

Работает в 1с начиная с версии 8.3.3.

Отказываемся от модальности

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

&НаКлиенте
Процедура СоздатьЗаказНаПроизводство(Команда)
	Если Модифицированность Тогда
		Режим = РежимДиалогаВопрос.ДаНет;
		Оповещение = Новый ОписаниеОповещения("ПослеЗакрытияВопроса", ЭтотОбъект, Параметры);
		ПоказатьВопрос(Оповещение, НСтр("ru = 'В документе есть изменения. Записать?';"
		+ " en = 'Do you want to continue?'"), Режим, 0);		
	КонецЕсли;	
КонецПроцедуры

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

Запускаем и проверяем код.

ПоказатьВопрос 1с 8.3
Вопрос в управляемом приложении 1с с помощью команды ПоказатьВопрос

Ошибка про модальное окно ушла, программа работает как надо.

Материалы от 1с на тему отказа от модальности

  1. Инструменты рефакторинга и отказа от модальности
  2. Вариант работы интерфейса без использования модальных окон
  3. Асинхронные вызовы расширений браузеров и внешних компонентов
  4. Разработка конфигураций в режиме без использования модальности

Комментарии

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