В процессе разработки на платформе 1С:Предприятие 8.3 часто возникает задача проинформировать пользователя о результатах выполнения алгоритма, который находится в модуле объекта (например, во внешней обработке или документе). Ситуация осложняется, когда код выполняется на стороне сервера или в рамках фонового задания, где прямой доступ к пользовательскому интерфейсу отсутствует.
Разберем подробно, почему стандартные методы могут не работать и как правильно организовать вывод сообщений в различных сценариях.
Проанализируем архитектуру управляемого приложения. Когда код выполняется в модуле объекта на сервере, платформа старается «накапливать» сообщения и передавать их на клиент. Однако, если модуль вызывается из фонового задания (регламентного задания), сеанс выполнения кода не связан напрямую с сеансом пользователя. В этом случае команда Сообщить() просто отправит текст в пустоту, так как у фонового задания нет «экрана».
Важные моменты:
Для корректного вывода сообщений на управляемых формах рекомендуется использовать объект СообщениеПользователю. Это более гибкий инструмент, чем простая процедура Сообщить(). Рассмотрим пример реализации в модуле объекта:
Процедура ВыполнитьКоманду(ИдентификаторКоманды) Экспорт
// Реализация логики
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Проверка выполнена успешно в " + ТекущаяДата();
Сообщение.Сообщить();
КонецПроцедуры
Если этот код вызывается из формы (например, через РеквизитФормыВЗначение("Объект")), сообщение будет показано пользователю сразу после возврата управления на клиента.
Если ваша обработка выполняется по расписанию (регламентное задание), стандартный механизм вывода не сработает. Нам необходимо «поймать» эти сообщения в сеансе пользователя. Один из эффективных способов — использование обработчика ожидания.
Суть метода заключается в том, что клиентское приложение периодически опрашивает сервер на наличие новых сообщений, используя метод ПолучитьСообщенияПользователю(). Рассмотрим пошагово, как это реализовать.
Шаг 1. Создадим серверную функцию для сбора сообщений:
&НаСервере
Функция СобратьСообщенияСервера()
// Извлекаем массив накопленных сообщений и удаляем их из очереди
Возврат ПолучитьСообщенияПользователю(Истина);
КонецФункции
Шаг 2. Настроим обработчик ожидания на клиенте:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
// Подключаем опрос сервера каждые 5 секунд
ПодключитьОбработчикОжидания("ОбработчикОпросаСообщений", 5);
КонецПроцедуры
&НаКлиенте
Процедура ОбработчикОпросаСообщений()
МассивСообщений = СобратьСообщенияСервера();
Для Каждого ТекущееСообщение Из МассивСообщений Цикл
// Выводим текст в стандартное окно сообщений пользователя
Сообщить(ТекущееСообщение.Текст);
КонецЦикла;
КонецПроцедуры
Этот подход позволяет пользователю получать уведомления от процессов, которые работают «сами по себе» в фоновом режиме.
Если в вашей конфигурации настроена Система взаимодействия, это самый современный способ оповещения. Вы можете программно отправить сообщение конкретному пользователю из любого серверного модуля, включая регламентные задания.
Преимущества системы взаимодействия:
Если вам нужно гарантированно доставить информацию пользователю, рассмотрите следующие варианты:
ЗаписатьВЖурналРегистрации(). Это не оперативное оповещение, но надежный способ сохранить историю выполнения фоновых процессов для администратора.Помните: При работе с регламентными заданиями важно определить, какому именно пользователю предназначено сообщение. Фоновое задание выполняется в отдельном сеансе (обычно под системным пользователем), поэтому в коде должна быть логика определения получателя (например, через настройку в константе или параметрах обработки).