1С. ОписаниеОповещения

ОписаниеОповещения — объект встроенного языка 1С:Предприятия, указывающий на процедуру, в которой будет продолжено исполнение кода при наступлении определенного события.

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

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

Основным инструментом отказа от модальности стало ОписаниеОповещения.

Как работает ОписаниеОповещения

Для начала разберем как работает платформа с модальными окнами на примере метода Вопрос(). Напишем не хитрый код, в котором пользователю показывается диалог с вопросом и вариантами ответа Да и Нет.

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

В данном случае пользователю будет показан диалог, а работа клиентской части будет полностью приостановлена до момента, пока пользователь не ответит на вопрос.

Диалог с ОписаниеОповещения

Тогда результат поместится в переменную Ответ и только после этого работа клиентской части будет возобновлена для выполнения алгоритма заполнения.

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

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

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

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

После ответа пользователя будет вызвана процедура ОбработатьОтветПользователя(), которую мы указали в конструкторе ОписаниеПоповещения и только тогда будет выполнен алгоритм заполнения.

Описание функционала от разработчиков на ИТС

Синтаксис

Конструктор ОписаниеОповещения имеет 5 необязательных параметров:

Новый ОписаниеОповещения(<ИмяПроцедуры>, <Модуль>, <ДополнительныеПараметры>, <ИмяПроцедурыОбработкиОшибки>, <МодульОбработкиОшибки>)

ИмяПроцедуры — Имя экспортируемой процедуры, которая будет вызвана;

Модуль — Модуль в котором расположена вызываемая процедура. Могут быть указаны Форма, Общий модуль, Команда командного интерфейса;

ДополнительныеПараметры — Произвольное значение, которое будет передано в вызываемую процедуру последним параметром;

ИмяПроцедурыОбработкиОшибки — Имя экспортируемой процедуры, которая будет вызвана в случае ошибки;

МодульОбработкиОшибки — Модуль в котором расположена вызываемая процедура в случае ошибки. Могут быть указаны Форма, Общий модуль, Команда командного интерфейса.

Вызываемая процедура и её параметры

Вызываемая процедура должна быть экспортируемой, и в самом простом случае содержать два параметра Результат и ДополнительныеПараметры.

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

В зависимости от объекта в котором используется ОписаниеОпопвещения, количество параметров вызываемой процедуры может меняться.

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

Для избежания ошибок обращайтесь к Синтаксис-помощнику, там описано количество и порядок необходимых параметров.

Выполнение обработки оповещения

В платформе реализован метод  ВыполнитьОбработкуОповещения(), для возможности непосредственного выполнения обработки оповещения.

Методу в качестве параметра необходимо передать ОписаниеОповещения, которое будет выполнено. Так же можно передать в процедуру обработки произвольный результат вторым необязательным параметром.

&НаКлиенте
Процедура ВыполнениеОписанияОповещения(Команда)
	
    Оповещение = Новый ОписаниеОповещения("ОбработатьОтветПользователя", ЭтаФорма);
    ВыполнитьОбработкуОповещения(Оповещение, КодВозвратаДиалога.Да); 
	
КонецПроцедуры

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

Работа на сервере

ОписаниеОповещения не доступно на сервере, но в качестве исполняемой процедуры можно указать серверный метод. В справке нет явного указания о данной возможности, но и противоречий нет.

&НаКлиенте
Процедура ОбрабокаЗакрытияФормы(Команда)
		
    Оповещение = Новый ОписаниеОповещения("ПослеПодбора", ЭтаФорма);
    ОткрытьФорму("Справочник.Номенклатура.ФормаВыбора", , ЭтаФорма, , , , Оповещение);

КонецПроцедуры

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

Возможные ошибки

Не найден экспортируемый метод

Если вызываемая процедура не экспортная, то при исполнении будет вызвано исключение. Решается указанием экспортной процедуры.

Не найден экспортируемый метод

Количество параметров 1. Ожидаемое количество – 2

Если вызываемая процедура будет объявлена с одним параметром, то при исполнении будет вызвано исключение. Решается добавлением второго параметра в вызываемую процедуру.

Количество параметров 1. Ожидаемое количество – 2

Примеры использования ОписаниеОповещения

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

Оповещение о закрытии формы

Реализуем функционал открытия формы подбора с дальнейшей обработкой результата

&НаКлиенте
Процедура Подбор(Команда)
	
    // Параметры для работы подбора
    ПараметрыПодбора = Новый Структура;
    ПараметрыПодбора.Вставить("Параметр1", Истина);
    ПараметрыПодбора.Вставить("Параметр2", Ложь);
	
    // Опишем процедуру, которая будет вызвана после подбора
    Оповещение	= Новый ОписаниеОповещения("ПослеПодбора", ЭтаФорма);
	
    // Заблокируем форму владельца
    РежимОткрытия	= РежимОткрытияОкнаФормы.БлокироватьОкноВладельца;
	
    ОткрытьФорму("Справочник.Номенклатура.Форма.ФормаПодбора", ПараметрыПодбора, ЭтаФорма, , , , Оповещение, РежимОткрытия);
	
КонецПроцедуры

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

Ввод значений и предупреждения

Реализуем функционал ввода числа. После ввода выполним проверку на четность введенного числи, если число не четное выведем предупреждение

&НаКлиенте
Процедура ВвестиЧетноеЧисло(Команда)

    Оповещение	= Новый ОписаниеОповещения("ПослеВводаЧисла", ЭтаФорма);
    Подсказка	= "Введите четное число";
    ПоказатьВводЧисла(Оповещение, , Подсказка);
	
КонецПроцедуры

&НаКлиенте
Процедура ПослеВводаЧисла(ВведенноеЧисло, ДополнительныеПараметры) Экспорт 

    // Если пользователь откажется от ввода вернется Неопределено	
    Если ВведенноеЧисло = Неопределено Тогда	 
        Возврат;
    КонецЕсли;
	
    ЧислоЧетное = ВведенноеЧисло % 2 = 0;
	
    Если Не ЧислоЧетное Тогда
        // Первый параметр не обязателен. Если не надо обрабатывать
        // завершение предупреждения просто не заполняем 
	ПоказатьПредупреждение( , "Введено не четное число");
    КонецЕсли;	
	
КонецПроцедуры

Проверка существования файла и передача описания оповещения через дополнительные параметры

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

Разработаем функционал проверки существования файла. В модуле реализована процедура для централизованной обработки ошибок ОповеститьОбОшибке(), будем передавать ОписаниеОповещения об ошибке через дополнительные параметры.

&НаКлиенте
Процедура ПрочитатьФайл(Команда)
	
	ПутьКФайлу = ПутьКФайлуФлагу();
	
	// Оповещение для обработки ошибки
	ОповещениеОбОшибке = Новый ОписаниеОповещения("ОповеститьОбОшибке", ЭтаФорма);
	
	// Оповещение проверки существоания файла
	// с передачей оповещения об ошибке через дополнительные параметры
	ДополнительныеПараметры = Новый Структура;
	ДополнительныеПараметры.Вставить("ОповещениеОбОшибке", ОповещениеОбОшибке);
	
	ОповещениеПроверки = Новый ОписаниеОповещения("ПослеПроверкиСуществованияФайла", ЭтаФорма, ДополнительныеПараметры);
	
	// ПРоверка существования файла
	Файл = Новый Файл(ПутьКФайлу);
	Файл.НачатьПроверкуСуществования(ОповещениеПроверки);
		
КонецПроцедуры

Обработаем результат проверки существования файла. Если файл не существует, выполним обработку оповещения переданного через дополнительные параметры

&НаКлиенте
Процедура ПослеПроверкиСуществованияФайла(Существует, ДополнительныеПараметры) Экспорт 
	
    Если Не Существует Тогда 
		
	Если ДополнительныеПараметры.Свойство("ОповещениеОбОшибке") Тогда 
			
		ТекстОшибки = "Файл не существует!";
		ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОповещениеОбОшибке, ТекстОшибки);
			
	КонецЕсли;	
		
	Возврат;
		
    КонецЕсли;
	
    // Код для дальнейшей обработки файла
	
КонецПроцедуры

Процедура для централизованной обработки ошибок

&НаКлиенте
Процедура ОповеститьОбОшибке(ТекстОшибки, ДополнительныеПараметры) Экспорт 
	
    // Сообщим об ошибке
    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = ТекстОшибки;
    Сообщение.Сообщить();

    // Код для дальнейшей обработки ошибки
	
КонецПроцедуры
Понравилась статья? Поделиться с друзьями:
Комментарии: 3
  1. Алексей

    После обновления не работает ОтписаниеОповещения на сервере, только клиентская функция, унф на платформе 8.3.21.

  2. Гекко

    ОписаниеПоповещения :mrgreen: :mrgreen: :mrgreen:

    1. Guesto (автор)

      Гекко, бывает и такое)

      Спасибо, поправил!

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

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: