Почему не выводятся сообщения во внешней обработке через «Дополнительные отчеты и обработки» и как это исправить

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

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

Анализируем причину проблемы: разница контекстов

Первым делом нам необходимо понять, почему стандартный метод Сообщить() перестает работать. Когда мы открываем обработку как файл, она запускается непосредственно в сеансе пользователя на клиенте. Но механизм БСП в современных конфигурациях (таких как ЗУП 3.1, ERP 2.5, УТ 11) работает иначе:

  1. Серверное выполнение: Большинство команд дополнительных обработок (особенно с типом «Вызов серверного метода») выполняются на стороне сервера.
  2. Фоновые задания: Для того чтобы интерфейс пользователя не «зависал» во время длительных операций (например, при формировании тяжелого отчета в Excel), БСП запускает обработку в фоновом задании.
  3. Изоляция потока: Сообщения, сформированные через Сообщить() внутри фонового задания, записываются в локальный буфер этого задания. Если вызывающая форма или механизм БСП специально не настроены на получение этих сообщений, они просто уничтожаются вместе с завершением задания.

Проанализируем ситуацию с COM-объектами. Если в коде используется создание объекта Excel на сервере, а затем делается попытка вывести сообщение, мы сталкиваемся не только с проблемой отображения, но и с возможными ошибками доступа к дискам (например, к диску G:\), которые на сервере могут быть не видны.

Решение №1: Использование стандартного метода БСП

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

Рассмотрим структуру этого метода подробнее:


// Параметры:
// ТекстСообщенияПользователю - Строка - текст сообщения.
// КлючДанных - ЛюбаяСсылка - объект, к которому относится сообщение.
// Поле - Строка - имя реквизита на форме.
// ПутьКДанным - Строка - путь к данным (например, "Объект.Сотрудник").
// Отказ - Булево - устанавливается в Истина, если нужно прервать операцию.

Давайте разберем на практическом примере, как изменить код из сообщения автора, чтобы он работал корректно:


Попытка
    // Логика сохранения файла Excel
    Книга.SaveAS(ИмяФайла, 56);
    
    // Вместо обычного Сообщить() используем метод БСП
    ТекстУспеха = "Успешно создан Табель " + Стр.Подразделение;
    ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстУспеха);
    
Исключение
    ТекстОшибки = ОписаниеОшибки() + " Файл не сохранен!";
    // Выводим ошибку, которая точно дойдет до пользователя
    ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОшибки);
КонецПопытки;

Решение №2: Правильная регистрация команды в БСП

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

Посмотрим на пример правильного формирования таблицы команд:


Функция СведенияоВнешнейОбработке() Экспорт
    ПараметрыРегистрации = Новый Структура;
    ПараметрыРегистрации.Вставить("Вид", "ДополнительныйОтчет");
    ПараметрыРегистрации.Вставить("Наименование", "Печать табеля T-13 в Excel");
    ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь); 
    ПараметрыРегистрации.Вставить("Версия", "1.1");

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

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

Решение №3: Обработка сообщений в фоновом задании

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

Рассмотрим, как правильно организовать передачу информации из серверного метода обратно на клиент:

  1. Внутри серверного метода соберите все сообщения в массив или используйте ОбщегоНазначенияКлиентСервер.СообщитьПользователю.
  2. Если вы используете длительные операции БСП, сообщения будут автоматически собраны в хранилище.
  3. На клиенте, в процедуре завершения фонового задания, необходимо явно вызвать стандартные методы обработки оповещений.

Важные нюансы работы с файловой системой

Проанализируем ситуацию, описанную в сообщениях форума. Автор пытается сохранить файл по пути G:\. При работе через дополнительные обработки крайне важно учитывать следующее:

Во-первых, если код выполняется на сервере (а БСП часто делает именно так), диск G: должен быть физически подключен к серверу 1С и доступен пользователю, от имени которого запущена служба usr1cv8. Если диска нет или прав недостаточно, сработает блок Исключение, и если в нем используется обычный Сообщить(), вы даже не узнаете, что произошла ошибка.

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

Пример надежной записи в журнал регистрации:


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

Резюме для разработчика

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

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

← На главную