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