Почему добавленное в запрос поле не появляется в результате Построителя отчета?

Программист 1С v8.3 (Обычные формы) 1С:Комплексная автоматизация IT и автоматизация бизнеса
← На главную

При доработке типовых отчетов и обработок печати (например, прайс-листа в конфигурациях «Комплексная автоматизация 1.1», «Управление производственным предприятием 1.3» или «Управление торговлей 10.3») разработчики часто сталкиваются с ситуацией: в текст запроса добавлено новое поле или соединение, однако при выполнении отчета в объекте Результат или в итоговой таблице данных новое поле отсутствует. Разберем по шагам, почему так происходит и как правильно управлять полями построителя отчета.

Выясним причину поведения Построителя отчета

Механизм ПостроительОтчета в платформе 1С:Предприятие 8 формирует итоговый исполняемый запрос динамически. Он ориентируется не только на переданный текст свойства Текст, но и на свои внутренние коллекции настроек. Проанализируем ключевые факторы, влияющие на состав колонок результата:

  1. Коллекция выбранных полей: Если коллекция ВыбранныеПоля уже инициализирована (например, настроена по умолчанию, заполнена типовым кодом или восстановлена из сохраненных настроек пользователя), построитель отчета включает в результирующую секцию ВЫБРАТЬ только те поля, которые явно присутствуют в ВыбранныеПоля, а также поля группировок из ИзмеренияСтроки и ИзмеренияКолонки. Все остальные поля, даже если они присутствуют в тексте основного запроса, отсекаются платформой при генерации итогового запроса.
  2. Опциональные блоки расширения языка запросов: Если соединение или поле помещено в фигурные скобки {ЛЕВОЕ СОЕДИНЕНИЕ ...} или {ВЫБРАТЬ ...}, платформа считает эту часть запроса опциональной. До тех пор, пока поле из этого блока не будет задействовано в выбранных полях, отборах, порядке или группировках, соединение физически не попадет в текст исполняемого запроса.
  3. Особенности работы секции ИТОГИ: Если в запросе построителя используется расчет итогов, неагрегированные поля будут доступны только на уровне детальных записей. Однако без включения в состав выбранных полей колонка не будет сформирована вовсе.

Способ 1. Проверка доступных полей и программное добавление в ВыбранныеПоля

Рассмотрим основной способ решения проблемы. Для того чтобы поле попало в выборку и итоговый результат построителя, необходимо убедиться в его наличии среди доступных полей и явно добавить его в коллекцию ВыбранныеПоля.

Посмотрим на пример программного добавления поля после установки текста запроса:


// Проверяем наличие поля среди доступных полей построителя
Если ПостроительОтчета.ДоступныеПоля.Найти("ТранспортнаяЕдиница") <> Неопределено Тогда
    // Добавляем поле в состав выбранных
    ПостроительОтчета.ВыбранныеПоля.Добавить("ТранспортнаяЕдиница");
КонецЕсли;

Способ 2. Анализ реального текста запроса через метод ПолучитьЗапрос()

Разберем, как проконтролировать, какой именно текст запроса генерирует построитель с учетом всех текущих настроек, отборов и выбранных полей. Свойство ПостроительОтчета.Текст хранит лишь исходный шаблон запроса с инструкциями расширения. Чтобы увидеть финальный текст запроса, который отправляется к СУБД, используем метод ПолучитьЗапрос().

Посмотрим на пример отладки:


// Получаем реальный объект Запрос, сформированный построителем
ЗапросПостроителя = ПостроительОтчета.ПолучитьЗапрос();

// Выводим в консоль или смотрим в отладчике фактический текст
ТекстФактическогоЗапроса = ЗапросПостроителя.Текст;

Если в полученном тексте запроса отсутствует добавленное поле или соединение с таблицей, это прямо указывает на то, что поле не включено в ВыбранныеПоля или отключено настройками построителя.

Способ 3. Переинициализация структуры настроек построителя

Рассмотрим ситуацию, когда шаблон запроса был существенно переписан и требуется полностью перестроить список доступных и выбранных полей по умолчанию. В этом случае применяем метод ЗаполнитьНастройки().

Разберем пример вызова:


ПостроительОтчета.Текст = ТекстЗапроса;
// Переформируем структуру полей на основании нового текста
ПостроительОтчета.ЗаполнитьНастройки();

Важно: Метод ЗаполнитьНастройки() сбрасывает пользовательские настройки колонок, отборов и группировок, поэтому его следует вызывать до применения персональных настроек пользователя.

Специфика типовых конфигураций (КА 1.1, УПП 1.3, УТ 10.3)

Проанализируем нюансы, возникающие при доработке стандартных отчетов и печатных форм:

  1. Перезапись настроек в процедурах инициализации: В типовых процедурах формирования отчетов коллекция ВыбранныеПоля часто очищается и заполняется жестко заданным списком полей из макета или специальной процедуры. Внимательно проверьте модули отчета на наличие методов настройки состава колонок перед выполнением построителя.
  2. Ручной вывод областей макета: Если отчет выводится не методом ПостроительОтчета.Вывести(), а перебирается через выборку результата запроса, убедитесь, что в соответствующей области макета создан параметр с именем добавленного поля, и значение передается в цикле обхода выборки.
← На главную