В современной разработке на платформе 1С:Предприятие 8.3, особенно в конфигурациях на базе БСП (Библиотека стандартных подсистем), таких как ERP 2.5, задача вызова отчета из формы конкретного документа является классической. Основная сложность для начинающих разработчиков заключается в понимании того, как именно ссылка на текущий документ попадает в систему компоновки данных (СКД) внешнего отчета. Проанализируем ситуацию и разберем по шагам, как правильно настроить этот процесс.
Прежде чем передавать параметры, отчет должен «понимать», для каких объектов он предназначен. В ERP 2.5 внешние отчеты подключаются через справочник «Дополнительные отчеты и обработки». Для того чтобы отчет появился в подменю «Отчеты» конкретного документа, необходимо в модуле объекта отчета определить функцию СведенияОВнешнейОбработке.
Рассмотрим пример кода, который регистрирует отчет для документа «Реализация товаров и услуг»:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.1");
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработки.ВидОбработкиОтчет();
// Указываем документы, в которых будет отображаться кнопка вызова отчета
МассивНазначений = Новый Массив;
МассивНазначений.Добавить("Документ.РеализацияТоваровУслуг");
ПараметрыРегистрации.Назначение = МассивНазначений;
ПараметрыРегистрации.Наименование = "Отчет по данным документа";
ПараметрыРегистрации.БезопасныйРежим = Ложь;
НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
НоваяКоманда.Представление = "Сформировать отчет по документу";
НоваяКоманда.Идентификатор = "ОтчетПоДокументу";
НоваяКоманда.Использование = ДополнительныеОтчетыИОбработки.ТипКомандыОткрытиеФормы();
Возврат ПараметрыРегистрации;
КонецФункции
После регистрации отчета перейдем к настройке самой схемы. В запросе СКД необходимо создать параметр, например, с именем Ссылка. Проанализируем важный нюанс: если мы хотим, чтобы отчет автоматически фильтровал данные по текущему документу, этот параметр должен быть доступен для настройки.
Ссылка (тип: ДокументСсылка.РеализацияТоваровУслуг).Когда пользователь нажимает кнопку вызова внешнего отчета в форме документа, БСП открывает форму отчета и передает ссылку на документ в структуру параметров формы. В ERP 2.5 эта ссылка обычно содержится в параметре ПараметрКоманды.
Если у вашего внешнего отчета создана собственная управляемая форма, мы можем перехватить эту ссылку в обработчике ПриСозданииНаСервере. Рассмотрим, как установить значение параметра СКД программно:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Проверяем наличие ссылки в параметрах вызова
ДокументВладелец = Неопределено;
Если Параметры.Свойство("ПараметрКоманды", ДокументВладелец) И ЗначениеЗаполнено(ДокументВладелец) Тогда
// Устанавливаем значение параметра в компоновщике настроек
ПараметрСКД = Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("Ссылка");
Если ПараметрСКД <> Неопределено Тогда
ПараметрСКД.Значение = ДокументВладелец;
ПараметрСКД.Использование = Истина;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Иногда удобнее использовать не параметры запроса, а стандартные отборы СКД. Это позволяет пользователю при необходимости изменить документ прямо в форме отчета. Разберем пример установки отбора:
&НаСервере
Процедура УстановитьОтборПоСсылке(ДокументСсылка)
Настройки = Отчет.КомпоновщикНастроек.Настройки;
// Ищем существующий отбор по полю "Ссылка"
ПолеСсылка = Новый ПолеКомпоновкиДанных("Ссылка");
ЭлементОтбора = Неопределено;
Для Каждого Элемент Из Настройки.Отбор.Элементы Цикл
Если ТипЗнч(Элемент) = Тип("ЭлементОтбораКомпоновкиДанных")
И Элемент.ЛевоеЗначение = ПолеСсылка Тогда
ЭлементОтбора = Элемент;
Прервать;
КонецЕсли;
КонецЦикла;
// Если отбор не найден, создаем новый
Если ЭлементОтбора = Неопределено Тогда
ЭлементОтбора = Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = ПолеСсылка;
КонецЕсли;
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = ДокументСсылка;
ЭлементОтбора.Использование = Истина;
КонецПроцедуры
Если отчет не имеет формы или мы хотим гарантировать установку параметров вне зависимости от интерфейсных действий, используем предопределенную процедуру ПриКомпоновкеРезультата в модуле объекта отчета. Это наиболее надежный способ для внешних отчетов.
Важно: При работе через БСП ссылка может передаваться в структуре ДополнительныеПараметры или быть доступной через КомпоновщикНастроек, если БСП сама инициализировала настройки. Выясним, как это выглядит в коде:
Процедура ПриКомпоновкеРезультата(ДанныеРасшифровки, СтандартнаяОбработка)
// БСП часто заполняет настройки компоновщика автоматически при вызове команды.
// Если нам нужно принудительно убедиться в установке параметра:
ПараметрСсылка = КомпоновщикНастроек.Settings.DataParameters.Items.Find("Ссылка");
Если ПараметрСсылка <> Неопределено И ЗначениеЗаполнено(ПараметрСсылка.Value) Тогда
// Параметр уже установлен механизмом вызова БСП
КонецЕсли;
КонецПроцедуры
В некоторых сообщениях форума упоминается Набор данных - объект. Рассмотрим ситуацию, когда это необходимо. Если данные документа требуют сложной предварительной обработки на встроенном языке (например, расчет сложных скидок, которые не вычисляются простым запросом), мы формируем ТаблицуЗначений в коде, а затем передаем её в СКД.
В этом случае в СКД создается набор данных типа «Объект» с именем, например, ТаблицаДокумента. В модуле отчета код будет выглядеть так:
Процедура ПриКомпоновкеРезультата(ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь; // Отключаем стандартный вывод
// 1. Получаем ссылку (например, из параметров настроек)
СсылкаНаДокумент = ПолучитьСсылкуИзНастроек();
// 2. Формируем таблицу данных
ТаблицаДанных = СформироватьТаблицуПоДокументу(СсылкаНаДокумент);
// 3. Передаем таблицу в процессор компоновки
ВнешниеНаборыДанных = Новый Структура;
ВнешниеНаборыДанных.Вставить("ТаблицаДокумента", ТаблицаДанных);
// Дальнейший программный вывод отчета...
СхемаКомпоновкиДанных = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных, ДанныеРасшифровки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(Результат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
КонецПроцедуры
Подводя итог, проанализируем выбор метода: для большинства простых задач в ERP 2.5 достаточно использовать стандартный Набор данных - запрос с параметром &Ссылка и устанавливать его в форме отчета через Параметры.ПараметрКоманды. Использование программного вывода и внешних наборов данных оправдано только при очень сложной логике сбора информации.