При разработке внешних отчетов и обработок программисты часто сталкиваются с ситуацией: когда файл запускается через меню «Файл — Открыть», все сообщения Сообщить() прекрасно отображаются. Однако, стоит только зарегистрировать эту же обработку в справочнике «Дополнительные отчеты и обработки», как информационные сообщения бесследно исчезают. В этой статье мы разберем причины такого поведения и рассмотрим правильные способы вывода информации пользователю в контексте Библиотеки стандартных подсистем (БСП). Для решения этой проблемы при любом способе запуска можно использовать готовый шаблон внешней обработки для БСП.
Первым делом нам необходимо понять, почему стандартный метод Сообщить() перестает работать. Когда мы открываем обработку как файл, она запускается непосредственно в сеансе пользователя на клиенте. Но механизм БСП в современных конфигурациях (таких как ЗУП 3.1, ERP 2.5, УТ 11) работает иначе:
Сообщить() внутри фонового задания, записываются в локальный буфер этого задания. Если вызывающая форма или механизм БСП специально не настроены на получение этих сообщений, они просто уничтожаются вместе с завершением задания.Проанализируем ситуацию с COM-объектами. Если в коде используется создание объекта Excel на сервере, а затем делается попытка вывести сообщение, мы сталкиваемся не только с проблемой отображения, но и с возможными ошибками доступа к дискам (например, к диску G:\), которые на сервере могут быть не видны.
Самый надежный способ гарантировать доставку сообщения пользователю — использовать программный интерфейс БСП. Вместо классического Сообщить() мы будем использовать процедуру ОбщегоНазначенияКлиентСервер.СообщитьПользователю. Этот метод универсален: он умеет определять контекст выполнения и правильно регистрировать сообщения для их последующего вывода в интерфейс.
Рассмотрим структуру этого метода подробнее:
// Параметры:
// ТекстСообщенияПользователю - Строка - текст сообщения.
// КлючДанных - ЛюбаяСсылка - объект, к которому относится сообщение.
// Поле - Строка - имя реквизита на форме.
// ПутьКДанным - Строка - путь к данным (например, "Объект.Сотрудник").
// Отказ - Булево - устанавливается в Истина, если нужно прервать операцию.
Давайте разберем на практическом примере, как изменить код из сообщения автора, чтобы он работал корректно:
Попытка
// Логика сохранения файла Excel
Книга.SaveAS(ИмяФайла, 56);
// Вместо обычного Сообщить() используем метод БСП
ТекстУспеха = "Успешно создан Табель " + Стр.Подразделение;
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстУспеха);
Исключение
ТекстОшибки = ОписаниеОшибки() + " Файл не сохранен!";
// Выводим ошибку, которая точно дойдет до пользователя
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОшибки);
КонецПопытки;
Иногда сообщения не выводятся из-за неверных настроек в функции СведенияоВнешнейОбработке. Если ваша цель — просто вывести форму и работать с ней интерактивно, убедитесь, что тип использования команды указан как ОткрытиеФормы. В этом случае обработка будет вести себя максимально близко к обычному открытию файла.
Посмотрим на пример правильного формирования таблицы команд:
Функция СведенияоВнешнейОбработке() Экспорт
ПараметрыРегистрации = Новый Структура;
ПараметрыРегистрации.Вставить("Вид", "ДополнительныйОтчет");
ПараметрыРегистрации.Вставить("Наименование", "Печать табеля T-13 в Excel");
ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);
ПараметрыРегистрации.Вставить("Версия", "1.1");
ТаблицаКоманд = ПолучитьТаблицуКоманд();
// Важно: Использование = "ОткрытиеФормы" для интерактивной работы
ДобавитьКоманду(ТаблицаКоманд,
"Сформировать табель",
"ОсновнаяКоманда",
"ОткрытиеФормы",
Истина); // ПоказыватьОповещение
ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);
Возврат ПараметрыРегистрации;
КонецФункции
Обратим внимание на параметр ПоказыватьОповещение. Если установить его в Истина, то после завершения серверной команды платформа покажет всплывающее уведомление в нижнем углу экрана. Однако для полноценных логов выполнения этого недостаточно — используйте методы из первого решения.
Если ваша обработка все же должна выполняться в фоне (например, при длительном формировании файлов), то обычного вызова СообщитьПользователю на сервере может быть недостаточно. В таких случаях БСП ожидает возврата структуры РезультатВыполнения. При проектировании подобных фоновых процессов пригодятся алгоритмы и примеры работы с длительными операциями БСП.
Рассмотрим, как правильно организовать передачу информации из серверного метода обратно на клиент:
ОбщегоНазначенияКлиентСервер.СообщитьПользователю.Проанализируем ситуацию, описанную в сообщениях форума. Автор пытается сохранить файл по пути G:\. При работе через дополнительные обработки крайне важно учитывать следующее:
Во-первых, если код выполняется на сервере (а БСП часто делает именно так), диск G: должен быть физически подключен к серверу 1С и доступен пользователю, от имени которого запущена служба usr1cv8. Если диска нет или прав недостаточно, сработает блок Исключение, и если в нем используется обычный Сообщить(), вы даже не узнаете, что произошла ошибка.
Во-вторых, для гарантированного вывода информации об ошибках записи файлов, всегда используйте ВызватьИсключение или запись в Журнал регистрации. Это поможет отладить код, даже если интерактивные сообщения «потерялись».
Пример надежной записи в журнал регистрации:
ЗаписьЖурналаРегистрации("ВнешняяОбработка.ВыгрузкаExcel",
УровеньЖурналаРегистрации.Ошибка,
,
,
"Ошибка при сохранении файла: " + ОписаниеОшибки());
Подведем итог. Чтобы ваши сообщения гарантированно доходили до пользователя во внешних обработках БСП, придерживайтесь следующих правил:
Сообщить() на ОбщегоНазначенияКлиентСервер.СообщитьПользователю().ПоказатьПредупреждение() (на клиенте) или ВызватьИсключение (на сервере).СведенияоВнешнейОбработке: для сложных диалогов лучше использовать ОткрытиеФормы.Следуя этим рекомендациям, мы обеспечим стабильную работу наших инструментов и корректную обратную связь для пользователей системы.