1с показатьзначение не вызывает оповещение
ОписаниеОповещения — объект встроенного языка 1С:Предприятия, указывающий на процедуру, в которой будет продолжено исполнение кода при наступлении определенного события.
Вслед за браузерами, которые отказались от модальности, технологической платформе пришлось перейти на асинхронную работу клиентской части. Необходимо это было для поддержки веб-клиента.
Ведь формы выбора файлов, вопросов, предупреждений, ввода значений, да и зачастую формы, от результата работы в которых зависит дальнейший ход событий, были модальными.
Основным инструментом отказа от модальности стало ОписаниеОповещения.
Как работает ОписаниеОповещения
Для начала разберем как работает платформа с модальными окнами на примере метода Вопрос(). Напишем не хитрый код, в котором пользователю показывается диалог с вопросом и вариантами ответа Да и Нет.
В данном случае пользователю будет показан диалог, а работа клиентской части будет полностью приостановлена до момента, пока пользователь не ответит на вопрос.
Тогда результат поместится в переменную Ответ и только после этого работа клиентской части будет возобновлена для выполнения алгоритма заполнения.
Напишем аналогичный пример, но уже без модального вызова. Будем использовать метод ПоказатьВопрос(), которому передадим ОписаниеОповещения.
Пользователь не заметит разницы, ведь будет показан точно такой же диалог с вопросом. Но исполнение кода не будет приостановлено, вместо этого будет исполнен дальнейший алгоритм и будет завершена работа текущей процедуры.
После ответа пользователя будет вызвана процедура ОбработатьОтветПользователя(), которую мы указали в конструкторе ОписаниеПоповещения и только тогда будет выполнен алгоритм заполнения.
Описание функционала от разработчиков на ИТС
Синтаксис
Конструктор ОписаниеОповещения имеет 5 необязательных параметров:
ИмяПроцедуры — Имя экспортируемой процедуры, которая будет вызвана;
Модуль — Модуль в котором расположена вызываемая процедура. Могут быть указаны Форма, Общий модуль, Команда командного интерфейса;
ДополнительныеПараметры — Произвольное значение, которое будет передано в вызываемую процедуру последним параметром;
ИмяПроцедурыОбработкиОшибки — Имя экспортируемой процедуры, которая будет вызвана в случае ошибки;
МодульОбработкиОшибки — Модуль в котором расположена вызываемая процедура в случае ошибки. Могут быть указаны Форма, Общий модуль, Команда командного интерфейса.
Вызываемая процедура и её параметры
Вызываемая процедура должна быть экспортируемой, и в самом простом случае содержать два параметра Результат и ДополнительныеПараметры.
В зависимости от объекта в котором используется ОписаниеОпопвещения, количество параметров вызываемой процедуры может меняться.
Например вызываемая процедура для обработки оповещения метода глобального контекста НачатьПомещениеФайла() должна иметь 4 параметра.
Для избежания ошибок обращайтесь к Синтаксис-помощнику, там описано количество и порядок необходимых параметров.
Выполнение обработки оповещения
В платформе реализован метод ВыполнитьОбработкуОповещения(), для возможности непосредственного выполнения обработки оповещения.
Методу в качестве параметра необходимо передать ОписаниеОповещения, которое будет выполнено. Так же можно передать в процедуру обработки произвольный результат вторым необязательным параметром.
Работа на сервере
ОписаниеОповещения не доступно на сервере, но в качестве исполняемой процедуры можно указать серверный метод. В справке нет явного указания о данной возможности, но и противоречий нет.
Возможные ошибки
Не найден экспортируемый метод
Если вызываемая процедура не экспортная, то при исполнении будет вызвано исключение. Решается указанием экспортной процедуры.
Количество параметров 1. Ожидаемое количество – 2
Если вызываемая процедура будет объявлена с одним параметром, то при исполнении будет вызвано исключение. Решается добавлением второго параметра в вызываемую процедуру.
Примеры использования ОписаниеОповещения
ОписаниеОповещения может использоваться во множестве сценариев, например обработка результата открытия форм, диалог выбора файла, работа с файлами, чтение и запись данных, работа с табличными и текстовыми документами. Разберем некоторые из них.
Оповещение о закрытии формы
Реализуем функционал открытия формы подбора с дальнейшей обработкой результата
Ввод значений и предупреждения
Реализуем функционал ввода числа. После ввода выполним проверку на четность введенного числи, если число не четное выведем предупреждение
Проверка существования файла и передача описания оповещения через дополнительные параметры
При работе на стороне клиента, например с оборудованием, логику работы системы можно организовать при помощи оповещений. Можно передавать ОписаниеОповещения в качестве следующего шага, ветвления логики или вызывать одно оповещение из нескольких мест.
Разработаем функционал проверки существования файла. В модуле реализована процедура для централизованной обработки ошибок ОповеститьОбОшибке(), будем передавать ОписаниеОповещения об ошибке через дополнительные параметры.
Обработаем результат проверки существования файла. Если файл не существует, выполним обработку оповещения переданного через дополнительные параметры
т.е. нужно после закрытия вызываемой формы выполнять некие действия. Ошибок при выполнении нет, но и результата ноль. 1с процедуру находит, но не выполняет.
Но опыт показывает, что в 99,9 % проблема все-же не в лыжах, я что-то делаю не так. Но что?
Глобальный контекст (Global context)
ПоказатьЗначение (ShowValue)
Синтаксис:
Тип: ОписаниеОповещения.
Содержит описание процедуры, которая будет вызвана после закрытия окна ввода значения с параметром , который содержит значение, указанное при создании объекта ОписаниеОповещения.
Если параметр не указан, то по завершении никакая процедура вызвана не будет.
(7) dj_serega, Это я в СП читал! Но не понял о каком параметре идет речь? Создалось впечатление, что речь идет о первом параметре процедуры ПоказатьЗначение(). т.е. если ПоказатьЗначение(Оповещение, СсылкаНаЧтоТо) - после зарытия вызываемой формы будет выполнена процедура, а если ПоказатьЗначение(, СсылкаНаЧтоТо) - то ничего выполняться не будет (что логично). Вообще как-то в СП невнятно, на мой взгляд, описана ситуация.
Спасибо за ответы!
В вызове формы (ПоказатьЗначение()) действительно два параметра: Оповещение и ссылка на то, что открываем. Они заполнены. А какой параметр должен быть в процедуре, которая отрабатывает при завершении?
(10) dj_serega, Побывал так, ноль эффекта. Сейчас снова попробовал (а вдруг!) - ничего. Побывал играться с местами расположения процедур (модуль формы, модуль объекта, общий модуль), с типом вызова (клиент, сервер), с "экспортностью" (добавлял, убирал ключевое слово "Экспорт") - всегда два варианта развития событий: либо 1с "кричит", что не может найти процедуру ("Не найден экспортируемый метод: "), либо молчит, но не выполняет.
Используется для описания вызова процедуры программного модуля, который будет осуществлен при наступлении какого-либо ожидаемого события, такого как закрытие формы или немодального диалога.
У вас наступило это событие? Которое вы ожидаете?
(12) hroa, Спасибо за участие!
Смотрите, как я понимаю. Запускаем процедуру ПоказатьЗначение(), она вызывает форму, когда форма закрывается, и наступает событие. Вполне допускаю, что я мыслю неверно, но как тогда понять наступило событие или нет?
Задача реализуется следующая:
Есть ТЧ обработки, в эту ТЧ запросом отбираются элементы справочника, по условиям. ТЧ для пользователя отображается в режиме "Только просмотр", при клике на конкретную строку открываем форму по ссылке, которая есть в строке процедурой ПоказатьЗначение(). После того, как пользователь внес изменения в элемент справочника и закрыл форму, нужно очистить и заново заполнить ТЧ т.к. вполне возможно, что данный измененный элемент уже не нужен в ТЧ. Т.е. как только пользователь закрыл форму, нужно запускать процедуру переформирования ТЧ. Можно решить задачу модальным окном, но это не айс, сами понимаете.
По идее у формы источника должно срабатывать событие ОбработкаОповещения - не срабатывает.
Что не так?
(1) Проверьте на всякий случай с помощью отладчика, что тип "ПараметрыВыполненияКоманды.Источник" - это именно Форма, а не Окно клиентского приложения.
(8) Вообще метод "Оповестить" должен вызвать обработчики у всех открытых форм, вне зависимости от их отношения к источнику оповещения. Отсюда следующее предложение, как бы оно банальным не звучало: убедитесь, что у формы назначен обработчик оповещения, а не просто есть процедура в модуле. :-)
(4) а до Оповестить("АИС_АПК_НазначенОтветственный"); доходит?
Имя процедуры обработки оповещения правильное и параметры?
(10) Попробуй в Оповестить добавить параметр ЭтаФорма Оповестить(ИмяОповещения,ЭтаФорма) что бы источник явно был указан, возможно он передает там владельца формы, мало вероятно, но шанс есть
(19)А зачем в источник ЭтуФорму, мне не надо ничего с этой формы передавать, если источником владельца указать вызвашего форму,, то может быть, но где он храниться?
Т.е. так как ты пытаешься для владельца открытой формы передать оповещения, то он может постваить в источник владельца, и тогда обработка оповещения может не срабатвать для самой себя. сумбурно описал. Или вообще открой форму без владельца.
Вообще я думал, что когда открываешь форму с владельцем, то должна отрабатывать какая я то функция, как при подборе, которая будет отрабатывать после закрытия внешней формы .
(22) Не путайте автора понапрасну. Метод "Оповестить" оповещает все формы, а не только форму владельца. Третий же параметр нужен только для прикладной логики обработчика оповещения, он не влияет на поведение самого оповещения.
(25) Это странно. Проверил на 16-ой платформе, на пустой базе по Вашему описанию. У меня проблем не возникло.
Еще как вариант, использовать ОписаниеОповещенияОЗакрытии при открытии формы. Тогда достаточно метода Закрыть(Результат).
(7)Какое имя процедуры, это не опвещение , где параметры и имя процедуры объекта задаются. Оповестить("ИмяСобытия" тип строка) по описания должно срабатывать событие ОбработкаОповежения у формы, елемента форма, я так уже не раз делал, но ни разу из общей команды
а зачем при открытии формы оповещать её же саму(форму), она открывается, действий с реквизитами формы пока никаких не было. Какой смысл в таком оповещении?
тут уж логичее использовать ПриОткрытии()
(3)Команда срабатывает на форме документа и на форме списка документов, команда открывает новую форму, вот из нее вернутся обратно не получается
(26)На до же сработало, я так понимаю если не указать источник, срабатывает у все открытых форма, это так то решение, но было бы лучше что бы у владельца только срабатывало
(27) Предлагаю перейти тогда на оповещения выбора:
1. Открывать форму таки с указанием владельца.
2. В открытой форме использовать метод "ОповеститьОВыборе(Значение)". Закрывать форму при этом самостоятельно не нужно, сама закроется.
3. В форме-владельце использовать обработчик "ОбработкаВыбора" вместо "ОбработкаОповещения".
(27) Тогда вывод что передаешь не верную форму владельца, я так понимаю у тебя открывается через команду, попробуй открыть непосредственно из формы в виде
(29)А смысл, у меня как то владелец не передается, не срабатывает Оповестить(0, почему должно срабатывать ОповеститьОВыборе()
(31)Да я думаю в команде формы все сработает, там перед открытием формы куча проверок срабатывает, не охота дублировать код в двух формах
Мы доработали механизм оповещений пользователя. Теперь им одинаково удобно пользоваться как в тонком клиенте, так и в веб-клиенте. Мы изменили внешний вид оповещений и добавили им ряд новых возможностей.
Показ нескольких оповещений
В старой реализации в один момент времени на экране отображалось только одно оповещение. Новое оповещение перекрывало собой предыдущее. Таким образом, если подряд выводилось несколько оповещений, то существовала большая вероятность того, что пользователь не успеет прочитать предыдущее оповещение, так как оно будет перекрыто следующим.
Теперь в большинстве случаев одновременно может отображаться до трёх оповещений:
Это верно для тонкого клиента, толстого клиента, и для веб-клиента, работающего в браузерах Internet Explorer и Google Chrome. Браузеры Safari и Mozilla Firefox позволяют отображать неограниченное количество оповещений, а браузер Microsoft Edge показывает одно последнее оповещение, но в нём есть Action Center, в который дублируются все оповещения.
Отображение оповещений при неактивном окне приложения
Раньше в веб-клиенте оповещения выводились только в активное окно браузера. Если пользователь переключался на другое окно или другое приложение, он не видел оповещения. Теперь, при использвании веб-клиента, оповещения отображаются на экране даже в том случае, когда окно приложения свёрнуто или неактивно.
При первом вызове метода ПоказатьОповещениеПользователя() в веб-клиенте в Google Chrome, Mozilla Firefox и Safari браузер будет запрашивать у пользователя разрешение на использование оповещений. Пользователь может разрешить их вывод для данного приложения, либо запретить.
Если пользователь запретит вывод оповещений, то будут использоваться оповещения нового вида, но отрисовываться они будут внутри окна браузера.
Центр оповещений
Чтобы оповещения не пропадали навсегда, мы реализовали центр оповещений. А у самих оповещений мы реализовали новое свойство – СтатусОповещенияПользователя. Оно может принимать два значения: Информация и Важное.
Оповещения со статусом Информация отображаются на экране, и через 10 секунд пропадают (в браузере Microsoft Edge – через 4 секунды). Оповещения со статусом Важное ведут себя точно так же, но при этом они сохраняются в центре оповещений.
Центр оповещений доступен из панели инструментов. О том, что есть новые важные оповещения, сигнализирует оранжевая точка рядом с его иконкой.
В центре оповещений отображаются важные оповещения, на которые пользователь еще не отреагировал - не закрыл или не выполнил связанное с оповещением действие. Оповещения располагаются в порядке их появления, самые новые сверху. Таким образом, даже если пользователь отходил от компьютера, он не пропустит важные оповещения.
Оповещение можно убрать из списка кнопкой очистки. Если с оповещением связано некоторое действие, то после нажатия мышью на текст оповещения оно также пропадёт. Команда Очистить оповещения удаляет из списка все оповещения. При этом если с оповещениями были связаны действия, то они не выполняются.
Выполнение действий при нажатии
В старой реализации единственное действие, которое можно было выполнить при нажатии на оповещение, это переход по навигационной ссылке. Она передавалась в метод вторым параметром.
Теперь мы расширили возможности оповещений, и во втором параметре вы можете передать не только строку с навигационной ссылкой, но и описание оповещения.
Описание оповещения указывает на процедуру, которая должна быть выполнена при нажатии на это оповещение.
Внешний вид
В тонком клиенте в варианте интерфейса Такси стиль оповещений будет максимально близким к стилю оповещений браузера Google Chrome при использовании Notifications API.
Если используется вариант интерфейса Версия 8.2, то стиль и поведение оповещений остаются прежними.
В веб-клиенте внешний вид оповещений определяется используемым браузером. По большому счёту оповещения будут выглядеть так же, как и в тонком клиенте, но у каждого браузера есть свои особенности. Например, вы можете сравнить, как те же самые оповещения покажет Internet Explorer и Mozilla Firefox.
Кроме этого есть и другие особенности. Например, в браузере Internet Explorer поддерживаются только оповещения, отображаемые внутри окна приложения. А в браузере Safari параметр Картинка не поддерживается, и оповещения показываются сверху экрана.
Мы доработали механизм оповещений пользователя. Теперь им одинаково удобно пользоваться как в тонком клиенте, так и в веб-клиенте. Мы изменили внешний вид оповещений и добавили им ряд новых возможностей.
Показ нескольких оповещений
В старой реализации в один момент времени на экране отображалось только одно оповещение. Новое оповещение перекрывало собой предыдущее. Таким образом, если подряд выводилось несколько оповещений, то существовала большая вероятность того, что пользователь не успеет прочитать предыдущее оповещение, так как оно будет перекрыто следующим.
Теперь в большинстве случаев одновременно может отображаться до трёх оповещений:
Это верно для тонкого клиента, толстого клиента, и для веб-клиента, работающего в браузерах Internet Explorer и Google Chrome. Браузеры Safari и Mozilla Firefox позволяют отображать неограниченное количество оповещений, а браузер Microsoft Edge показывает одно последнее оповещение, но в нём есть Action Center, в который дублируются все оповещения.
Отображение оповещений при неактивном окне приложения
Раньше в веб-клиенте оповещения выводились только в активное окно браузера. Если пользователь переключался на другое окно или другое приложение, он не видел оповещения. Теперь, при использвании веб-клиента, оповещения отображаются на экране даже в том случае, когда окно приложения свёрнуто или неактивно.
При первом вызове метода ПоказатьОповещениеПользователя() в веб-клиенте в Google Chrome, Mozilla Firefox и Safari браузер будет запрашивать у пользователя разрешение на использование оповещений. Пользователь может разрешить их вывод для данного приложения, либо запретить.
Если пользователь запретит вывод оповещений, то будут использоваться оповещения нового вида, но отрисовываться они будут внутри окна браузера.
Центр оповещений
Чтобы оповещения не пропадали навсегда, мы реализовали центр оповещений. А у самих оповещений мы реализовали новое свойство – СтатусОповещенияПользователя. Оно может принимать два значения: Информация и Важное.
Оповещения со статусом Информация отображаются на экране, и через 10 секунд пропадают (в браузере Microsoft Edge – через 4 секунды). Оповещения со статусом Важное ведут себя точно так же, но при этом они сохраняются в центре оповещений.
Центр оповещений доступен из панели инструментов. О том, что есть новые важные оповещения, сигнализирует оранжевая точка рядом с его иконкой.
В центре оповещений отображаются важные оповещения, на которые пользователь еще не отреагировал - не закрыл или не выполнил связанное с оповещением действие. Оповещения располагаются в порядке их появления, самые новые сверху. Таким образом, даже если пользователь отходил от компьютера, он не пропустит важные оповещения.
Оповещение можно убрать из списка кнопкой очистки. Если с оповещением связано некоторое действие, то после нажатия мышью на текст оповещения оно также пропадёт. Команда Очистить оповещения удаляет из списка все оповещения. При этом если с оповещениями были связаны действия, то они не выполняются.
Выполнение действий при нажатии
В старой реализации единственное действие, которое можно было выполнить при нажатии на оповещение, это переход по навигационной ссылке. Она передавалась в метод вторым параметром.
Теперь мы расширили возможности оповещений, и во втором параметре вы можете передать не только строку с навигационной ссылкой, но и описание оповещения.
Описание оповещения указывает на процедуру, которая должна быть выполнена при нажатии на это оповещение.
Внешний вид
В тонком клиенте в варианте интерфейса Такси стиль оповещений будет максимально близким к стилю оповещений браузера Google Chrome при использовании Notifications API.
Если используется вариант интерфейса Версия 8.2, то стиль и поведение оповещений остаются прежними.
В веб-клиенте внешний вид оповещений определяется используемым браузером. По большому счёту оповещения будут выглядеть так же, как и в тонком клиенте, но у каждого браузера есть свои особенности. Например, вы можете сравнить, как те же самые оповещения покажет Internet Explorer и Mozilla Firefox.
Кроме этого есть и другие особенности. Например, в браузере Internet Explorer поддерживаются только оповещения, отображаемые внутри окна приложения. А в браузере Safari параметр Картинка не поддерживается, и оповещения показываются сверху экрана.
Читайте также: