При самостоятельной разработке внешних отчетов на управляемых формах начинающие разработчики часто сталкиваются с ситуацией, когда отчет не формируется, данные не выводятся в поле на форме или макет открывается в отдельном окне. Разберем типичные ошибки, возникающие при передаче параметров с формы в запрос, получении макета внешнего объекта и заполнении табличного документа.
Проанализируем фрагмент кода, где возникают трудности, и выделим ключевые проблемы:
Отчеты.ВидыОплатККМ.ПолучитьМакет("Макет") завершается ошибкой, так как внешний отчет не входит в дерево метаданных конфигурации и не доступен через коллекцию Отчеты.СформироватьНаСервере создается локальная переменная Новый ТабличныйДокумент, которая затем возвращается на клиент, но никуда не присваивается. В результате табличный документ на форме остается пустым.ЭтотОбъект.ЭтаФорма или неполные имена приводит к синтаксическим ошибкам. Кроме того, если дата окончания передается без времени (по умолчанию 00:00:00), документы за последний день периода не попадают в результат запроса.Запрос.Выполнить или ТабДок.Очистить) является ошибкой в платформе 1С:Предприятие 8.3.Рассмотрим правильный подход к формированию отчета вручную через код без избыточной сериализации данных между клиентом и сервером.
Если на форме отчета уже создан реквизит с типом ТабличныйДокумент (например, с именем Результат или ТабличныйДокумент), размещенный в виде поля табличного документа, мы можем напрямую изменять его на сервере. Преобразовывать процедуру в функцию и возвращать значение на клиент не требуется.
Разберем по шагам реализацию модуля управляемой формы внешнего отчета:
&НаКлиенте
Процедура Сформировать(Команда)
СформироватьНаСервере();
КонецПроцедуры
&НаСервере
Процедура СформироватьНаСервере()
// Получаем макет внешнего отчета через преобразование реквизита формы в прикладной объект
ОбъектОтчет = РеквизитФормыВЗначение("Отчет");
Макет = ОбъектОтчет.ПолучитьМакет("Макет");
// Инициализируем и настраиваем запрос
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЧекККМОплата.ВидОплаты КАК ВидОплаты,
| ЧекККМОплата.Сумма КАК Сумма
|ИЗ
| Документ.ЧекККМ.Оплата КАК ЧекККМОплата
|ГДЕ
| ЧекККМОплата.Ссылка.Проведен = ИСТИНА
| И ЧекККМОплата.Ссылка.Дата МЕЖДУ &НачалоПериода И &КонецПериода";
// Устанавливаем параметры, используя реквизиты формы ДатаНачала и ДатаОкончания
Запрос.УстановитьПараметр("НачалоПериода", НачалоПериода);
Запрос.УстановитьПараметр("КонецПериода", КонецДня(КонецПериода));
РезультатЗапроса = Запрос.Выполнить();
// Получаем области макета
ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
ОбластьШапкаТаблицы = Макет.ПолучитьОбласть("ШапкаТаблицы");
ОбластьДетальныхЗаписей = Макет.ПолучитьОбласть("Детали");
ОбластьПодвалТаблицы = Макет.ПолучитьОбласть("ПодвалТаблицы");
ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");
// Работаем напрямую с реквизитом формы ТабличныйДокумент
ТабличныйДокумент.Очистить();
ТабличныйДокумент.Вывести(ОбластьЗаголовок);
ТабличныйДокумент.Вывести(ОбластьШапкаТаблицы);
ТабличныйДокумент.НачатьАвтогруппировкуСтрок();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
ОбластьДетальныхЗаписей.Параметры.Заполнить(ВыборкаДетальныеЗаписи);
ТабличныйДокумент.Вывести(ОбластьДетальныхЗаписей, ВыборкаДетальныеЗаписи.Уровень());
КонецЦикла;
ТабличныйДокумент.ЗакончитьАвтогруппировкуСтрок();
ТабличныйДокумент.Вывести(ОбластьПодвалТаблицы);
ТабличныйДокумент.Вывести(ОбластьПодвал);
ТабличныйДокумент.Защита = Истина;
ТабличныйДокумент.ОтображатьСетку = Ложь;
КонецПроцедуры
Посмотрим на важные моменты, которые обеспечивают корректную работу отчета:
КонецДня() устанавливает время на 23:59:59, что гарантирует попадание в выборку всех документов, проведенных в течение финального дня выбранного интервала.ЧекККМОплата.Ссылка.Проведен) исключает необходимость ручного написания оператора ЛЕВОЕ СОЕДИНЕНИЕ, что делает текст запроса более компактным и понятным.РеквизитФормыВЗначение("Отчет") создает экземпляр внешнего отчета в памяти сервера, позволяя получить доступ ко всем его макетам и методам модуля объекта.Выясним причину, по которой ручное формирование макета в коде часто является избыточным. Платформа 1С:Предприятие предоставляет механизм Системы компоновки данных (СКД), который автоматизирует построение отчетов.
При использовании СКД достаточно:
ВидОплаты.НачалоПериода и КонецПериода в состав пользовательских настроек.В этом случае платформа автоматически сгенерирует форму, обработает параметры периода и выведет отчет в табличный документ без написания серверного кода обхода выборок.