Сообщения пользователю в 1С 8.3
В 1С бывают 2 вида сообщений пользователю:
- Ознакомительные — просто выводят сообщение на экран.
- Терминирующие(модальные) — блокируют выполнение программы, пока пользователь не нажмет какую-то кнопку (устарели, раньше это были методы Вопрос и Предупреждение).
Сообщить
Метод Сообщить выводит сообщение на экран. Сообщение всегда привязывается к форме, в которой было вызвано. Если в этой форме нажать «Записать и закрыть» и в момент записи вывести сообщение, то пользователь не увидит его, потому что форма после записи сразу закроется.
Метод Сообщить можно использовать как на клиенте, так и на сервере. При вызове на сервере все сообщения накапливаются в буфере и выводятся при возврате управления на клиента. Первым параметром можно передать текст сообщения.
ПоказатьОповещениеПользователя
Метод ПоказатьОповещениеПользователя выводит сообщение в правом нижнем углу экрана. Сообщение медленно затухает и закрывается через 10 секунд. Сообщение не привязано к форме. Одновременно можно вывести максимум 3 оповещения. Метод доступен только на клиенте.
- Текст — текст сообщения
- ДействиеПриНажатии — навигационная ссылка (например на элемент справочника) или описание оповещения для выполнения какого-либо действия при нажатии на сообщение. При нажатии на навигационную ссылку будет открыт элемент справочника. Описание оповещения — это указатель на процедуру, которая будет вызвана при нажатии.
- Пояснение — дополнительное пояснение.
- Картинка — тут все понятно.
- СтатусОповещенияПользователя — системное перечисление СтатусОповещенияПользователя. если Важное, то сообщение сохраняется в центре оповещений. Чтобы посмотреть все оповещения в центре оповещений нужно нажать кнопку с колокольчиком в правом верхнем углу экрана:
- КлючУникальности — если вызвать второй метод с таким же ключом, то не будет показано новое оповещение, а будет изменено текущее. Если параметр не указан, то сообщение считается уникальным.
Источник
Информационные сообщения в 1С. Как это можно сделать
В свое время, работая с системой контроля версий Perforce, а именно с ее графическими клиентами, я обратил внимание на удобный элемент интерфейса – многострочное поле вывода сообщений внизу главного окна программы. После того, как пользователь выполнял какие-то обращения к серверу системы, в это поле добавлялись текстовые сообщения, описывающие процесс взаимодействия клиента с сервером (какие конкретно действия выполнялись, и результат их выполнения). Не знаю, почему именно Perforce произвел на меня такое впечатление, хотя абсолютно ту же систему я наблюдал до и после в различных графических IDE (Delphi, C++ и т.д.) – окно вывода сообщений той консольной программы (компилятор или клиент системы контроля версий), в качестве оболочки которой выступает графическая программа. Но впрочем, статья вовсе не про Perforce, просто я считаю удобным способ многострочного вывода сообщений в процессе выполнения какой-то длительной работы. Получить большой список сообщений гораздо лучше (информативнее), чем одиночный MessageBox в самом конце этой работы. Подобный подход мы, кстати, видим и в антивирусных программах.
На создание собственной подсистемы сообщений меня натолкнула необходимость реализации программы, которая выполняет относительно длительный процесс обработки данных (т.е. пользователь нажал кнопку «Выполнить», а потом может, условно говоря, несколько минут ждать, пока процесс выполняется). Подобные программы (обработки) есть и в типовых конфигурациях 1С (в основном это различные выгрузки-загрузки). Стандартное окно сообщений платформы (то, куда выводится информация процедурой «Сообщить») меня не устраивало. Я хотел, чтобы сообщения, связанные с моей обработкой были сгруппированы, и не смешивались ни с какими другими сообщениями. Также я хотел, чтобы список сообщений можно было как-то сохранять на всякий случай (в текстовый файл, как это сделано в антивирусах). Ну и главное, я планировал сделать сообщения разного типа (информационные, предупреждения, сообщения об ошибках). Ну и соответственно раскрашивать их в различные цвета.
В рассматриваемом примере таблица вывода сообщения (элемент интерфейса ТабличноеПоле) выглядит примерно так:
Описание реализации.
В общем, опишу здесь то, что получилось. Для реализации буду опять использовать свою технологию «ООП в 1С» (метод подробно описан здесь). Соответственно будет создан «класс»: «СообщенияПрограммы».
В дальнейшем при объяснениях будем считать, что делаем внешнюю обработку.
Нам понадобятся иконки для отображения статусов сообщений. Загрузим из соответствующих BMP-файлов (прилагаются к данной статье) в ресурсы (макеты типа «Двоичные данные»)
Изображение | Название исходного файла | Название макета |
---|---|---|
statok.bmp | КартинкаСообщениеСтатусОК | |
statwarning.bmp | КартинкаСообщениеСтатусПредупреждение | |
staterror.bmp | КартинкаСообщениеСтатусОшибка |
Затем нужно будет как-то эти картинки загрузить для использования – превратим их в ресурсы.
Определим в главном модуле глобальную переменную «КоллекцияКартинок» в виде структуры из объектов стандартного класса «Картинка». Напишем подпрограмму «СформироватьКоллекциюКартинок», которая будет инициализировать коллецию. Будем вызывать эту подпрограмму в инициализирующей секции модуля.
Также наши сообщения будут иметь некоторые числовые типы – уровни. Номер уровня будет влиять на количество отступов из пробельных символов слева при выводе сообщения в интерфейс или файл (как бы наглядно показываем уровень вложенности сообщений друг в друга).
Название | Описание | Числовое значение |
---|---|---|
ТИПСООБЩ_НЕОПРЕД | Неопределенное значение | 0 |
ТИПСООБЩ_УРОВЕНЬ1 | Уровень вложенности 1 | 1 |
ТИПСООБЩ_УРОВЕНЬ2 | Уровень вложенности 2 | 2 |
ТИПСООБЩ_УРОВЕНЬ3 | Уровень вложенности 3 | 3 |
У каждого сообщения есть определенный статус, показывающий, чем именно является сообщение.
Название | Описание | Числовое значение |
---|---|---|
СТАТСООБЩ_НЕОПРЕД | Неопределенное значение | 0 |
СТАТСООБЩ_ОК | Уровень вложенности 1 | 1 |
СТАТСООБЩ_ПРЕДУПР | Уровень вложенности 2 | 2 |
СТАТСООБЩ_ОШИБКА | Уровень вложенности 3 | 3 |
Представим типы и статусы в виде числовых констант, как это делается в С/С++ (#define) или Pascal (const). В 1С будем имитировать константы вставкой их в глобальную переменную-структуру (ключ элемента структуры – это символьное имя константы, а значение элемента структуры – это численное значение константы).
Еще нам нужно будет получать текущее значение времени в миллисекундах. Используем для этого машину JavaScript в виде глобальной переменной COM-объекта.
Вот что получилось в главном модуле:
Набор сообщений существует в виде таблицы значений (стандартный класс ТаблицаЗначений) со следующими колонками:
Название колонки | Тип данных | Назначение |
---|---|---|
ТипСообщ | Число | Тип сообщения (уровень) – одна из констант ТИПСООБЩ_ |
СтатусСообщ | Число | Статус сообщения – одна из констант СТАТСООБЩ_ |
ТекстСообщ | Строка | Основной текст сообщения. Здесь обычно указываем, какое действие выполняется длительным процессом в данный момент. |
КомментарийСообщ | Строка | Дополнительный текст сообщения. Здесь обычно указываем результат выполнения действия, описанного в колонке ТекстСообщ. Если действие завершилось ошибкой, то сообщение об ошибке приводим в этой же колонке |
Эта таблица значений уже может отображаться в каких-то элементах интерфейса пользователя (например в объекте класса TaбличноеПоле).
Набор сообщений будет реализован в виде класса, имеющего следующие методы:
Заголовок метода | Описание |
---|---|
Функция Сообщения_Конструктор() | Начальное создание объекта. Возвращает объект класса «Сообщения». |
Процедура Сообщения_УстАтриб(Сообщ, Форма, ТабПоле, ТабЗнач) | Установка атрибутов объекта. Нужно передать: — ссылку на форму (Форма), на которой будет отображаться список сообщений; — элемент формы типа ТабличноеПоле (ТабПоле), в который будут выводится сообщения; — ТаблицаЗначений (ТабЗнач), в которой будет храниться собственно список сообщений. |
Процедура Сообщения_Инициализация(Сообщ) | Будет проинициализирована ТаблицаЗначений (ранее установленная процедурой Сообщения_УстАтриб) |
Процедура Сообщения_Обновить(Сообщ) | Выполняет принудительную отрисовку списка сообщений на форме (ранее установленная процедурой Сообщения_УстАтриб) |
Функция Сообщения_Добавить(Сообщ, ТипСообщ, ТекстСообщ, СтатусСообщ=Неопределено, КомментСообщ=Неопределено) | Добавляет в набор новое сообщение с соответствующими атрибутами. Возвращает идентификатор сообщения с помощью которого, к данному сообщению можно будет обращаться в дальнейшем. |
Процедура Сообщения_Изменить(Сообщ, ИдСообщ, ТипСообщ=Неопределено, ТекстСообщ=Неопределено, СтатусСообщ=Неопределено, КомментСообщ=Неопределено) | Изменяет атрибуты уже существующего сообщения с указанным идентификатором. |
Процедура Сообщения_Удалить(Сообщ, ИдСообщ) | Удалить ранее добавленное сообщение с соответствующим идентификатором. |
Процедура Сообщения_Очистить(Сообщ) | Удалить все сообщения набора. |
Функция Сообщения_ПолучитьТип(Сообщ, ИдСообщ) | Получить атрибут «Тип» для существующего сообщения с указанным идентификатором. |
Процедура Сообщения_УстановитьТип(Сообщ, ИдСообщ, ТипСообщ) | Установить атрибут «Тип» для существующего сообщения с указанным идентификатором. |
Функция Сообщения_ПолучитьСтатус(Сообщ, ИдСообщ) | Получить атрибут «Статус» для существующего сообщения с указанным идентификатором. |
Процедура Сообщения_УстановитьСтатус(Сообщ, ИдСообщ, СтатусСообщ) | Установить атрибут «Статус» для существующего сообщения с указанным идентификатором. |
Функция Сообщения_ПолучитьТекст(Сообщ, ИдСообщ) | Получить атрибут «Текст сообщения» для существующего сообщения с указанным идентификатором. |
Процедура Сообщения_УстановитьТекст(Сообщ, ИдСообщ, ТекстСообщ) | Установить атрибут «Текст сообщения» для существующего сообщения с указанным идентификатором. |
Функция Сообщения_ПолучитьКоммент(Сообщ, ИдСообщ) | Получить атрибут «Комментарий» для существующего сообщения с указанным идентификатором. |
Процедура Сообщения_УстановитьКоммент(Сообщ, ИдСообщ, КомментСообщ) | Установить атрибут «Комментарий» для существующего сообщения с указанным идентификатором. |
Функция Сообщения_ЦветТекста(ТипСообщ, СтатусСообщ) | Определить цвет текста сообщения для указанного статуса. Используется при раскраске сообщений в интерфейсе. |
Функция Сообщения_ЦветКомментария(ТипСообщ, СтатусСообщ) | Определить цвет дополнительного текста (комментария) сообщения для указанного статуса. Используется при раскраске сообщений в интерфейсе. |
Функция Сообщения_Картинка(ТипСообщ, СтатусСообщ) | Определить иконку для сообщения с указанным статусом. Используется при выводе сообщений в интерфейсе. |
Функция Сообщения_СохранитьВФайл(Сообщ) | Сохранить набор сообщений в текстовый файл (имя файла запрашивает у пользователя). |
Итак, полный текст главного модуля обработки:
Обратите внимание на то, что при выполнении длительного процесса в цикле, интерфейс пользователя блокируется, и поэтому факт добавления или изменения сообщений не будет виден пользователю – прорисовки не будет. Для принудительного выполнения прорисовки, нужно вызвать метод Обновить() формы, отображающей сообщения. Но частый вызов этого метода затормозит работу, поэтому вызывать его нужно лишь иногда (хоть и с небольшим интервалом, чтобы пользователь не заметил лагов – в данной реализации интервал обновления не чаще чем 1 раз в 0,5сек). Для реализации обновления служит метод класса Сообщения_Обновить.
Пример использования.
В данном примере форма, отображающая набор сообщений выглядит вот так:
Вместо кнопки «Запустить процесс», в реальности должно быть что-то более полезное – какой-то пользовательский интерфейс. Кнопка «Запустить процесс» имитирует заполнение списка сообщений, демонстрируя то, как могли бы выводиться сообщения в процессе реального выполнения какого-либо длительного действия.
В качестве реквизитов формы создана ТаблицаЗначений — «Сообщения». Мы ее никак не инициализируем, а просто передаем в качестве параметров соответствующим методам класса «Сообщения_», а они уже создают нужные колонки:
Для отображения ТаблицыЗначений «Сообщения», на форме размещен визуальный компонент типа «ТабличноеПоле» — «ТабличноеПолеСообщения». При создании колонок в ТабличномПоле, учитываем следующие колонки ТаблицыЗначений (описывались ранее):
— ТипСообщ;
— СтатусСообщ;
— ТекстСообщ;
— КомментарийСообщ.
Текст модуля главной формы обработки (отображающей сообщения):
Форма просмотра сообщений.
Также имеется отдельное окно просмотра списка сообщений (соответствующей ТаблицыЗначений). Оно предназначено для того, чтобы можно было более удобно проанализировать большой список (так как в основном диалоговом окне ТабличноеПоле сообщений сильно растянуть по высоте не удастся – будет мешать другие элементы интерфейса).
Выглядит форма примерно следующим образом:
Код модуля формы совсем несложный. Вот такой:
Скачать исходные тексты подсистемы сообщений и рассмотренный пример (обработка для 1С 8.2) можно здесь.
На этом все. Всем удачи. До встречи.
В следующей статье я планирую рассказать о работе с сервером (базами) FireBird из 1С.
Мы выясним:
— как корректно подключаться к серверу (базе) и отключаться;
— как выполнять запросы: передавать и получать данные;
— как работать с бинарными полями и строками в различной кодировке;
— как вызывать хранимые процедуры и получать результаты их работы;
— как обойти такую неприятность, как автоматический разрыв клиентского соединения со стороны сервера FireBird (простой и понятный способ, который почему-то нигде не описан в Интернете).
Мы создадим обособленные и переносимые наборы подпрограмм («классов»):
— для подключения к базе (сможем подключаться к серверу, базе и выполнять запросы);
— для работы с параметрами запроса (можно будет задавать и устанавливать параметры почти как в Delphi);
А также:
— для работы с множествами целых чисел и строк (удобно задавать множественные параметры для запросов);
— удобное хранилище профилей подключений к различным базам FireBird, а также интерфейс пользователя (форма для редактирования набора профилей подключений)
В общем, думаю, что будет интересно. Еще раз, удачи…
Источник