При автоматизации процессов в 1С часто возникает задача выполнить длительную операцию на сервере без участия пользователя, например, с помощью регламентного или фонового задания. При этом для повышения производительности часто требуется организовать правильный конвейер обработки задач. Но как сообщить пользователю о результатах выполнения этой задачи? Стандартный и привычный метод Сообщить() в этом случае не сработает. Разберемся, почему так происходит и какие существуют правильные способы для уведомления пользователей из серверного кода.
Чтобы понять причину, давайте проанализируем архитектуру клиент-серверного взаимодействия в 1С. Платформа четко разделяет код, который выполняется на стороне клиента (на компьютере пользователя), и код, который выполняется на сервере.
Сообщить(), Предупреждение(), Вопрос(), могут выполняться только на клиенте. Их задача — показать что-то конкретному пользователю в его окне программы.Таким образом, попытка вызвать Сообщить() из фонового задания — это как пытаться показать картинку на экране компьютера, который физически не имеет монитора. Платформа просто проигнорирует такую команду, не вызвав при этом ошибки.
Рассмотрим два основных решения этой задачи: простое и надежное для логирования, и более сложное, но интерактивное для уведомления конкретного пользователя.
Это самый простой и универсальный способ зафиксировать результат работы фонового задания. Журнал регистрации — это стандартный механизм платформы 1С, предназначенный для записи всех значимых событий в информационной базе. Он идеально подходит для отладки и контроля серверных процессов, а для детального изучения состояния базы можно использовать специализированный анализ журнала регистрации.
Преимущества:
Для записи в журнал используется процедура общего модуля ЗаписьЖурналаРегистрации(). Давайте посмотрим на ее синтаксис и пример использования.
// Пример вызова процедуры записи в Журнал регистрации
// Процедура находится в общем модуле, поэтому вызывается напрямую
// Первый параметр - Имя события. Используйте понятные имена для удобного поиска.
Событие = "Фоновая обработка документов";
// Второй параметр - Уровень. Может быть: Информация, Ошибка, Предупреждение, Примечание.
Уровень = УровеньЖурналаРегистрации.Информация;
// Третий параметр - Объект метаданных, к которому относится событие (необязательный).
ОбъектМетаданных = Метаданные.Документы.РеализацияТоваровУслуг;
// Четвертый и пятый параметры - Данные и их представление для интерактивного открытия (необязательные).
// Шестой параметр - Комментарий. Здесь пишем основной текст сообщения.
ТекстСообщения = "Задание 'Обновление статусов заказов' успешно завершено. Обработано 150 документов.";
ЗаписьЖурналаРегистрации(Событие, Уровень, ОбъектМетаданных, , , ТекстСообщения);
После выполнения этого кода в Журнале регистрации (раздел Администрирование – Обслуживание) появится новая запись. Администратор или ответственный пользователь всегда сможет зайти и посмотреть, как отработало задание, какие были результаты или ошибки. Также можно настроить автоматический анализ и информирование о невыполненных регламентных заданиях, чтобы оперативно реагировать на сбои — для этого подойдёт программа контроля регламентных заданий с уведомлениями в Telegram.
Когда использовать этот метод: Идеально подходит для логирования технических процессов, отладки, фиксации ошибок и информирования администраторов системы. Это не всплывающее окно для пользователя, а скорее запись в бортовом журнале системы.
Если ваша задача — показать всплывающее уведомление конкретному пользователю (например, тому, кто запустил фоновое задание), то Журнал регистрации не подойдет. Здесь на помощь приходит более сложный, но и более функциональный механизм — система оповещений — настроить их поможет модуль отправки гибких оповещений и напоминаний в 1С.
Принцип работы следующий:
Разберем процесс по шагам с примерами кода.
В коде вашего регламентного задания необходимо выполнить следующие действия.
&НаСервереБезКонтекста
Процедура ВыполнитьФоновуюЗадачу(ИмяПользователяДляОповещения)
// 1. Выполняем полезную работу
// ...
// Например, получили некий результат
РезультатРаботы = "Отчет 'Анализ продаж' сформирован и готов к просмотру.";
// 2. Помещаем данные (результат) во временное хранилище.
// Функция вернет уникальный адрес, по которому клиент сможет получить эти данные.
АдресРезультата = ПоместитьВоВременноеХранилище(РезультатРаботы, Новый УникальныйИдентификатор());
// 3. Формируем и отправляем оповещение.
// Указываем имя события, адрес данных и имя пользователя, которому оно адресовано.
// Имя пользователя необходимо передать в задание при его создании.
Оповестить("ФоноваяЗадачаЗавершена", АдресРезультата, ИмяПользователяДляОповещения);
КонецПроцедуры
Важный момент: Чтобы знать, какому пользователю отправлять оповещение, его имя (ИмяПользователя) нужно передать в качестве параметра при запуске фонового задания.
В модуле формы, из которой пользователь запускает фоновое задание (или в модуле управляемого приложения, если оповещение должно быть глобальным), нужно создать специальную экспортную процедуру-обработчик с именем ОбработкаОповещения.
&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
// Проверяем, что это именно то событие, которое мы ждем
Если ИмяСобытия = "ФоноваяЗадачаЗавершена" Тогда
// Параметр - это адрес данных во временном хранилище, который мы передали с сервера.
АдресРезультата = Параметр;
// Подключаемся к серверу, чтобы получить данные по адресу
// Используем &НаСервере, чтобы выполнить серверный вызов из клиентской процедуры
ТекстСообщения = ПолучитьДанныеИзХранилищаНаСервере(АдресРезультата);
// Показываем красивое оповещение пользователю
ПоказатьОповещениеПользователя(ТекстСообщения,,,"Информация");
// Или можно использовать старый добрый Сообщить()
// Сообщить(ТекстСообщения);
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьДанныеИзХранилищаНаСервере(Адрес)
// Получаем данные из временного хранилища по адресу и возвращаем на клиент
Возврат ПолучитьИзВременногоХранилища(Адрес);
КонецФункции
Таким образом, мы создали полноценный механизм обратной связи. Для более продвинутой интеграции с ОС можно реализовать уведомление из 1С в центре уведомлений Windows. Этот способ идеально подходит для информирования о завершении длительных операций, таких как формирование сложных отчетов или групповая обработка документов. В таких сценариях пользователям также будет полезна индикация прогресса выполнения фонового задания или возможность реализовать отслеживание результата выполнения без использования БСП.
Резюмируем:
ЗаписьЖурналаРегистрации().ПоместитьВоВременноеХранилище(), Оповестить() и клиентский обработчик ОбработкаОповещения().Выбор метода зависит исключительно от вашей задачи, но теперь вы знаете, как правильно организовать информирование пользователя из любой точки вашего серверного кода.