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