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

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Почему метод «Сообщить» не работает в фоновом задании?

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

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

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

Решение 1: Запись в Журнал регистрации — простой и надежный способ

Это самый простой и универсальный способ зафиксировать результат работы фонового задания. Журнал регистрации — это стандартный механизм платформы 1С, предназначенный для записи всех значимых событий в информационной базе. Он идеально подходит для отладки и контроля серверных процессов, а для детального изучения состояния базы можно использовать специализированный анализ журнала регистрации.

Преимущества:

Для записи в журнал используется процедура общего модуля ЗаписьЖурналаРегистрации(). Давайте посмотрим на ее синтаксис и пример использования.


// Пример вызова процедуры записи в Журнал регистрации
// Процедура находится в общем модуле, поэтому вызывается напрямую

// Первый параметр - Имя события. Используйте понятные имена для удобного поиска.
Событие = "Фоновая обработка документов";

// Второй параметр - Уровень. Может быть: Информация, Ошибка, Предупреждение, Примечание.
Уровень = УровеньЖурналаРегистрации.Информация;

// Третий параметр - Объект метаданных, к которому относится событие (необязательный).
ОбъектМетаданных = Метаданные.Документы.РеализацияТоваровУслуг;

// Четвертый и пятый параметры - Данные и их представление для интерактивного открытия (необязательные).

// Шестой параметр - Комментарий. Здесь пишем основной текст сообщения.
ТекстСообщения = "Задание 'Обновление статусов заказов' успешно завершено. Обработано 150 документов.";

ЗаписьЖурналаРегистрации(Событие, Уровень, ОбъектМетаданных, , , ТекстСообщения);

После выполнения этого кода в Журнале регистрации (раздел Администрирование – Обслуживание) появится новая запись. Администратор или ответственный пользователь всегда сможет зайти и посмотреть, как отработало задание, какие были результаты или ошибки. Также можно настроить автоматический анализ и информирование о невыполненных регламентных заданиях, чтобы оперативно реагировать на сбои — для этого подойдёт программа контроля регламентных заданий с уведомлениями в Telegram.

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

Решение 2: Система оповещений — для интерактивного уведомления пользователя

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

Принцип работы следующий:

  1. Сервер (фоновое задание): Формирует данные для сообщения, упаковывает их во временное хранилище и генерирует событие-оповещение, адресуя его конкретному пользователю.
  2. Клиент (форма пользователя): "Слушает" эти оповещения. Когда приходит оповещение, предназначенное для него, клиентский код обрабатывает его: получает данные из временного хранилища и показывает их пользователю.

Разберем процесс по шагам с примерами кода.

Шаг 1. На сервере: формируем и отправляем оповещение

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


&НаСервереБезКонтекста
Процедура ВыполнитьФоновуюЗадачу(ИмяПользователяДляОповещения)

    // 1. Выполняем полезную работу
    // ...
    // Например, получили некий результат
    РезультатРаботы = "Отчет 'Анализ продаж' сформирован и готов к просмотру.";

    // 2. Помещаем данные (результат) во временное хранилище.
    // Функция вернет уникальный адрес, по которому клиент сможет получить эти данные.
    АдресРезультата = ПоместитьВоВременноеХранилище(РезультатРаботы, Новый УникальныйИдентификатор());

    // 3. Формируем и отправляем оповещение.
    // Указываем имя события, адрес данных и имя пользователя, которому оно адресовано.
    // Имя пользователя необходимо передать в задание при его создании.
    Оповестить("ФоноваяЗадачаЗавершена", АдресРезультата, ИмяПользователяДляОповещения);

КонецПроцедуры

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

Шаг 2. На клиенте: принимаем и обрабатываем оповещение

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


&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)

    // Проверяем, что это именно то событие, которое мы ждем
    Если ИмяСобытия = "ФоноваяЗадачаЗавершена" Тогда

        // Параметр - это адрес данных во временном хранилище, который мы передали с сервера.
        АдресРезультата = Параметр;

        // Подключаемся к серверу, чтобы получить данные по адресу
        // Используем &НаСервере, чтобы выполнить серверный вызов из клиентской процедуры
        ТекстСообщения = ПолучитьДанныеИзХранилищаНаСервере(АдресРезультата);

        // Показываем красивое оповещение пользователю
        ПоказатьОповещениеПользователя(ТекстСообщения,,,"Информация");

        // Или можно использовать старый добрый Сообщить()
        // Сообщить(ТекстСообщения);

    КонецЕсли;

КонецПроцедуры


&НаСервереБезКонтекста
Функция ПолучитьДанныеИзХранилищаНаСервере(Адрес)

    // Получаем данные из временного хранилища по адресу и возвращаем на клиент
    Возврат ПолучитьИзВременногоХранилища(Адрес);

КонецФункции

Таким образом, мы создали полноценный механизм обратной связи. Для более продвинутой интеграции с ОС можно реализовать уведомление из 1С в центре уведомлений Windows. Этот способ идеально подходит для информирования о завершении длительных операций, таких как формирование сложных отчетов или групповая обработка документов. В таких сценариях пользователям также будет полезна индикация прогресса выполнения фонового задания или возможность реализовать отслеживание результата выполнения без использования БСП.

Резюмируем:

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

← На главную