Часто при разработке отчетов на базе УниверсальныйОтчет в конфигурациях на обычных формах программисты сталкиваются с тем, что запрос, идеально отрабатывающий в консоли, не возвращает никаких данных в отчете. Рассмотрим, почему это происходит и как заставить отчет «увидеть» результат.
Основная сложность заключается в том, что УниверсальныйОтчет — это не просто контейнер для SQL-запроса, а надстройка над объектом ПостроительОтчета. Этот механизм требует не только самого текста запроса, но и инструкций, которые сообщают системе, какие поля можно выбирать, по каким критериям фильтровать данные и как их группировать.
Если в вашем тексте запроса отсутствуют специальные секции с фигурными скобками {}, ПостроительОтчета считает, что отчет не имеет доступных полей для вывода, и метод ВыводВозможен() возвращает Ложь. В итоге вы видите пустую форму без данных.
Для того чтобы отчет корректно обрабатывал настройки, необходимо дополнить текст запроса инструкциями для построителя. Рассмотрим пример правильной структуры запроса:
ТекстЗапроса =
"ВЫБРАТЬ
| ЗаказПокупателя.Ссылка КАК Заказ
|{ВЫБРАТЬ
| Заказ.*}
|ИЗ
| Документ.ЗаказПокупателя КАК ЗаказПокупателя
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
| ПО ЗаказПокупателя.Ссылка = РеализацияТоваровУслуг.Сделка
|ГДЕ
| ЗаказПокупателя.Проведен
| И РеализацияТоваровУслуг.Ссылка ЕСТЬ NULL
|{ГДЕ
| ЗаказПокупателя.Ссылка.*}
|{УПОРЯДОЧИТЬ ПО
| Заказ.*}
|ИТОГИ ПО
| ОБЩИЕ
|{ИТОГИ ПО
| Заказ.*}";
Обратите внимание на блоки в фигурных скобках {}. Это «инструкции», которые говорят системе, какие поля доступны пользователю для настройки в режиме предприятия.
Даже при правильном запросе отчет может не отобразить данные, если в настройках не задано, что именно нужно выводить в строки или колонки. Мы должны программно указать построителю, что поле «Заказ» является группировочным.
Для этого в процедуре УстановитьНачальныеНастройки используем метод ДобавитьИзмерениеСтроки:
// Добавление предопределенных группировок строк отчета.
УниверсальныйОтчет.ДобавитьИзмерениеСтроки("Заказ");
Без этого вызова отчет может оставаться пустым, так как система не знает, как сгруппировать полученную из запроса выборку.
Если данные все еще не отображаются, воспользуйтесь отладчиком для проверки состояния объекта. Посмотрите, что содержит в себе УниверсальныйОтчет.ПостроительОтчета перед выполнением запроса:
УниверсальныйОтчет.УстановитьНачальныеНастройки(Ложь);.ПостроительОтчета.ИзмеренияСтроки. Если коллекция пуста, значит, вы не передали в отчет информацию о группировках.ПостроительОтчета.ПолучитьЗапрос() в окне «Вычисление выражения», чтобы увидеть финальный текст запроса с учетом всех настроек, подставленных построителем.ВыводВозможен() переменная Результат становится равной Истина. Если все коллекции (группировки, колонки, выбранные поля) пусты, отчет блокирует вывод.УниверсальныйОтчет.ДобавитьВТекстЗапросаСвойстваИКатегории(ТекстЗапроса); до того, как передадите текст в построитель.Систему Компоновки Данных (СКД). Это избавит вас от ручного написания секций {} и позволит управлять структурой отчета визуально, без написания громоздкого кода инициализации в УстановитьНачальныеНастройки.Следуя этим шагам, вы сможете оживить любой отчет на базе УниверсальныйОтчет. Главное — помнить, что ПостроительОтчета ожидает от вас «карту» данных, которую нужно передать через секции {} и методы настройки в модуле отчета.