Как программно добавить ресурс в схему компоновки данных 1С?

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

При разработке сложных отчетов на базе СистемаКомпоновкиДанных часто возникает потребность в динамическом изменении структуры данных. Одной из частых задач является программное добавление ресурсов, когда набор полей или способ их агрегации заранее неизвестен и зависит от выбора пользователя или условий выполнения отчета. Давайте разберем, как реализовать это технически грамотно.

Понимание архитектуры СКД

Прежде чем приступать к написанию кода, важно разделить два понятия: СхемаКомпоновкиДанных (структурный каркас, содержащий запросы и описания полей) и НастройкиКомпоновкиДанных (объект, отвечающий за то, как именно данные будут представлены пользователю). Ошибка многих разработчиков заключается в попытке изменить схему в процессе формирования, тогда как эффективнее работать с настройками.

Вариант 1: Прямое изменение объекта СхемаКомпоновкиДанных

Да, программное добавление ресурсов непосредственно в схему возможно. Объект СхемаКомпоновкиДанных содержит коллекцию Ресурсы. Чтобы добавить туда новый элемент, нам необходимо создать объект РесурсКомпоновкиДанных.

Разберем шаги выполнения этой задачи:

  1. Получите доступ к объекту СхемаКомпоновкиДанных вашего отчета.
  2. Создайте новый ресурс через метод Схема.Ресурсы.Добавить().
  3. Установите выражение для ресурса (например, Сумма(Поле)).
  4. Определите поле, к которому относится этот ресурс.

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


// Пример создания ресурса программно
НовыйРесурс = СхемаКомпоновкиДанных.Ресурсы.Добавить();
НовыйРесурс.Expression = \"Сумма(МоеПоле)\";
НовыйРесурс.DataField = \"МоеПоле\";
НовыйРесурс.Usage = РесурсИспользованиеКомпоновкиДанных.Авто;

Вариант 2: Использование КомпоновщикаНастроек (Рекомендуемый метод)

Часто возникает ситуация, когда модификация исходной схемы кажется избыточной или приводит к трудноотслеживаемым ошибкам. В таких случаях лучше использовать КомпоновщикНастроекКомпоновкиДанных. Работа с настройками позволяет динамически добавлять поля в выборку, группировки или ресурсы на этапе выполнения, не меняя саму схему.

Этот подход считается более «чистым», так как:

Рассмотрим, как добавить выбранное поле в настройки:


// Пример добавления поля в выбранные поля настроек
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
ВыбранныеПоля = Настройки.Выбор.Элементы.Добавить(Тип(\"ВыбранноеПолеКомпоновкиДанных\"));
ВыбранныеПоля.Поле = Новый ПолеКомпоновкиДанных(\"МоеПоле\");
ВыбранныеПоля.Использование = Истина;

Важные рекомендации по реализации

При программной работе с СКД всегда обращайте внимание на следующие аспекты:

1. Соответствие типов данных. Если вы добавляете выражение ресурса, убедитесь, что тип данных поля поддерживает выбранную агрегатную функцию. Попытка применить Сумма к строковому полю приведет к ошибке при выполнении отчета.

2. Использование XML. Если схема получается крайне сложной, некоторые разработчики предпочитают формировать её в конструкторе, выгружать в XML, а затем программно подменять XML-код в рантайме. Это допустимый, хоть и менее гибкий путь, который позволяет сохранить визуальную структуру при сложной логике.

3. Порядок действий. Запомните золотое правило: сначала подготовка схемы (добавление полей, ресурсов, связей), затем — создание КомпоновщикНастроек, и только в самом конце — инициализация ПроцессорКомпоновкиДанных.

Анализируя ситуацию, мы видим, что прямое вмешательство в схему — это инструмент для специфических задач. Если же ваша цель — дать пользователю возможность гибко выводить колонки, сосредоточьтесь на изучении возможностей КомпоновщикНастроек. Это сэкономит время на поддержке кода в будущем и сделает отчеты более стабильными.

← На главную