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

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

Введение

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

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

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

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

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

Читайте также:  Чем отчистить палас от пятен

Ограничения

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

Общая идея

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

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

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

Обоснование

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

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

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

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

Для хранения сообщений, которые нужно отобразить пользователю при закрытии формы, в реквизиты формы документа Приложение2КНалоговойНакладной добавим реквизит типа Список значений.
Назовем его, например, ХДЖ_СообщенияПользователюПослеЗаписи .
Ну а чтобы «следующим поколениям разработчиков» было понятно «что это за реквизит» и «зачем он нужен», можно оставить им послание, описывающее назначение этого реквизита, в его свойстве Заголовок (так как на форме мы его все-равно отображать не будем):

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

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

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

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

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

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

В обработчике события формы ПослеЗаписи(. ), подключим обработчик ожидания, который вызовется через минимально возможное время — 0.1 сек. Но вызовется он только в том случае, если форма не закроется. Если же запись объекта была при закрытии формы, то этот обработчик вызван не будет.

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

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

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

О Лицензии

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

Источник

Можно-ли в УФ, вывести сообщение пользователю, во время проведения?

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

Чтение и запись.
Описание:

Тип: УникальныйИдентификатор.
Позволяет точно указать, к какой форме должно быть «привязано» сообщение. Если сообщение не имеет идентификатора назначения, тогда оно выводится и привязывается к активному окну.

Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение(клиент), мобильное приложение(сервер).

(14) От куда утащил не помню:

На платформе 1С 8.2, для информирования пользователей, предлагается использовать новый общий объект – СообщениеПользователю. Объект довольно простой, но есть несколько не очевидных особенностей его использования в управляемых формах, которые будут рассмотрены в данной статье.

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

1). Использование СообщениеПользователю на клиенте, в форме элемента справочника, документа и других объектов. Для корректного отображения сообщения и его привязки к нужному полю формы, используется нижеследующий код, обратите внимание на инициализацию свойств ПутьКДанным и КлючДанных.
&НаКлиенте
КонецПроцедуры
2). Довольно часто необходимо вывести сообщение в обработке проведения документа, причем не только когда возникла ошибка при проведении, но и в том случае, когда документ успешно проведен. Проблема возникает когда пользователь использует команду “Провести и закрыть”. Сообщение привязывается к окну содержащему форму текущего документа, которое в случае успешного проведения тут же закрывается и пользователь его не видит. Все дело в том что метод Сообщить() объекта СообщениеПользователю выводит сообщение в АКТИВНОЕ окно, документ как правило открывается в дополнительном окне, которое в данном случае и является активным. Таким образом, что бы пользователь смог прочитать сообщение после закрытия формы документа, необходимо перед использованием метода Сообщить() активизировать основное окно управляемого приложения. Один из вариантов – сделать это в событии формы ПередЗаписью(), например так:
&НаКлиенте
После этого в обработке проведения можно смело выводить сообщение, теперь оно будет привязано к основному окну, и пользователь сможет прочитать его даже после закрытия формы документа.
Предусмотрим случай, когда пользователь воспользовался командой “Провести”, а не “Провести и закрыть”, в этом случае форма документа остается открытой, но не активной, активизируем её:
&НаКлиенте

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

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

Источник

1С 8.3 : Как показать сообщение пользователю? методы: СообщениеПользователю и ПоказатьОповещениеПользователя

В 1С предполагается, что СообщениеПользователю выводятся для того, чтобы сообщить пользователю об ошибках.

А для информирования о выполняемом действии рекомендуется использовать метод встроенного языка ПоказатьОповещениеПользователя().

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

Пример вывода сообщения на клиенте:

При обработке на сервере:

Необходимо зарегистрировать в системе соответствие объекта и имени реквизита формы. Для этого в глобальном контексте реализована функция УстановитьСоответствиеОбъектаИРеквизитаФормы(). Сделать это можно следующим образом:

В данном фрагменте выполняется преобразование объекта из данных формы в реальный объект и устанавливается его соответствие с реквизитом формы по имени «Объект».

Если в дальнейшем требуется создать сообщение, можно сделать это следующим образом:

В этом фрагменте создается новый объект СообщениеПользователю, в котором запоминается Текст сообщения и указывается Поле объекта, ошибка в данных которого вызвала необходимость вывода сообщения. Информация о том, как объект расположен в форме берется из предварительно запомненной пары «Объект/ИмяРеквизитаФормы». В дальнейшем сообщение будет выведено в окно сообщений формы и привязано к соответствующему элементу управления.

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

ТипШаблонПример
Реквизит ИмяРеквизита Контрагент
Табличная часть ИмяТабличнойЧасти Скидки
Реквизит табличной части ИмяТабличнойЧасти[ИндексСтроки].ИмяРеквизита Номенклатура[10].Количество
Реквизит набора записей [ИндексСтроки].ИмяРеквизита [10].Курс

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

Источник

Работа с сообщениями пользователю

Для вывода информации пользователю в 1С:Предприятии 8.2 существует специальный механизм сообщений. В этом механизме используется объект встроенного языка СообщениеПользователю . Предполагается, что сообщения выводятся для того, чтобы сообщить пользователю об ошибках. А для информирования о выполняемом действии рекомендуется использовать метод встроенного языка ПоказатьОповещениеПользователя() .

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

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

Рассмотрим подробно, что при этом происходит и как можно добиться такого же поведения в своем коде. В качестве примера возьмем ситуацию проведения документа.

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

Когда объекту необходимо сформировать сообщение, он ничего не знает о том, где он «родился и живет». Объект знает лишь, что его реквизит не заполнен. Поэтому он создает новый объект СообщениеПользователю и заполняет его свойство Текст описанием ошибки, а свойство Поле заполняет именем своего реквизита, который не заполнен.

После этого наступает ответственный момент — форме надо предоставить информацию о том, чьё это сообщение и в каком реквизите формы хранится наш объект. Это делается для того, чтобы форма могла впоследствии привязать сообщение к нужному элементу управления. Для установки связи объект данных вызывает у объекта сообщения метод УстановитьДанные() , передавая себя в качестве параметра. При этом происходит поиск среди запомненных ранее соответствий «объект — имя реквизита формы». Если для объекта существует значение имени реквизита формы, метод УстановитьДанные() помещает имя реквизита формы в свойство ПутьКДанным объекта СообщениеПользователю , а ссылка объекта (или ключ записи регистра) помещается в свойство КлючДанных .

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

ПРИМЕЧАНИЕ
Пока управление не передано обратно на клиента, можно получить массив сообщений методом глобального контекста ПолучитьСообщенияПользователю() .

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

Если свойство КлючДанных заполнено, но в форме отсутствует реквизит с именем из свойства ПутьКДанным , то будет открыта новая форма объекта, в которую будут перенесены все сообщения с таким ключом данных (ссылкой или ключом записи регистра).

Программное создание сообщений

Теперь посмотрим, как можно добиться такого поведения полностью программно.

Первое, что необходимо сделать — зарегистрировать в системе соответствие объекта и имени реквизита формы. Для этого в глобальном контексте реализована функция УстановитьСоответствиеОбъектаИРеквизитаФормы(). Сделать это можно следующим образом:

В данном фрагменте выполняется преобразование объекта из данных формы в реальный объект и устанавливается его соответствие с реквизитом формы по имени «Объект».

Если в дальнейшем требуется создать сообщение, можно сделать это следующим образом:

В этом фрагменте создается новый объект СообщениеПользователю , в котором запоминается Текст сообщения и указывается Поле объекта, ошибка в данных которого вызвала необходимость вывода сообщения. Информация о том, как объект расположен в форме берется из предварительно запомненной пары «Объект/ИмяРеквизитаФормы». В дальнейшем сообщение будет выведено в окно сообщений формы и привязано к соответствующему элементу управления.

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

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

ПРИМЕЧАНИЕ
Отметим, что в обоих примерах сообщение, устанавливаемое свойству Текст, указывает строку как 11-ю, а значение, устанавливаемое свойству Поле, указывает на 10-ю. Так сделано потому, что в интерфейсе строки табличных частей начинают нумерацию с 1, а в программном коде — с 0.

Источник

Оцените статью