Как программно вызвать дополнительный отчет или обработку в 1С?

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

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

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

Проблема идентификации: почему поиск по имени — это риск

Рассмотрим стандартную ситуацию: разработчик добавляет кнопку в форму, которая должна открыть внешний отчет. Если использовать поиск по строковому представлению (например, Справочники.ДополнительныеОтчетыИОбработки.НайтиПоНаименованию("МойОтчет")), мы рискуем столкнуться с тем, что после любого переименования отчета администратором код перестанет работать. Поиск по ссылке (ГУИДу) также имеет свои недостатки, особенно при переносе данных между базами.

Проанализируем более надежные способы идентификации:

  1. Использование внутреннего имени объекта. В модуле каждого дополнительного отчета есть функция СведенияОВнешнейОбработке, где указывается параметр ИмяОбъекта. Это уникальный технический идентификатор, который сохраняется при загрузке новых версий файла.
  2. Хранение ссылки в настройках. Создание константы или записи в регистре сведений, где администратор один раз выбирает нужный отчет. Код в дальнейшем обращается к этой настройке, а не к конкретному имени.
  3. Дополнительные реквизиты. Использование механизма дополнительных реквизитов справочника для задания уникального строкового кода (ID), по которому программа будет искать объект.

Решение 1: Поиск по внутреннему идентификатору (ИмяОбъекта)

Каждый отчет, зарегистрированный в системе через БСП, имеет реквизит ИмяОбъекта. Рассмотрим, как программно найти ссылку на отчет по этому полю. Это решение считается «золотой серединой», так как оно не требует создания лишних настроек, но при этом гораздо стабильнее поиска по обычному наименованию.

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


Функция НайтиДополнительныйОтчетПоИмени(ИмяОбъекта) Экспорт
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |	ДополнительныеОтчетыИОбработки.Ссылка КАК Ссылка
        |ИЗ
        |	Справочник.ДополнительныеОтчетыИОбработки КАК ДополнительныеОтчетыИОбработки
        |ГДЕ
        |	ДополнительныеОтчетыИОбработки.ИмяОбъекта = &ИмяОбъекта
        |	И НЕ ДополнительныеОтчетыИОбработки.ПометкаУдаления";
    
    Запрос.УстановитьПараметр("ИмяОбъекта", ИмяОбъекта);
    РезультатЗапроса = Запрос.Выполнить();
    
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    Если ВыборкаДетальныеЗаписи.Следующий() Тогда
        Возврат ВыборкаДетальныеЗаписи.Ссылка;
    КонецЕсли;
    
    Возврат Справочники.ДополнительныеОтчетыИОбработки.ПустаяСсылка();
КонецФункции

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

Решение 2: Программный запуск через API БСП

После того как мы получили ссылку на нужный элемент справочника ДополнительныеОтчетыИОбработки, нам необходимо его запустить. В БСП для этого предусмотрен специальный клиентский модуль ДополнительныеОтчетыИОбработкиКлиент. Использование этого метода гарантирует корректную обработку прав доступа, безопасного режима и параметров команды.

Выясним, как подготовить параметры и выполнить вызов. Рассмотрим фрагмент кода на клиенте:


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

Метод ВыполнитьКоманду берет на себя всю рутину: он проверяет, нужно ли открывать форму или выполнять действие на сервере, подключает внешнюю обработку и передает ей управление.

Решение 3: Получение объекта для серверных операций

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

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


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

Важно помнить, что при таком способе вызова обработка подключается во временное хранилище, и система автоматически следит за профилями безопасности. Это наиболее защищенный способ работы с внешним кодом.

Рекомендации по надежной архитектуре

Чтобы сделать систему максимально гибкой, разберем по шагам идеальную схему внедрения вызова ДОО:

  1. Создание настройки. Добавьте в расширение или основную конфигурацию Константу (тип: СправочникСсылка.ДополнительныеОтчетыИОбработки).
  2. Интерфейс для администратора. Выведите эту константу в раздел настроек системы. Администратор сам выберет актуальный отчет из списка.
  3. Программный код. В коде кнопки вызывайте значение константы.
    
    СсылкаНаОтчет = Константы.МойСпециальныйОтчет.Получить();
    Если Не СсылкаНаОтчет.Пустая() Тогда
        // Вызов через ДополнительныеОтчетыИОбработкиКлиент
    КонецЕсли;
    

Такой подход позволяет избежать жесткой привязки к именам и ГУИДам. Даже если вы решите полностью заменить отчет на другой (с другим внутренним именем), вам достаточно будет просто перевыбрать его в настройках, не изменяя ни одной строчки программного кода.

Резюме: Мы рассмотрели несколько способов решения задачи. Для простых случаев подходит поиск по ИмяОбъекта. Для профессиональной разработки в крупных системах рекомендуется использовать связку через настройки (константы/регистры). Во всех случаях для непосредственного запуска следует использовать методы ДополнительныеОтчетыИОбработкиКлиент.ВыполнитьКоманду и ДополнительныеОтчетыИОбработки.ОбъектВнешнейОбработки, которые являются частью стандартного API БСП.

← На главную