Как вывести сообщение из модуля объекта подключаемой внешней обработки

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

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

Выясним причину: почему сообщения «пропадают»?

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

Более того, в современных типовых конфигурациях (таких как БП 3.0, ЗУП 3.1, УТ 11) выполнение серверного кода внешних обработок по умолчанию происходит внутри фонового задания. Это делается для того, чтобы интерфейс пользователя не «зависал» во время длительных вычислений. Однако у фоновых заданий есть особенность: они не имеют прямой связи с окном сообщений текущего сеанса пользователя. Все сообщения, сформированные внутри фонового задания, накапливаются в специальном буфере этого задания и не выводятся на экран автоматически.

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

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

Посмотрим на пример кода, который следует использовать в модуле объекта обработки:


Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Обработка данных завершена успешно!";
// Если нужно привязать к конкретному полю:
// Сообщение.Поле = "Объект.Наименование"; 
// Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();

Важно понимать: если этот код сработает внутри фонового задания, сообщение все равно может не появиться сразу. Платформа 1С должна «забрать» эти сообщения из фонового задания после его завершения. Если вы используете стандартные механизмы БСП для запуска обработок, система обычно делает это автоматически, но только если обработка завершилась штатно.

Решение 2. Передача сообщений через временное хранилище

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

Алгоритм действий следующий:

  1. В модуле объекта обработки мы собираем все сообщения в массив или текстовую переменную.
  2. Помещаем этот результат во ВременноеХранилище по адресу, который передается в параметры обработки.
  3. На стороне клиента, после завершения серверного вызова, считываем данные из хранилища и выводим их методом ПоказатьОповещениеПользователя().

Пример формирования данных в модуле объекта:


Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполненияКоманды) Экспорт
    ТекстСообщений = "Операция выполнена.";
    ПоместитьВоВременноеХранилище(ТекстСообщений, ПараметрыВыполненияКоманды.АдресРезультата);
КонецПроцедуры

Решение 3. Использование механизма исключений

Существует «радикальный» способ вывести сообщение, который гарантированно прервет выполнение кода и покажет окно с ошибкой пользователю. Это метод ВызватьИсключение. Рассмотрим его применение.

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


Если Не ЗначениеЗаполнено(ВажныйПараметр) Тогда
    ВызватьИсключение "Ошибка: Не заполнен важный параметр в обработке!";
КонецЕсли;

Преимущество этого способа в том, что текст ошибки будет проброшен через все уровни серверных вызовов и фоновых заданий прямо в окно пользователю, если только где-то выше по стеку вызовов не стоит блок Попытка ... Исключение, который «проглатывает» эту ошибку.

Решение 4. Журнал регистрации как средство мониторинга

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

Разберем пример записи:


ЗаписьЖурналаРегистрации("ВнешняяОбработка.ЗагрузкаДанных",
    УровеньЖурналаРегистрации.Информация,
    ,
    ,
    "Обработано строк: " + КоличествоСтрок);

Практические советы по отладке

Чтобы понять, почему ваше сообщение не выводится, выполните следующие действия:

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

← На главную