При создании дополнительных отчетов в 1С, которые запускаются непосредственно из формы документа, часто возникает задача автоматической передачи ссылки на этот документ в схему компоновки данных (СКД). Давайте разберем по шагам, как правильно реализовать этот механизм, используя возможности БСП и классический программный подход.
Когда вы подключаете внешний отчет через механизм Дополнительные отчеты и обработки, платформа 1С при запуске команды из формы документа передает в отчет специальный параметр ОбъектыНазначения. Этот параметр представляет собой массив, содержащий ссылки на объекты, для которых был вызван отчет. Именно этот массив является «ключом» к решению вашей задачи.
Первым делом нам необходимо корректно принять переданные данные в форме нашего отчета. Для этого воспользуемся событием ПриСозданииНаСервере в модуле формы обработки. Мы должны считать массив из параметров формы и сохранить его в реквизит обработки, чтобы впоследствии использовать его в модуле объекта.
Разберем пример кода для модуля формы:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Проверяем, передан ли нам массив объектов
Если Параметры.Свойство("ОбъектыНазначения") И ТипЗнч(Параметры.ОбъектыНазначения) = Тип("Массив") Тогда
Если Параметры.ОбъектыНазначения.Количество() > 0 Тогда
// Сохраняем ссылку в реквизит объекта для последующего использования
Объект.ДокументСсылка = Параметры.ОбъектыНазначения[0];
КонецЕсли;
КонецЕсли;
КонецПроцедуры
После того как ссылка сохранена в реквизите объекта, нам нужно передать её непосредственно в параметры данных СКД. Наиболее надежный способ — использовать процедуру ПриКомпоновкеРезультата. Важно понимать, что ручная инициализация процессоров компоновки требует аккуратности, чтобы не возникло конфликтов с настройками пользователя.
Посмотрим, как выполнить установку параметра правильно:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь; // Отключаем стандартный вывод, чтобы управлять процессом вручную
// Получаем текущие настройки компоновщика
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
// Находим параметр "Ссылка" (убедитесь, что имя параметра в СКД совпадает с этим именем)
ПараметрСсылка = Настройки.ПараметрыДанных.Элементы.Найти("Ссылка");
Если ПараметрСсылка <> Неопределено Тогда
ПараметрСсылка.Значение = ЭтотОбъект.ДокументСсылка;
ПараметрСсылка.Использование = Истина;
КонецЕсли;
// Инициализируем схему и макет
СхемаКомпоновки = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновки, Настройки, ДанныеРасшифровки);
// Выводим результат
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
КонецПроцедуры
Если после выполнения указанных действий отчет не выводит данные, проанализируйте следующие моменты:
ПриСозданииНаСервере. Убедитесь, что Параметры.ОбъектыНазначения не пуст. Если переменная пуста, скорее всего, отчет был запущен не через кнопку «Дополнительные отчеты» в документе, а обычным открытием файла.ВыполнитьКоманду. В типовых решениях БСП сама вызывает формирование отчета, что минимизирует вероятность ошибок при ручной инициализации процессоров.КомпоновщикМакета.Выполнить принимает именно те настройки, в которые вы внесли изменения. Убедитесь, что вы передаете в него объект Настройки, а не получаете их заново из компоновщика без учета внесенных правок.Применение этих методов позволит вам создавать гибкие и удобные отчеты, которые автоматически подстраиваются под контекст документа, из которого они вызываются, обеспечивая пользователям бесшовную работу с данными системы.