1с оповестить при закрытии формы

ОбработкаОповещения в управляемых формах

reklama http

У управляемой формы есть событие ОбработкаОповещения:

%D0%9E%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0%D0%9E%D0%BF%D0%BE%D0%B2%D0%B5%D1%89%D0%B5%D0%BD%D0%B8%D1%8F

Обработчик данного события находится на клиенте и выглядит следующим образом:

Данное событие вызывается у всех открытых форм при вызове метода глобального контекста Оповестить(). Параметры у данного метода такие же, как у обработчика события формы: ИмяСобытия, Параметр, Источник. Тип параметра ИмяСобытия — Строка, остальных — произвольный. Метод Оповестить() доступен только на клиенте.

Для примера создадим в пустой конфигурации справочник Контрагенты и добавим у него реквизит «Адрес»:

%D0%9E%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0%D0%9E%D0%BF%D0%BE%D0%B2%D0%B5%D1%89%D0%B5%D0%BD%D0%B8%D1%8F 4

А также обработку. На форму обработки добавим реквизит Контрагент с типом СправочникСсылка.Контрагенты и реквизит Адрес с типом Строка, доступный только для чтения. При изменении контрагента сделаем заполнение реквизита Адрес адресом из контрагента:

%D0%9E%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0%D0%9E%D0%BF%D0%BE%D0%B2%D0%B5%D1%89%D0%B5%D0%BD%D0%B8%D1%8F 5

Создадим нового контрагента:

%D0%9E%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0%D0%9E%D0%BF%D0%BE%D0%B2%D0%B5%D1%89%D0%B5%D0%BD%D0%B8%D1%8F 6

И выберем его на форме обработки:

%D0%9E%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0%D0%9E%D0%BF%D0%BE%D0%B2%D0%B5%D1%89%D0%B5%D0%BD%D0%B8%D1%8F 7

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

%D0%9E%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0%D0%9E%D0%BF%D0%BE%D0%B2%D0%B5%D1%89%D0%B5%D0%BD%D0%B8%D1%8F 8 %D0%9E%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0%D0%9E%D0%BF%D0%BE%D0%B2%D0%B5%D1%89%D0%B5%D0%BD%D0%B8%D1%8F 9

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

В модуле формы обработки добавляем событие ОбработкаОповещения:

Здесь анализируется событие и источник. Если событие равно «Запись_Контрагент» и Источник равен контрагенту на форме, то обновляем адрес контрагента. Условие нужно, чтобы не обновлять впустую адрес, если был вызван метод Оповестить с другим именем события или был записан другой контрагент (не который на форме обработки).

В модуль формы контрагента, в событие ПослеЗаписи добавим следующий код:

Здесь после каждой записи выполняется оповещение всех форм об изменении контрагента. Третьим параметром передается ссылка на записанного контрагента.

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

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

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

Источник

Сообщение пользователю после закрытия формы

1С:Предприятие 8.3 (8.3.4.389)
Бухгалтерия предприятия, редакция 3.0 (3.0.28.12)

Дописал в БП 3.0 подписку на событие перед запиью регистра бухгалтерии НаборЗаписей в модуле на сервере, которое информирует пользователя, т.е. выводит сообщение, в случае необходимости.
Но если пользователь в открытом документ нажимает «Провести и закрыть», то данное сообщение показывается в форме документа и закрывается тут же, поэтому прочесть его нет возможности.

Игрался с КлючДанных и ПутьКДанным ничего не получилось.

Как можно вывести сообщение не в текущую форму, а в форму списка регистра бухгалтерии или допустим в форму рабочего стола?

Неужели никто так и не поборол этот «подарок от разработчиков платформы»?

В реквизиты формы добавил реквизит с типом СписокЗначений. Я его назвал СообщенияПользователюПослеЗаписи.

Далее, в обработчике формы ПослеЗаписиНаСервере, пока, после выполнения записи объекта на сервере, управление еще не вернулось на клиента, и выведенные пользователю сообщения еще не отображены на клиенте, я снимаю копию очереди сообщений пользователю и сохраняю ее в добавленном реквизите СообщенияПользователюПослеЗаписи:

Подозреваю, что можно было вызывать ПолучитьСообщенияПользователю(. ) с аргументом Ложь, и тогда можно было бы прямо полученные сообщения и добавлять в реквизит СообщенияПользователюПослеЗаписи, не делая их копии. Но опробовать эту «оптимизацию» еще не успел, поэтому привел работающий вариант кода.

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

Сам обработчик выглядит вот так

Тут хитрость заключается в том, что данный обработчик вызывается только, если форма осталась открытой (т.е. была запись объекта без закрытия формы).
Если же форма после записи закрывается (пользователь нажал кнопку «Записать и закрыть»), то данный обработчик уже не будет вызван никогда.

Вообще, эта очистка очереди сообщений нужна для того, чтобы в случае, если пользователь получил свои сообщения при записи объекта, то чтобы ему не выводились эти же сообщения еще раз при закрытии формы, если он ее закрывает без записи. Такая ситуация может возникнуть, например, если пользователь нажал «Записать», прочитал сообщения, и нажимает «Закрыть» (без записи). В таком случае вывод сообщений будет «странным» с точки зрения пользователя.

В этом обработчике, мы все собранные в реквизите формы сообщения пользователю выводим, перепривязывая их (с помощью свойства ИдентификаторНазначения) к текущей активной форме (которая уже не наша закрываемая форма). Делаем мы это только в том случае, если окно закрывается не «при завершении работы», т.к. при завершении работы закрыты будут все окна 1С, и пользователь все-равно ничего не успеет прочитать.

А! Ну а сами сообщения выдаются в обработчиках модуля объекта (ПередЗаписью, ПриЗаписи, ОбработкаПроверкиЗаполнения и т.п.) с помощью классического метода Сообщить или через объект СообщениеПользователю. Кстати, в последнем случае можно даже привязать сообщения к конкретным реквизитам записываемого объекта, и тогда, после записи и закрытия формы объекта, можно будет двойным щелчком по сообщению обратно открыть объект и перейти к редактированию «стремного» реквизита. Что уже приобретает смысл «удобства пользователя».

Источник

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

Добрый день, есть вопрос, который никак не поддается решению:

1. Есть общий модуль (клиент). Внутри процедура:

2. Также в этом же модуле еще одна процедура:

Процедура Процедура2(Данные) Экспорт
//Код процедуры
КонецПроцедуры

3. Модуль формы из обработки (МояОбработка.МояФорма). На форме одна кнопка («ОК»):

Задача очень простая:
Выполняется Процедура1, которая должна открыть форму, на ней обработать данные и вернуть обратно структуру (эта структура возвращается в процедуру Процедура2).
Здесь возможны 2 варианта. В Процедура1 в качестве параметра передается свойство «Автозаполнение»:
1. Если параметр «Ложь», открывается форма, а затем пользователь самостоятельно нажимает на кнопку «ОК», которая формирует необходимую структуру данные, а затем закрывать форму процедурой «Закрыть», где в качестве параметра возвращает структуру. После чего курсор переходит на «Процедура2» и корректно отрабатывается.
2. Если параметр «Истина», при открытии формы на клиенте программно вызывается нажатие кнопки «ОК», но почему то в этом варианте обработка оповещения не отрабатывает.

Проверил отладкой, код отрабатывает корректно, но обработка оповещения при закрытии формы не происходит. Прошу вашей помощи в решении этого вопроса. Пример сильно упростил, чтобы оставить только суть вопроса. Глобально ничего менять нельзя (вопрос касается банковских продуктов и системы «ДиректБанк»).

Источник

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

Добрый день, коллеги!

Два часа сижу с простой задачей.

Соответственно есть вторая процедура:

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

Но опыт показывает, что в 99,9 % проблема все-же не в лыжах, я что-то делаю не так. Но что?

Глобальный контекст (Global context)
ПоказатьЗначение (ShowValue)
Синтаксис:

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

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

У вас наступило это событие? Которое вы ожидаете?

(12) hroa, Спасибо за участие!

Смотрите, как я понимаю. Запускаем процедуру ПоказатьЗначение(), она вызывает форму, когда форма закрывается, и наступает событие. Вполне допускаю, что я мыслю неверно, но как тогда понять наступило событие или нет?

Задача реализуется следующая:

Есть ТЧ обработки, в эту ТЧ запросом отбираются элементы справочника, по условиям. ТЧ для пользователя отображается в режиме «Только просмотр», при клике на конкретную строку открываем форму по ссылке, которая есть в строке процедурой ПоказатьЗначение(). После того, как пользователь внес изменения в элемент справочника и закрыл форму, нужно очистить и заново заполнить ТЧ т.к. вполне возможно, что данный измененный элемент уже не нужен в ТЧ. Т.е. как только пользователь закрыл форму, нужно запускать процедуру переформирования ТЧ. Можно решить задачу модальным окном, но это не айс, сами понимаете.

Источник

Вывод сообщений пользователю из закрывающейся управляемой формы 1С

Введение

В управляемом интерфейсе 1С, сообщения, выводимые пользователю с помощью функции Сообщить(. ) или объекта СообщениеПользователю, отображаются с привязкой к форме. И даже если явно такая привязка не задана, то платформа их автоматически привязывает к текущей активной форме.

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

Чаще всего такая ситуация возникает, когда пользователь в форме документа или справочника нажимает на кнопку «Провести и закрыть» или «Записать и закрыть».
Если во время записи объекта, или во время проведения документа, пользователю выводятся какие-то предупреждающие сообщения (которые не приводят к отмене выполняемого действия), то сообщения выводятся в форму, которая по окончании выполнения кода закрывается, и пользователь эти сообщения не замечает (и возможности их посмотреть у него уже нет).

Вот для того, чтобы эти сообщения все-таки «донести» до пользователя, я и придумал описанный ниже прием.

Впервые этот прием был описан мною в обсуждении темы на Инфостарте.
Здесь же я проверил свои предположения о возможности оптимизации описанной там версии приема, и описал уже результирующую оптимизированную версию.

Ограничения

Т.к. платформа 1С не предоставляет возможности работать с сообщениями, выведенными из клиентского контекста, то описанный ниже прием работает только для тех сообщений, которые выводятся в серверном контексте исполнения кода.
А так как сохранение объектов и проведение документов выполняется в серверном контексте, то нам такое решение вполне подходит.

Общая идея

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

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

Подробности реализации на примере

Обоснование

Для того, чтобы продемонстрировать техническую реализацию данного метода, возьмем для примера типовую конфигурацию «Бухгалтерия для Украины 2.0» (2.0.23.1). В ней при проведении документа «Приложение 2 к Налоговой накладной», если документ не включен в ЕРНН, пользователю в окно сообщений выдается предупреждение

«Не указана дата регистрации документа в ЕРНН покупателем! Проводки сформированы частично».

Но если пользователь нажимает на кнопку «Провести и закрыть», то он это предупреждение не увидит (см. видео).

Добавление реквизита формы

После записи объекта, в этом реквизите сохраняются все выводимые пользователю сообщения. А при закрытии формы, чтобы они не пропали, они выводятся в родительскую форму.

Сохранение сообщений после записи на сервере

Следующим шагом нужно в обработчике события формы ПослеЗаписиНаСервере(. ) выбирать готовящиеся к отображению сообщения пользователю, и сохранять их в добавленном выше реквизите формы.

Вывод сообщений в родительское окно при закрытии формы

В обработчике события формы ПриЗакрытии(. ), хранимые в добавленном выше реквизите формы сообщения пользователю, выведем в окно, которое станет активным после закрытия текущей формы.
Делаем это только в том случае, если окно закрывается без завершения работы системы, так как при завершении работы системы закроются все окна, и куда бы мы эти сообщения ни вывели, пользователь все-равно их не увидит.

Удаление сообщений, если форма не закрылась (и они отобразились пользователю платформой)

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

Демонстрация результата

В результате мы получили более дружелюбное к пользователю поведение системы (см. видео).

О Лицензии

Источник

Понравилась статья? Поделить с друзьями:
Добавить комментарий
  • Как сделать успешный бизнес на ритуальных услугах
  • Выездной кейтеринг в России
  • Риски бизнеса: без чего не обойтись на пути к успеху
  • 1с оповестить о выборе управляемые формы
  • 1с описание типов план счетов