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

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

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

Анализ механизма вызова серверных методов в БСП

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

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

Шаг 1. Настройка регистрации внешней обработки

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


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

Шаг 2. Создание формы обработки и обработка команды

При использовании ТипКомандыВызовКлиентскогоМетода БСП ищет экспортную процедуру ВыполнитьКоманду в форме обработки. Нам необходимо создать основную форму и реализовать в ней логику вызова сервера и последующего вывода сообщений. Разберем структуру этого кода.

На клиенте мы запускаем цикл по объектам-основаниям, передаем их на сервер для обработки, а затем выводим результат. Рассмотрим пример реализации в модуле формы:


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

КонецПроцедуры

Шаг 3. Реализация серверной логики

Проанализируем серверную часть. Процедура должна быть объявлена с директивой &НаСервере или &НаСервереБезКонтекста. Она отвечает за непосредственное создание документов КомплектацияНоменклатуры на основании ПоступлениеТоваровУслуг.


&НаСервереБезКонтекста
Процедура ОбработатьОбъектыНаСервере(ОбъектыНазначения, СозданныеОбъекты)
    
    Для Каждого Основание Из ОбъектыНазначения Цикл
        Попытка
            // Логика создания документа
            НовыйДокумент = Документы.КомплектацияНоменклатуры.СоздатьДокумент();
            НовыйДокумент.Дата = ТекущаяДатаСеанса();
            // ... здесь заполнение полей из документа Основание ...
            
            НовыйДокумент.Записать(РежимЗаписиДокумента.Запись);
            
            // Добавляем ссылку в массив для возврата на клиент
            СозданныеОбъекты.Добавить(НовыйДокумент.Ссылка);
        Исключение
            // Сообщения об ошибках на сервере тоже можно фиксировать
            ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
                КраткоеПредставлениеОшибки(ИнформацияОбОшибке()), Основание);
        КонецПопытки;
    КонецЦикла;
    
КонецПроцедуры

Почему это решение работает?

Разберем основные преимущества перехода на клиентский метод выполнения команды:

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

Рекомендации по использованию методов БСП

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

ОбщегоНазначения.СообщитьПользователю("Текст сообщения", СсылкаНаОбъект, "ПолеОбъекта");

Такой подход позволяет избежать написания лишнего кода по инициализации объекта сообщения и установке его свойств КлючДанных и ПутьКДанным вручную.

Выводы

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

← На главную