В практике разработчика 1С часто возникает задача вызвать формирование существующего отчета программно из обработки. Это особенно актуально, когда нужно автоматизировать массовую печать или вывести данные отчета в специализированное табличное поле на форме обработки, не изменяя при этом сам объект отчета (например, если он находится на поддержке). Рассмотрим подробно, как это реализовать для обычных форм платформы 8.2, учитывая различные механизмы построения отчетов: от системы компоновки данных (СКД) до типового «Универсального отчета».
Если отчет построен на системе компоновки данных, мы можем полностью контролировать процесс его формирования из кода обработки. Рассмотрим по шагам, как получить схему, настроить ее и вывести результат в табличный документ на нашей форме.
Для начала проанализируем ситуацию, когда нам нужно вывести отчет в поле Результат (тип «Табличный документ»), расположенное на форме нашей обработки. Воспользуемся следующим кодом в обработчике нажатия кнопки:
Процедура КнопкаВыполнитьНажатие(Кнопка)
// 1. Создаем объект отчета по его имени в метаданных
// Замените "Продажи" на имя вашего отчета
ОтчетОбъект = Отчеты.Продажи.Создать();
// 2. Получаем схему компоновки из макетов отчета
СхемаКомпоновкиДанных = ОтчетОбъект.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
// 3. Из схемы возьмем настройки по умолчанию
Настройки = СхемаКомпоновкиДанных.НастройкиПоУмолчанию;
// 4. Подготавливаем данные расшифровки (важно для интерактивности)
ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
// 5. Формируем макет с помощью компоновщика макета
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);
// 6. Инициализируем процессор компоновки
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);
// 7. Очищаем поле табличного документа на форме и выводим результат
Результат = ЭлементыФормы.Результат;
Результат.Очистить();
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(Результат);
ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
КонецПроцедуры
Этот метод хорош тем, что он является «чистым»: мы не зависим от экспортных процедур модуля отчета и можем программно менять любые настройки СКД перед выводом.
В типовых решениях (УТ 10.3, УПП 1.3, КА 1.1) часто используется общий модуль ТиповыеОтчеты. Если ваш отчет спроектирован по стандартам типовой конфигурации, можно упростить код. Разберем пример, где мы устанавливаем параметры периода и отбор по регистратору:
Отчет = Отчеты.Продажи.Создать();
ТабДокумент = Новый ТабличныйДокумент;
// Используем функции типового модуля для установки параметров СКД
ТиповыеОтчеты.УстановитьПараметр(Отчет.КомпоновщикНастроек, "НачалоПериода", НачалоМесяца(ДатаРегистрации));
ТиповыеОтчеты.УстановитьПараметр(Отчет.КомпоновщикНастроек, "КонецПериода", КонецМесяца(ДатаРегистрации));
// Добавляем отбор
ТиповыеОтчеты.ДобавитьОтбор(Отчет.КомпоновщикНастроек, "Организация", СсылкаНаОрганизацию);
// Вызываем стандартный метод формирования, если он предусмотрен в объекте
Отчет.СформироватьОтчет(ТабДокумент);
Обратите внимание: если при использовании этого метода возникает ошибка Поле объекта не обнаружено (ЗначенияНастроекПанелиПользователя), это означает, что ваш отчет не полностью соответствует архитектуре «Универсального отчета» или СКД в нем настроена специфическим образом. В таком случае лучше вернуться к Варианту 1.
Проанализируем ситуацию, когда код выполняется без ошибок, но в результирующем документе выводится сообщение о незаполненном периоде. Это происходит потому, что параметры в СКД могут иметь разные имена или требовать заполнения через специфические реквизиты. Выясним причины и способы решения:
НачалоПериода и КонецПериода. Иногда разработчики используют ДатаНачала или просто Период.
Отчет.ДатаНачала = НужнаяДата;
Отчет.ДатаКонца = НужнаяДата;
ПараметрПериод = Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Период"));
ПараметрПериод.Значение = Новый СтандартныйПериод(НачалоДня(ТекущаяДата()), КонецДня(ТекущаяДата()));
ПараметрПериод.Использование = Истина;
Рассмотрим важный нюанс: после того как мы программно вывели отчет в табличный документ на форме обработки, пользователи часто жалуются, что перестал работать двойной клик (расшифровка). Посмотрим, как это исправить.
Для того чтобы расшифровка работала, переменная ДанныеРасшифровки, которую мы использовали при формировании, должна «жить» всё время, пока открыта форма. Если вы определили ее как локальную переменную внутри процедуры кнопки, она уничтожится сразу после завершения процедуры, и табличный документ «забудет», какие данные стоят за ячейками.
Правильный алгоритм действий:
ДанныеРасшифровкиОбъекта в самом верху модуля формы обработки (в разделе описания переменных).Результат (табличный документ) в свойствах установите флаг «Использование расшифровки».РезультатОбработкаРасшифровки и пропишите в нем вызов стандартного процессора расшифровки или оставьте СтандартнаяОбработка = Истина, если система должна сама открыть детальный отчет.Если отчет, который нужно вызвать, не встроен в конфигурацию, а хранится в отдельном файле, процесс его создания немного меняется. Проанализируем пример подключения внешнего файла:
ПутьКФайлу = "C:\Reports\МойОтчет.erf";
// Используем менеджер внешних отчетов
ОтчетОбъект = ВнешниеОтчеты.Создать(ПутьКФайлу);
// Далее работаем с объектом так же, как с обычным отчетом
Схема = ОтчетОбъект.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
// ... код формирования из Варианта 1 ...
Важно: При работе с внешними отчетами помните о безопасности. Второй параметр метода Создать() позволяет запускать отчет в безопасном режиме, что может ограничить доступ к файловой системе или внешним библиотекам внутри кода самого отчета. Для упрощения отладки и запуска таких файлов можно использовать инструмент для управления и быстрого переоткрытия внешних отчетов и обработок.
Подводя итог, можно сказать, что универсального способа «в одну строку» не существует, так как архитектура отчетов в 1С 8.2 на обычных формах разнообразна. Однако, используя прямой доступ к КомпоновщикуМакета и ПроцессоруВывода, вы сможете вызвать практически любой отчет, сохранив при этом его функциональность и интерактивность.