Как вывести сообщение пользователю из модуля объекта в 1С

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

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

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

Почему Сообщить() не всегда работает?

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

Важные моменты:

  1. Код в модуле объекта выполняется на сервере.
  2. Если вызов происходит из формы, платформа передает сообщения автоматически после завершения серверного вызова.
  3. Если вызов идет из регламентного задания, сообщения сохраняются в памяти сеанса этого задания и требуют принудительного извлечения.

Решение 1: Использование объекта СообщениеПользователю

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


Процедура ВыполнитьКоманду(ИдентификаторКоманды) Экспорт
    // Реализация логики
    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = "Проверка выполнена успешно в " + ТекущаяДата();
    Сообщение.Сообщить();
КонецПроцедуры

Если этот код вызывается из формы (например, через РеквизитФормыВЗначение("Объект")), сообщение будет показано пользователю сразу после возврата управления на клиента.

Решение 2: Получение сообщений из фонового задания

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

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

Шаг 1. Создадим серверную функцию для сбора сообщений:


&НаСервере
Функция СобратьСообщенияСервера()
    // Извлекаем массив накопленных сообщений и удаляем их из очереди
    Возврат ПолучитьСообщенияПользователю(Истина);
КонецФункции

Шаг 2. Настроим обработчик ожидания на клиенте:


&НаКлиенте
Процедура ПриОткрытии(Отказ)
    // Подключаем опрос сервера каждые 5 секунд
    ПодключитьОбработчикОжидания("ОбработчикОпросаСообщений", 5);
КонецПроцедуры

&НаКлиенте
Процедура ОбработчикОпросаСообщений()
    МассивСообщений = СобратьСообщенияСервера();
    
    Для Каждого ТекущееСообщение Из МассивСообщений Цикл
        // Выводим текст в стандартное окно сообщений пользователя
        Сообщить(ТекущееСообщение.Текст);
    КонецЦикла;
КонецПроцедуры

Этот подход позволяет пользователю получать уведомления от процессов, которые работают «сами по себе» в фоновом режиме.

Решение 3: Использование Системы взаимодействия

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

Преимущества системы взаимодействия:

Альтернативные методы оповещения

Если вам нужно гарантированно доставить информацию пользователю, рассмотрите следующие варианты:

  1. Запись в Журнал регистрации: Используйте метод ЗаписатьВЖурналРегистрации(). Это не оперативное оповещение, но надежный способ сохранить историю выполнения фоновых процессов для администратора.
  2. Регистр сведений: Создайте служебный регистр для хранения уведомлений. Фоновое задание пишет туда запись, а клиентская форма через обработчик ожидания считывает её и выводит пользователю оповещение, после чего удаляет запись.
  3. Механизмы БСП: В типовых конфигурациях (например, Бухгалтерия предприятия 3.0) реализована подсистема «Текущие дела». Вы можете интегрировать свои задачи туда, чтобы пользователь видел уведомление на рабочем столе.

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

← На главную