Как передать ссылку документа в запрос внешнего отчета на СКД в 1С:ERP 2.5

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

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

Регистрация внешнего отчета в системе (БСП)

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

Рассмотрим пример кода, который регистрирует отчет для документа «Реализация товаров и услуг»:


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

Настройка параметров в схеме компоновки данных (СКД)

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

  1. Переходим на закладку Параметры в СКД.
  2. Добавляем параметр Ссылка (тип: ДокументСсылка.РеализацияТоваровУслуг).
  3. Убеждаемся, что флаг «Ограничение доступности» снят, если мы планируем управлять им программно через настройки компоновщика.

Программная передача ссылки в форму отчета

Когда пользователь нажимает кнопку вызова внешнего отчета в форме документа, БСП открывает форму отчета и передает ссылку на документ в структуру параметров формы. В ERP 2.5 эта ссылка обычно содержится в параметре ПараметрКоманды.

Если у вашего внешнего отчета создана собственная управляемая форма, мы можем перехватить эту ссылку в обработчике ПриСозданииНаСервере. Рассмотрим, как установить значение параметра СКД программно:


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

Альтернативный способ: Установка отбора в компоновщике

Иногда удобнее использовать не параметры запроса, а стандартные отборы СКД. Это позволяет пользователю при необходимости изменить документ прямо в форме отчета. Разберем пример установки отбора:


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

Работа через модуль объекта (ПриКомпоновкеРезультата)

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

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


Процедура ПриКомпоновкеРезультата(ДанныеРасшифровки, СтандартнаяОбработка)
    
    // БСП часто заполняет настройки компоновщика автоматически при вызове команды.
    // Если нам нужно принудительно убедиться в установке параметра:
    
    ПараметрСсылка = КомпоновщикНастроек.Settings.DataParameters.Items.Find("Ссылка");
    Если ПараметрСсылка <> Неопределено И ЗначениеЗаполнено(ПараметрСсылка.Value) Тогда
        // Параметр уже установлен механизмом вызова БСП
    КонецЕсли;
    
КонецПроцедуры

Использование набора данных — объект

В некоторых сообщениях форума упоминается Набор данных - объект. Рассмотрим ситуацию, когда это необходимо. Если данные документа требуют сложной предварительной обработки на встроенном языке (например, расчет сложных скидок, которые не вычисляются простым запросом), мы формируем ТаблицуЗначений в коде, а затем передаем её в СКД.

В этом случае в СКД создается набор данных типа «Объект» с именем, например, ТаблицаДокумента. В модуле отчета код будет выглядеть так:


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

Подводя итог, проанализируем выбор метода: для большинства простых задач в ERP 2.5 достаточно использовать стандартный Набор данных - запрос с параметром &Ссылка и устанавливать его в форме отчета через Параметры.ПараметрКоманды. Использование программного вывода и внешних наборов данных оправдано только при очень сложной логике сбора информации.

← На главную