При разработке сложных отчетов на базе СистемаКомпоновкиДанных часто возникает потребность в динамическом изменении структуры данных. Одной из частых задач является программное добавление ресурсов, когда набор полей или способ их агрегации заранее неизвестен и зависит от выбора пользователя или условий выполнения отчета. Давайте разберем, как реализовать это технически грамотно.
Прежде чем приступать к написанию кода, важно разделить два понятия: СхемаКомпоновкиДанных (структурный каркас, содержащий запросы и описания полей) и НастройкиКомпоновкиДанных (объект, отвечающий за то, как именно данные будут представлены пользователю). Ошибка многих разработчиков заключается в попытке изменить схему в процессе формирования, тогда как эффективнее работать с настройками.
Да, программное добавление ресурсов непосредственно в схему возможно. Объект СхемаКомпоновкиДанных содержит коллекцию Ресурсы. Чтобы добавить туда новый элемент, нам необходимо создать объект РесурсКомпоновкиДанных.
Разберем шаги выполнения этой задачи:
СхемаКомпоновкиДанных вашего отчета.Схема.Ресурсы.Добавить().Сумма(Поле)).Важно помнить, что все манипуляции со схемой должны производиться до инициализации процессора компоновки. После того как вы вызвали метод инициализации, любые изменения в структуре схемы уже не будут учтены.
// Пример создания ресурса программно
НовыйРесурс = СхемаКомпоновкиДанных.Ресурсы.Добавить();
НовыйРесурс.Expression = \"Сумма(МоеПоле)\";
НовыйРесурс.DataField = \"МоеПоле\";
НовыйРесурс.Usage = РесурсИспользованиеКомпоновкиДанных.Авто;
Часто возникает ситуация, когда модификация исходной схемы кажется избыточной или приводит к трудноотслеживаемым ошибкам. В таких случаях лучше использовать КомпоновщикНастроекКомпоновкиДанных. Работа с настройками позволяет динамически добавлять поля в выборку, группировки или ресурсы на этапе выполнения, не меняя саму схему.
Этот подход считается более «чистым», так как:
Рассмотрим, как добавить выбранное поле в настройки:
// Пример добавления поля в выбранные поля настроек
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
ВыбранныеПоля = Настройки.Выбор.Элементы.Добавить(Тип(\"ВыбранноеПолеКомпоновкиДанных\"));
ВыбранныеПоля.Поле = Новый ПолеКомпоновкиДанных(\"МоеПоле\");
ВыбранныеПоля.Использование = Истина;
При программной работе с СКД всегда обращайте внимание на следующие аспекты:
1. Соответствие типов данных. Если вы добавляете выражение ресурса, убедитесь, что тип данных поля поддерживает выбранную агрегатную функцию. Попытка применить Сумма к строковому полю приведет к ошибке при выполнении отчета.
2. Использование XML. Если схема получается крайне сложной, некоторые разработчики предпочитают формировать её в конструкторе, выгружать в XML, а затем программно подменять XML-код в рантайме. Это допустимый, хоть и менее гибкий путь, который позволяет сохранить визуальную структуру при сложной логике.
3. Порядок действий. Запомните золотое правило: сначала подготовка схемы (добавление полей, ресурсов, связей), затем — создание КомпоновщикНастроек, и только в самом конце — инициализация ПроцессорКомпоновкиДанных.
Анализируя ситуацию, мы видим, что прямое вмешательство в схему — это инструмент для специфических задач. Если же ваша цель — дать пользователю возможность гибко выводить колонки, сосредоточьтесь на изучении возможностей КомпоновщикНастроек. Это сэкономит время на поддержке кода в будущем и сделает отчеты более стабильными.