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

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

При разработке функционала в 1С часто возникает задача: запустить внешний дополнительный отчет, сохраненный в справочнике ДополнительныеОтчетыИОбработки, напрямую из формы внутренней обработки. Если отчет создан на базе Системы компоновки данных (СКД) и не имеет собственной основной формы, у разработчиков часто возникают затруднения и ошибки вида «Интерактивные операции недоступны».

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

Анализ частых ошибок при открытии внешнего отчета

Проанализируем распространенные ошибки, с которыми сталкиваются разработчики при попытке открыть внешний отчет из формы обработки:

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

Выясним, как платформа 1С работает с отчетами на СКД, у которых нет собственной формы. Если у объекта «Отчет» не создана явная форма, платформа автоматически генерирует платформенную форму отчета СКД. Наша задача — правильно подключить внешний отчет в сеансе и открыть генерируемую форму на клиенте.

Способ 1. Использование программного интерфейса БСП (Рекомендуемый подход)

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

Разберем данный подход по шагам.

Шаг 1. Подключение внешнего отчета на сервере

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


&НаСервере
Функция ПодключитьВнешнийОтчетНаСервере(СсылкаНаДопОтчет)
    
    // Используем штатный модуль БСП для подключения внешнего отчета
    Возврат ДополнительныеОтчетыИОбработкиВызовСервера.ПодключитьВнешнююОбработку(СсылкаНаДопОтчет);
    
КонецФункции

Шаг 2. Открытие формы отчета на клиенте

В обработчике команды на форме вашей обработки получаем имя подключенного отчета и вызываем стандартную форму через процедуру ОткрытьФорму().


&НаКлиенте
Процедура КомандаОткрытьОтчет(Команда)
    
    // Получаем ссылку на дополнительный отчет на сервере
    СсылкаНаОтчет = ПолучитьСсылкуНаОтчетНаСервере();
    
    Если Не ЗначениеЗаполнено(СсылкаНаОтчет) Тогда
        ВызватьИсключение "Не найден дополнительный отчет в справочнике!";
    КонецЕсли;
    
    // Подключаем отчет и получаем его временное имя
    ИмяИсполняемогоОтчета = ПодключитьВнешнийОтчетНаСервере(СсылкаНаОтчет);
    
    // Задаем параметры открытия формы отчета СКД
    ПараметрыОткрытия = Новый Структура;
    ПараметрыОткрытия.Вставить("СформироватьПриОткрытии", Истина); // Автоматически сформировать результат
    
    // Формируем имя формы внешнего отчета и открываем ее
    ИмяФормы = "ВнешнийОтчет." + ИмяИсполняемогоОтчета + ".Форма";
    ОткрытьФорму(ИмяФормы, ПараметрыОткрытия, ЭтаФорма);

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

&НаСервере
Функция ПолучитьСсылкуНаОтчетНаСервере()
    
    Возврат Справочники.ДополнительныеОтчетыИОбработки.НайтиПоНаименованию("Отчет о выполненных услугах");
    
КонецФункции

Способ 2. Вызов через специализированный модуль БСП

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

Посмотрим, как выглядит вызов с использованием этого модуля:


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

Способ 3. Прямое подключение через менеджер `ВнешниеОтчеты` (без функций БСП)

Если по какой-то причине необходимо выполнить подключение без использования общих модулей БСП, разберем низкоуровневый алгоритм работы с платформенными объектами 1С.

  1. На сервере извлекаем бинарные данные отчета из реквизита ХранилищеОбработки объекта справочника.
  2. Помещаем бинарные данные во временное хранилище.
  3. Вызываем метод ВнешниеОтчеты.Подключить().
  4. На клиенте открываем форму отчета по полученному имени.

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

Передача отборов и параметров в отчет СКД при открытии

Часто при открытии отчета из формы обработки требуется передать в него контекстные данные: период, организацию, контрагента или отборы СКД. Это делается путем заполнения структуры ПараметрыОткрытия, передаваемой в метод ОткрытьФорму().

Рассмотрим пример передачи параметров и отбора в форму отчета:


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

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

← На главную