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

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

Введение

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

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

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

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

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

Читайте также:  Чем отмыть огородные руки

Ограничения

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

Общая идея

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

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

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

Обоснование

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

О Лицензии

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

Источник

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

В программах на платформе 1С:Предприятие сообщение пользователю можно показать разными способами.

1. Метод ПоказатьПредупреждение .

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

ОписаниеОповещенияОЗавершении (необязательный)
Тип: ОписаниеОповещения. Содержит описание процедуры, которая будет вызвана после закрытия окна предупреждения со следующими параметрами: ДополнительныеПараметры — значение, которое было указано при создании объекта ОписаниеОповещения. Если параметр не указан, то по завершении никакая процедура вызвана не будет.

ТекстПредупреждения (обязательный)
Тип: Строка; ФорматированнаяСтрока. Текст предупреждения.

Таймаут (необязательный)
Тип: Число. Интервал времени в секундах, в течение которого система будет ожидать ответа пользователя. По истечении интервала окно предупреждения будет закрыто. Если параметр не указан, то время ожидания не ограничено. Если параметр имеет отрицательное значение, будет сгенерировано исключение. Значение по умолчанию: 0.

Заголовок (необязательный)
Тип: Строка. Содержит заголовок окна предупреждения. Описание: Выводит на экран окно предупреждения, но не ожидает его закрытия.

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

Примечание: Если после закрытия пользователем окна предупреждения должен быть выполнен какой-либо код, то его нужно разместить в отдельной процедуре модуля и описать ее в параметре.

2. Метод Предупреждение .

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

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

3. Метод ПоказатьОповещениеПользователя .

При использовании этого метода сообщение появляется в правом нижнем углу интерфейса.

Доступность: Тонкий клиент, веб-клиент, толстый клиент.

4. Метод Сообщить .

Сообщение появляется в нижней части интерфейса, в строке.

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

5. Объект СообщениеПользователю .

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

Свойства: ИдентификаторНазначения (TargetID); КлючДанных (DataKey); Поле (Field); ПутьКДанным (DataPath); Текст (Text).

Методы: Сообщить (Message); УстановитьДанные (SetData).

Сообщение появляется в нижней части интерфейса, в строке.

Источник

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Источник

Сообщения пользователю в 1С 8.3

В 1С бывают 2 вида сообщений пользователю:

  1. Ознакомительные — просто выводят сообщение на экран.
  2. Терминирующие(модальные) — блокируют выполнение программы, пока пользователь не нажмет какую-то кнопку (устарели, раньше это были методы Вопрос и Предупреждение).

Сообщить

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

Метод Сообщить можно использовать как на клиенте, так и на сервере. При вызове на сервере все сообщения накапливаются в буфере и выводятся при возврате управления на клиента. Первым параметром можно передать текст сообщения.

ПоказатьОповещениеПользователя

Метод ПоказатьОповещениеПользователя выводит сообщение в правом нижнем углу экрана. Сообщение медленно затухает и закрывается через 10 секунд. Сообщение не привязано к форме. Одновременно можно вывести максимум 3 оповещения. Метод доступен только на клиенте.

  • Текст — текст сообщения
  • ДействиеПриНажатии — навигационная ссылка (например на элемент справочника) или описание оповещения для выполнения какого-либо действия при нажатии на сообщение. При нажатии на навигационную ссылку будет открыт элемент справочника. Описание оповещения — это указатель на процедуру, которая будет вызвана при нажатии.
  • Пояснение — дополнительное пояснение.
  • Картинка — тут все понятно.
  • СтатусОповещенияПользователя — системное перечисление СтатусОповещенияПользователя. если Важное, то сообщение сохраняется в центре оповещений. Чтобы посмотреть все оповещения в центре оповещений нужно нажать кнопку с колокольчиком в правом верхнем углу экрана:

  • КлючУникальности — если вызвать второй метод с таким же ключом, то не будет показано новое оповещение, а будет изменено текущее. Если параметр не указан, то сообщение считается уникальным.

Источник

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