1С, обработка оповещения на примере формы подбора товара
Программный код формы документа «Заказ покупателя»:
&НаКлиенте Процедура Подбор(Команда) ОткрытьФорму("Обработка.ПодборНоменклатуры.Форма.Форма",, ЭтаФорма,,,,, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); КонецПроцедуры &НаКлиенте Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) АдресВХ = Параметр; Если ИмяСобытия = "ЗаполнитьПоПодбору" Тогда Объект.Номенклатура.Очистить(); ЗаполнитьПоПодборуНаСервере(АдресВХ); КонецЕсли; КонецПроцедуры &НаСервере Процедура ЗаполнитьПоПодборуНаСервере(АдресВХ) НоменклатураТаблицаЗначений = ПолучитьИзВременногоХранилища(АдресВХ); Объект.Номенклатура.Загрузить(НоменклатураТаблицаЗначений); КонецПроцедуры
Открываем форму обработки подбора номенклатуры, в форме должна присутствовать таблица значений с колонками «Флаг» (булево), «Номенулатура» (ссылка);
Программный код формы подбора номенклатуры, оповещение форм:
&НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) Запрос = Новый Запрос( "ВЫБРАТЬ | Номенклатура.Ссылка КАК Номенклатура, | ЛОЖЬ КАК Флаг |ИЗ | Справочник.Номенклатура КАК Номенклатура"); НоменклатураТаблицаЗначений.Загрузить(Запрос.Выполнить().Выгрузить()); КонецПроцедуры &НаКлиенте Процедура Перенести(Команда) АдресВХ = ПеренестиСервере(); Оповестить("ЗаполнитьПоПодбору", АдресВХ); ЭтаФорма.Закрыть(); КонецПроцедуры Функция ПеренестиСервере() УдалитьСтроки = НоменклатураТаблицаЗначений.НайтиСтроки(Новый Структура("Флаг", Ложь)); Для каждого Строка Из УдалитьСтроки Цикл НоменклатураТаблицаЗначений.Удалить(Строка); КонецЦикла; Возврат ПоместитьВоВременноеХранилище(НоменклатураТаблицаЗначений.Выгрузить()); КонецФункции
Процедура ОбработкаОповещения()
Предопределенная процедура ОбработкаОповещения() имеет следующий синтаксис:
ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
А также альтернативный англоязычный синтаксис:
NotificationProcessing(EventName, Paramener, Source)
Параметры
Описание параметров процедуры ОбработкаОповещения() :
| Имя параметра* | Тип | Описание |
|---|---|---|
| ИмяСобытия | Строка | Переданное имя события. Может быть использовано для идентификации сообщений. |
| Параметр | Произвольный | Произвольные данные |
| Источник | Произвольный | Источник события, например, другая форма или элемент управления. |
| *Жирным шрифтом выделены обязательные параметры | ||
Описание
Предопределенная процедура ОбработкаОповещения() вызывается всякий раз при поступлении оповещения, отправленного методом Оповестить() из другой формы. Процедура ОбработкаОповещения() должна располагаться в форме объекта.
Доступность
| Версия | Поддержка |
|---|---|
| 8.1 | не поддерживается! |
| 8.2 | Толстый клиент, Тонкий клиент, Веб-клиент |
| 8.3 | Толстый клиент, Тонкий клиент, Веб-клиент, Мобильный клиент, Мобильное приложение |
Пример использования
Пример кода с использованием процедуры ОбработкаОповещения() :
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) Если ИмяСобытия = "Документ.ЗаказПокупателя.Изменен" Тогда ЭтаФорма.Обновить(); КонецЕсли; КонецПроцедуры
Читайте также:
1С. ОписаниеОповещения
ОписаниеОповещения — объект встроенного языка 1С:Предприятия, указывающий на процедуру, в которой будет продолжено исполнение кода при наступлении определенного события.
Вслед за браузерами, которые отказались от модальности, технологической платформе пришлось перейти на асинхронную работу клиентской части. Необходимо это было для поддержки веб-клиента.
Ведь формы выбора файлов, вопросов, предупреждений, ввода значений, да и зачастую формы, от результата работы в которых зависит дальнейший ход событий, были модальными.
Основным инструментом отказа от модальности стало ОписаниеОповещения.
Как работает ОписаниеОповещения
Для начала разберем как работает платформа с модальными окнами на примере метода Вопрос(). Напишем не хитрый код, в котором пользователю показывается диалог с вопросом и вариантами ответа Да и Нет.
Процедура ВыполнитьКоманду(Команда) Ответ = Вопрос("Табличная часть будет очищена. Продолжить?", РежимДиалогаВопрос.ДаНет); Если Ответ = КодВозвратаДиалога.Нет Тогда Возврат; КонецЕсли; // Алгоритм заполнения КонецПроцедуры
В данном случае пользователю будет показан диалог, а работа клиентской части будет полностью приостановлена до момента, пока пользователь не ответит на вопрос.
Тогда результат поместится в переменную Ответ и только после этого работа клиентской части будет возобновлена для выполнения алгоритма заполнения.
Напишем аналогичный пример, но уже без модального вызова. Будем использовать метод ПоказатьВопрос(), которому передадим ОписаниеОповещения.
&НаКлиенте Процедура ВыполнитьКоманду(Команда) Оповещение = Новый ОписаниеОповещения("ОбработатьОтветПользователя", ЭтаФорма); ПоказатьВопрос(Оповещение, "Табличная часть будет очищена. Продолжить?", РежимДиалогаВопрос.ДаНет); // Дальнейший алгоритм КонецПроцедуры &НаКлиенте Процедура ОбработатьОтветПользователя(Ответ, ДополнительныеПараметры) Экспорт Если Ответ = КодВозвратаДиалога.Нет Тогда Возврат; КонецЕсли; // Алгоритм заполнения КонецПроцедуры
Пользователь не заметит разницы, ведь будет показан точно такой же диалог с вопросом. Но исполнение кода не будет приостановлено, вместо этого будет исполнен дальнейший алгоритм и будет завершена работа текущей процедуры.
После ответа пользователя будет вызвана процедура ОбработатьОтветПользователя(), которую мы указали в конструкторе ОписаниеПоповещения и только тогда будет выполнен алгоритм заполнения.
Описание функционала от разработчиков на ИТС
Синтаксис
Конструктор ОписаниеОповещения имеет 5 необязательных параметров:
Новый ОписаниеОповещения( , , , , )
ИмяПроцедуры — Имя экспортируемой процедуры, которая будет вызвана;
Модуль — Модуль в котором расположена вызываемая процедура. Могут быть указаны Форма, Общий модуль, Команда командного интерфейса;
ДополнительныеПараметры — Произвольное значение, которое будет передано в вызываемую процедуру последним параметром;
ИмяПроцедурыОбработкиОшибки — Имя экспортируемой процедуры, которая будет вызвана в случае ошибки;
МодульОбработкиОшибки — Модуль в котором расположена вызываемая процедура в случае ошибки. Могут быть указаны Форма, Общий модуль, Команда командного интерфейса.
Вызываемая процедура и её параметры
Вызываемая процедура должна быть экспортируемой, и в самом простом случае содержать два параметра Результат и ДополнительныеПараметры.
&НаКлиенте Процедура ПроцедураОбработкиОповещения(Результат, ДополнительныеПараметры) Экспорт Если Результат = Неопределено Тогда Возврат; КонецЕсли; // Код для обработки результата КонецПроцедуры
В зависимости от объекта в котором используется ОписаниеОпопвещения, количество параметров вызываемой процедуры может меняться.
Например вызываемая процедура для обработки оповещения метода глобального контекста НачатьПомещениеФайла() должна иметь 4 параметра.
Для избежания ошибок обращайтесь к Синтаксис-помощнику, там описано количество и порядок необходимых параметров.
Выполнение обработки оповещения
В платформе реализован метод ВыполнитьОбработкуОповещения(), для возможности непосредственного выполнения обработки оповещения.
Методу в качестве параметра необходимо передать ОписаниеОповещения, которое будет выполнено. Так же можно передать в процедуру обработки произвольный результат вторым необязательным параметром.
&НаКлиенте Процедура ВыполнениеОписанияОповещения(Команда) Оповещение = Новый ОписаниеОповещения("ОбработатьОтветПользователя", ЭтаФорма); ВыполнитьОбработкуОповещения(Оповещение, КодВозвратаДиалога.Да); КонецПроцедуры &НаКлиенте Процедура ОбработатьОтветПользователя(Ответ, ДополнительныеПараметры) Экспорт Если Ответ = КодВозвратаДиалога.Нет Тогда Возврат; КонецЕсли; // Алгоритм заполнения КонецПроцедуры
Работа на сервере
ОписаниеОповещения не доступно на сервере, но в качестве исполняемой процедуры можно указать серверный метод. В справке нет явного указания о данной возможности, но и противоречий нет.
&НаКлиенте Процедура ОбрабокаЗакрытияФормы(Команда) Оповещение = Новый ОписаниеОповещения("ПослеПодбора", ЭтаФорма); ОткрытьФорму("Справочник.Номенклатура.ФормаВыбора", , ЭтаФорма, , , , Оповещение); КонецПроцедуры &НаСервере Процедура ПослеПодбора(РезультатЗакрытия, ДополнительныеПараметры) Экспорт Если Не РезультатЗакрытия = Неопределено Тогда Возврат; КонецЕсли; // Обработка результата выбора КонецПроцедуры
Возможные ошибки
Не найден экспортируемый метод
Если вызываемая процедура не экспортная, то при исполнении будет вызвано исключение. Решается указанием экспортной процедуры.

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

Примеры использования ОписаниеОповещения
ОписаниеОповещения может использоваться во множестве сценариев, например обработка результата открытия форм, диалог выбора файла, работа с файлами, чтение и запись данных, работа с табличными и текстовыми документами. Разберем некоторые из них.
Оповещение о закрытии формы
Реализуем функционал открытия формы подбора с дальнейшей обработкой результата
&НаКлиенте Процедура Подбор(Команда) // Параметры для работы подбора ПараметрыПодбора = Новый Структура; ПараметрыПодбора.Вставить("Параметр1", Истина); ПараметрыПодбора.Вставить("Параметр2", Ложь); // Опишем процедуру, которая будет вызвана после подбора Оповещение = Новый ОписаниеОповещения("ПослеПодбора", ЭтаФорма); // Заблокируем форму владельца РежимОткрытия = РежимОткрытияОкнаФормы.БлокироватьОкноВладельца; ОткрытьФорму("Справочник.Номенклатура.Форма.ФормаПодбора", ПараметрыПодбора, ЭтаФорма, , , , Оповещение, РежимОткрытия); КонецПроцедуры &НаКлиенте Процедура ПослеПодбора(РезультатЗакрытия, ДополнительныеПараметры) Экспорт Если РезультатЗакрытия = Неопределено Тогда Возврат; КонецЕсли; // Код для обработки результата подбора КонецПроцедуры
Ввод значений и предупреждения
Реализуем функционал ввода числа. После ввода выполним проверку на четность введенного числи, если число не четное выведем предупреждение
&НаКлиенте Процедура ВвестиЧетноеЧисло(Команда) Оповещение = Новый ОписаниеОповещения("ПослеВводаЧисла", ЭтаФорма); Подсказка = "Введите четное число"; ПоказатьВводЧисла(Оповещение, , Подсказка); КонецПроцедуры &НаКлиенте Процедура ПослеВводаЧисла(ВведенноеЧисло, ДополнительныеПараметры) Экспорт // Если пользователь откажется от ввода вернется Неопределено Если ВведенноеЧисло = Неопределено Тогда Возврат; КонецЕсли; ЧислоЧетное = ВведенноеЧисло % 2 = 0; Если Не ЧислоЧетное Тогда // Первый параметр не обязателен. Если не надо обрабатывать // завершение предупреждения просто не заполняем ПоказатьПредупреждение( , "Введено не четное число"); КонецЕсли; КонецПроцедуры
Проверка существования файла и передача описания оповещения через дополнительные параметры
При работе на стороне клиента, например с оборудованием, логику работы системы можно организовать при помощи оповещений. Можно передавать ОписаниеОповещения в качестве следующего шага, ветвления логики или вызывать одно оповещение из нескольких мест.
Разработаем функционал проверки существования файла. В модуле реализована процедура для централизованной обработки ошибок ОповеститьОбОшибке(), будем передавать ОписаниеОповещения об ошибке через дополнительные параметры.
&НаКлиенте Процедура ПрочитатьФайл(Команда) ПутьКФайлу = ПутьКФайлуФлагу(); // Оповещение для обработки ошибки ОповещениеОбОшибке = Новый ОписаниеОповещения("ОповеститьОбОшибке", ЭтаФорма); // Оповещение проверки существоания файла // с передачей оповещения об ошибке через дополнительные параметры ДополнительныеПараметры = Новый Структура; ДополнительныеПараметры.Вставить("ОповещениеОбОшибке", ОповещениеОбОшибке); ОповещениеПроверки = Новый ОписаниеОповещения("ПослеПроверкиСуществованияФайла", ЭтаФорма, ДополнительныеПараметры); // ПРоверка существования файла Файл = Новый Файл(ПутьКФайлу); Файл.НачатьПроверкуСуществования(ОповещениеПроверки); КонецПроцедуры
Обработаем результат проверки существования файла. Если файл не существует, выполним обработку оповещения переданного через дополнительные параметры
&НаКлиенте Процедура ПослеПроверкиСуществованияФайла(Существует, ДополнительныеПараметры) Экспорт Если Не Существует Тогда Если ДополнительныеПараметры.Свойство("ОповещениеОбОшибке") Тогда ТекстОшибки = "Файл не существует!"; ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОповещениеОбОшибке, ТекстОшибки); КонецЕсли; Возврат; КонецЕсли; // Код для дальнейшей обработки файла КонецПроцедуры
Процедура для централизованной обработки ошибок
&НаКлиенте Процедура ОповеститьОбОшибке(ТекстОшибки, ДополнительныеПараметры) Экспорт // Сообщим об ошибке Сообщение = Новый СообщениеПользователю; Сообщение.Текст = ТекстОшибки; Сообщение.Сообщить(); // Код для дальнейшей обработки ошибки КонецПроцедуры
Обработка оповещения
т.е. нужно после закрытия вызываемой формы выполнять некие действия. Ошибок при выполнении нет, но и результата ноль. 1с процедуру находит, но не выполняет.
Но опыт показывает, что в 99,9 % проблема все-же не в лыжах, я что-то делаю не так. Но что?
По теме из базы знаний
- Чат и оповещение пользователей 1С+Mysql
- На клиенте или на сервере (описание оповещения)
- [ЕХТ] Фреймворк для Расширений 1С: Обработка событий: описание, примеры и демобаза.
- Оповещение о предстоящих «задачах организации»
- Как поделиться ссылкой на документ в обработке Диадок
- Дата
- Дата
- Рейтинг всех уровней
- Рейтинг 1-го уровня
- Древо развёрнутое
- Древо свернутое
Свернуть все
3. dj_serega 389 09.08.15 21:16 Сейчас в теме
(1) Serega-artem, Странно что ошибки нет. В процедуре-приемнике должно быть 2 параметра.
Глобальный контекст (Global context)
ПоказатьЗначение (ShowValue)
Синтаксис:
4. spacecraft 09.08.15 21:21 Сейчас в теме
(3) dj_serega, да там и так 2 параметра.
5. dj_serega 389 09.08.15 21:24 Сейчас в теме
(4) spacecraft, вот тут?
Прикрепленные файлы:
6. spacecraft 09.08.15 21:26 Сейчас в теме
(5) dj_serega, а, не правильно прочитал. Там да, надо бы. Но один параметр.
7. dj_serega 389 09.08.15 21:29 Сейчас в теме
(6) spacecraft, И я не то вырезал :)))
воть:
Тип: ОписаниеОповещения.
Содержит описание процедуры, которая будет вызвана после закрытия окна ввода значения с параметром , который содержит значение, указанное при создании объекта ОписаниеОповещения.
Если параметр не указан, то по завершении никакая процедура вызвана не будет.
9. Serega-artem 15 09.08.15 21:34 Сейчас в теме
(7) dj_serega, Это я в СП читал! Но не понял о каком параметре идет речь? Создалось впечатление, что речь идет о первом параметре процедуры ПоказатьЗначение(). т.е. если ПоказатьЗначение(Оповещение, СсылкаНаЧтоТо) — после зарытия вызываемой формы будет выполнена процедура, а если ПоказатьЗначение(, СсылкаНаЧтоТо) — то ничего выполняться не будет (что логично). Вообще как-то в СП невнятно, на мой взгляд, описана ситуация.
2. Serega-artem 15 09.08.15 20:38 Сейчас в теме
p/s Платформа 8.3 (8.3.6.2152), управляемое приложение.
8. Serega-artem 15 09.08.15 21:31 Сейчас в теме
Спасибо за ответы!
В вызове формы (ПоказатьЗначение()) действительно два параметра: Оповещение и ссылка на то, что открываем. Они заполнены. А какой параметр должен быть в процедуре, которая отрабатывает при завершении?
10. dj_serega 389 09.08.15 21:44 Сейчас в теме
(8) Serega-artem,
Процедура СтартОбновленияТекДанных (ДаХотьЭтоБудетПараметром)
Вот если параметра не будет. ПРоцедура не будет вызвана. Я так понял.
11. Serega-artem 15 09.08.15 21:52 Сейчас в теме
(10) dj_serega, Побывал так, ноль эффекта. Сейчас снова попробовал (а вдруг!) — ничего. Побывал играться с местами расположения процедур (модуль формы, модуль объекта, общий модуль), с типом вызова (клиент, сервер), с «экспортностью» (добавлял, убирал ключевое слово «Экспорт») — всегда два варианта развития событий: либо 1с «кричит», что не может найти процедуру («Не найден экспортируемый метод: «), либо молчит, но не выполняет.
12. hroa 10.08.15 12:51 Сейчас в теме
Используется для описания вызова процедуры программного модуля, который будет осуществлен при наступлении какого-либо ожидаемого события, такого как закрытие формы или немодального диалога.
У вас наступило это событие? Которое вы ожидаете?
13. Serega-artem 15 10.08.15 13:11 Сейчас в теме
(12) hroa, Спасибо за участие!
Смотрите, как я понимаю. Запускаем процедуру ПоказатьЗначение(), она вызывает форму, когда форма закрывается, и наступает событие. Вполне допускаю, что я мыслю неверно, но как тогда понять наступило событие или нет?
Задача реализуется следующая:
Есть ТЧ обработки, в эту ТЧ запросом отбираются элементы справочника, по условиям. ТЧ для пользователя отображается в режиме «Только просмотр», при клике на конкретную строку открываем форму по ссылке, которая есть в строке процедурой ПоказатьЗначение(). После того, как пользователь внес изменения в элемент справочника и закрыл форму, нужно очистить и заново заполнить ТЧ т.к. вполне возможно, что данный измененный элемент уже не нужен в ТЧ. Т.е. как только пользователь закрыл форму, нужно запускать процедуру переформирования ТЧ. Можно решить задачу модальным окном, но это не айс, сами понимаете.
