Часто при разработке отчетов или внешних печатных форм разработчики сталкиваются с ситуацией, когда данные из базы успешно получены, запрос выполнен, но в итоговом ТабличныйДокумент параметры макета остаются пустыми. Давайте разберем, почему это происходит и как устранить подобные неполадки.
Если вы работаете со старыми конфигурациями, использующими ПостроительОтчета в обычных формах, первым делом стоит обратить внимание на механизм сохранения настроек. Построитель отчета автоматически сохраняет выбранные поля, отборы и параметры в хранилище значений пользователя.
Как выявить причину:
Если после очистки сохраненных настроек данные начали отображаться, значит, проблема была именно в кэшировании параметров построителя.
В случае с внешними печатными формами ситуация обычно связана с логикой обхода результата запроса. Рассмотрим типичные ошибки, которые мешают заполнению параметров:
1. Некорректный обход результата запроса
Если в коде используется РезультатЗапроса.Выполнить(), важно помнить, что этот метод возвращает РезультатЗапроса, а не выборку. Чтобы получить данные для обхода, необходимо использовать метод Выбрать(). Рассмотрим корректный пример работы:
// Правильный способ получения выборки
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
ОбластьСтрокаТаблицы.Параметры.Заполнить(ВыборкаДетальныеЗаписи);
ТабличныйДокумент.Вывести(ОбластьСтрокаТаблицы);
КонецЦикла;
2. Проблема имен параметров
Метод Параметры.Заполнить() работает по принципу соответствия имен. Если поле в выборке называется Цена, а параметр в макете — ЦенаТовара, система не сможет их сопоставить автоматически. Убедитесь, что имена полей запроса и имена параметров в свойствах ячеек макета полностью идентичны.
3. Тип заполнения ячейки
Проверьте свойства ячейки в конфигураторе. Нажмите на ячейку в макете и в палитре свойств найдите поле Заполнение. Для вывода значений оно должно быть установлено в значение Параметр. Если выбрано Текст, 1С будет воспринимать введенное значение как обычную строку, а не как имя параметра, подлежащее замене на данные.
Если в тексте запроса присутствуют ИТОГИ ПО, объект Выборка становится иерархическим. Это значит, что метод Следующий() будет возвращать сначала записи группировок, затем детальные записи. Если вы просто выводите строку, не анализируя уровень группировки, данные могут отображаться некорректно или дублироваться.
Рекомендация: если вам нужен простой список для печатной формы, по возможности исключайте сложные итоги из запроса или используйте обход с указанием уровня группировки:
// Пример обхода с группировками
Выборка = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока Выборка.Следующий() Цикл
// Вывод шапки группировки
Пока Выборка.Следующий() Цикл
// Вывод детальных записей
КонецЦикла;
КонецЦикла;
Чтобы раз и навсегда разобраться, почему данные не попадают в отчет, выполните следующие действия:
ГДЕ или в переданных параметрах (например, неверная ссылка на документ).Сообщить(РезультатЗапроса.Количество());. Если количество равно 0, значит, в выборку ничего не попало.&СсылкаНаОбъект), имеют корректный тип.Пока и посмотрите значение ВыборкаДетальныеЗаписи. Убедитесь, что поля, которые вы хотите вывести, действительно присутствуют в выборке.Работая последовательно, вы обязательно найдете, в каком месте разрывается цепочка передачи данных. Чаще всего решение лежит либо в области забытого сброса настроек построителя, либо в неверном использовании метода Выбрать() при работе с запросами.