При доработке типовых отчетов и обработок печати (например, прайс-листа в конфигурациях «Комплексная автоматизация 1.1», «Управление производственным предприятием 1.3» или «Управление торговлей 10.3») разработчики часто сталкиваются с ситуацией: в текст запроса добавлено новое поле или соединение, однако при выполнении отчета в объекте Результат или в итоговой таблице данных новое поле отсутствует. Разберем по шагам, почему так происходит и как правильно управлять полями построителя отчета.
Механизм ПостроительОтчета в платформе 1С:Предприятие 8 формирует итоговый исполняемый запрос динамически. Он ориентируется не только на переданный текст свойства Текст, но и на свои внутренние коллекции настроек. Проанализируем ключевые факторы, влияющие на состав колонок результата:
ВыбранныеПоля уже инициализирована (например, настроена по умолчанию, заполнена типовым кодом или восстановлена из сохраненных настроек пользователя), построитель отчета включает в результирующую секцию ВЫБРАТЬ только те поля, которые явно присутствуют в ВыбранныеПоля, а также поля группировок из ИзмеренияСтроки и ИзмеренияКолонки. Все остальные поля, даже если они присутствуют в тексте основного запроса, отсекаются платформой при генерации итогового запроса.{ЛЕВОЕ СОЕДИНЕНИЕ ...} или {ВЫБРАТЬ ...}, платформа считает эту часть запроса опциональной. До тех пор, пока поле из этого блока не будет задействовано в выбранных полях, отборах, порядке или группировках, соединение физически не попадет в текст исполняемого запроса.Рассмотрим основной способ решения проблемы. Для того чтобы поле попало в выборку и итоговый результат построителя, необходимо убедиться в его наличии среди доступных полей и явно добавить его в коллекцию ВыбранныеПоля.
Посмотрим на пример программного добавления поля после установки текста запроса:
// Проверяем наличие поля среди доступных полей построителя
Если ПостроительОтчета.ДоступныеПоля.Найти("ТранспортнаяЕдиница") <> Неопределено Тогда
// Добавляем поле в состав выбранных
ПостроительОтчета.ВыбранныеПоля.Добавить("ТранспортнаяЕдиница");
КонецЕсли;
Разберем, как проконтролировать, какой именно текст запроса генерирует построитель с учетом всех текущих настроек, отборов и выбранных полей. Свойство ПостроительОтчета.Текст хранит лишь исходный шаблон запроса с инструкциями расширения. Чтобы увидеть финальный текст запроса, который отправляется к СУБД, используем метод ПолучитьЗапрос().
Посмотрим на пример отладки:
// Получаем реальный объект Запрос, сформированный построителем
ЗапросПостроителя = ПостроительОтчета.ПолучитьЗапрос();
// Выводим в консоль или смотрим в отладчике фактический текст
ТекстФактическогоЗапроса = ЗапросПостроителя.Текст;
Если в полученном тексте запроса отсутствует добавленное поле или соединение с таблицей, это прямо указывает на то, что поле не включено в ВыбранныеПоля или отключено настройками построителя.
Рассмотрим ситуацию, когда шаблон запроса был существенно переписан и требуется полностью перестроить список доступных и выбранных полей по умолчанию. В этом случае применяем метод ЗаполнитьНастройки().
Разберем пример вызова:
ПостроительОтчета.Текст = ТекстЗапроса;
// Переформируем структуру полей на основании нового текста
ПостроительОтчета.ЗаполнитьНастройки();
Важно: Метод ЗаполнитьНастройки() сбрасывает пользовательские настройки колонок, отборов и группировок, поэтому его следует вызывать до применения персональных настроек пользователя.
Проанализируем нюансы, возникающие при доработке стандартных отчетов и печатных форм:
ВыбранныеПоля часто очищается и заполняется жестко заданным списком полей из макета или специальной процедуры. Внимательно проверьте модули отчета на наличие методов настройки состава колонок перед выполнением построителя.ПостроительОтчета.Вывести(), а перебирается через выборку результата запроса, убедитесь, что в соответствующей области макета создан параметр с именем добавленного поля, и значение передается в цикле обхода выборки.