При работе с отчетами в системе 1С:Предприятие 8.3 на управляемых формах часто возникает необходимость динамически корректировать их структуру и содержание. Это может быть добавление новых полей, изменение существующих параметров или корректировка отборов в зависимости от логики бизнес-процессов. Чтобы значительно упростить этот процесс и сократить объем кода, можно использовать СКДБилдер — специальную обертку над объектной моделью СКД. Давайте вместе разберем, как программно осуществлять подобные манипуляции с Системой Компоновки Данных (СКД).
Основная сложность для многих разработчиков заключается в правильном понимании того, к какому объекту нужно обращаться для изменения настроек: к компоновщику настроек формы отчета или к компоновщику настроек объекта отчета. Чтобы не допускать ошибок в архитектуре, важно понимать разницу между компоновщиком настроек формы и объекта и знать, когда какой подход применять.
Прежде чем погрузиться в детали программного изменения, важно четко различать два основных объекта, связанных с настройками СКД:
КомпоновщикНастроекКомпоновкиДанных формы отчета. Этот объект отвечает за текущие пользовательские настройки, которые отображаются и могут быть изменены непосредственно в интерактивной форме отчета. Когда пользователь открывает отчет, меняет отборы, выбранные поля, группировки и т.д., он взаимодействует именно с этим компоновщиком. Доступ к нему обычно осуществляется через элементы формы, например, Элементы.Результат.КомпоновщикНастроек.КомпоновщикНастроекКомпоновкиДанных объекта отчета. Это компоновщик, который является частью самого объекта отчета (например, экземпляра общего модуля отчета или реквизита формы типа "Отчет"). Он содержит базовые или сохраненные настройки отчета. Если вы программно формируете отчет без вывода его на форму, или хотите получить доступ к первоначальным настройкам, то будете работать с этим объектом. Доступ к нему может быть таким: ОтчетОбъект.КомпоновщикНастроек, где ОтчетОбъект – это сам экземпляр отчета.В нашем случае, когда речь идет о программном изменении макета отчета, который будет отображаться на форме и должен реагировать на пользовательские действия или заранее определенную логику, мы будем работать с компоновщиком настроек формы отчета. Именно изменения в этом компоновщике будут немедленно влиять на внешний вид и данные отчета при его обновлении. Для более продвинутых сценариев иногда применяются более сложные архитектурные решения, например, использование двух разных схем в одном отчете СКД.
Для доступа к настройкам компоновщика формы мы будем использовать конструкцию Элементы.Результат.КомпоновщикНастроек.Настройки. Объект Настройки предоставляет доступ к таким коллекциям, как ВыбранныеПоля, ПараметрыДанных, Отборы, Группировки и другим, через которые реализуется программное управление полями, параметрами и отборами СКД.
Добавление или удаление полей в отчете является одной из наиболее частых задач при динамическом формировании отчетов. Рассмотрим, как мы можем программно добавить новое поле в коллекцию выбранных полей отчета.
Шаг 1: Получаем доступ к текущим настройкам отчета.
Для этого мы обратимся к компоновщику настроек, привязанному к элементу формы, который отображает результат отчета. Как правило, этот элемент называется "Результат".
Настройки = Элементы.Результат.КомпоновщикНастроек.Настройки;
Шаг 2: Создаем новое выбранное поле.
Коллекция Настройки.ВыбранныеПоля содержит элементы типа ВыбранноеПолеКомпоновкиДанных. Мы создаем новый такой элемент и добавляем его в коллекцию.
НовоеПоле = Настройки.ВыбранныеПоля.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
Шаг 3: Определяем имя поля и его заголовок.
Свойство Поле объекта ВыбранноеПолеКомпоновкиДанных должно содержать имя поля, как оно определено в схеме СКД (например, Номенклатура.Наименование, Сумма, Период и т.д.). Свойство ТекстЗаголовка используется для отображения более понятного пользователю названия колонки в отчете.
НовоеПоле.Поле = Новый ПолеКомпоновкиДанных("ИмяПоляВСКД"); // Например, "Контрагент.Наименование"
НовоеПоле.ТекстЗаголовка = "Наименование контрагента";
Обратите внимание: Если вы хотите добавить поле, которое является частью выражения или представляет собой агрегатную функцию (например, СУММА(СуммаДокумента)), вам нужно будет соответствующим образом указать это в ПолеКомпоновкиДанных. Для сложных полей может потребоваться сначала определить их в закладке "Наборы данных" схемы СКД как "Вычисляемые поля".
Пример добавления нескольких полей и их настройка:
// Добавляем поле "Номенклатура"
ВыбранноеПолеНоменклатура = Настройки.ВыбранныеПоля.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
ВыбранноеПолеНоменклатура.Поле = Новый ПолеКомпоновкиДанных("Номенклатура");
ВыбранноеПолеНоменклатура.ТекстЗаголовка = "Номенклатура";
// Можно установить порядок вывода, если это важно
ВыбранноеПолеНоменклатура.Порядок = 10;
// Добавляем поле "Количество"
ВыбранноеПолеКоличество = Настройки.ВыбранныеПоля.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
ВыбранноеПолеКоличество.Поле = Новый ПолеКомпоновкиДанных("Количество");
ВыбранноеПолеКоличество.ТекстЗаголовка = "Количество товара";
ВыбранноеПолеКоличество.Порядок = 20;
// Также можно добавлять в группировки.
// Например, если мы хотим сгруппировать по номенклатуре:
ГруппировкаПоНоменклатуре = Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
ГруппировкаПоНоменклатуре.ПоляГруппировки.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных")).Поле = Новый ПолеКомпоновкиДанных("Номенклатура");
В процессе настройки группировок вы можете столкнуться с необходимостью скрыть стандартные названия. Подробнее о том, как реализовать программное изменение заголовка группировки отчета, читайте в профильных материалах. После всех изменений не забудьте обновить отчет, о чем мы поговорим ниже.
Изменение значений параметров позволяет динамически фильтровать данные или передавать внешние значения в запросы отчета. Особенно полезна в этом контексте работа с параметрами и стандартными периодами в СКД программно, так как это позволяет автоматизировать формирование отчетности за определенные интервалы времени.
Шаг 1: Получаем доступ к текущим настройкам отчета.
Как и в случае с полями, сначала нам нужен доступ к объекту Настройки:
Настройки = Элементы.Результат.КомпоновщикНастроек.Настройки;
Шаг 2: Находим или добавляем параметр.
Параметры хранятся в коллекции Настройки.ПараметрыДанных. Мы можем либо найти существующий параметр по его имени, либо добавить новый, если это требуется.
// Предположим, у нас есть параметр "ДатаНачала" в схеме СКД
ПараметрДатаНачала = Настройки.ПараметрыДанных.Найти("ДатаНачала");
Если ПараметрДатаНачала Тогда
// Если параметр найден, устанавливаем его значение
ПараметрДатаНачала.Значение = НачалоМесяца(ТекущаяДата());
// И обязательно активируем его использование
ПараметрДатаНачала.Использование = Истина;
Иначе
// Если параметра нет в настройках (что маловероятно для параметров из схемы),
// или если мы хотим добавить совершенно новый параметр,
// который не был предусмотрен в макете, что бывает реже, но возможно:
НовыйПараметр = Настройки.ПараметрыДанных.Добавить(Тип("ПараметрКомпоновкиДанных"));
НовыйПараметр.Поле = Новый ПолеКомпоновкиДанных("ИмяНовогоПараметра"); // Имя, как в схеме или произвольное
НовыйПараметр.Значение = "НекотороеЗначение";
НовыйПараметр.Использование = Истина;
НовыйПараметр.Доступность = Истина; // Сделать его доступным для пользователя
КонецЕсли;
Разберем свойства объекта ПараметрКомпоновкиДанных:
Поле: Объект ПолеКомпоновкиДанных, содержащий имя параметра, как оно указано в схеме СКД (например, ПериодОтчета, Организация).Значение: Непосредственно значение, которое будет присвоено параметру. Тип значения должен соответствовать типу параметра в СКД (Дата, Строка, СправочникСсылка.Организации и т.д.).Использование: Булево. Указывает, будет ли данный параметр использоваться при формировании отчета. Если Использование = Ложь, параметр не будет применен, даже если у него установлено значение.Доступность: Булево. Определяет, виден ли параметр пользователю в форме настроек отчета. Если Истина, пользователь может изменить его значение через интерфейс.Пример установки параметра типа "Список значений":
Если параметр в СКД настроен на прием нескольких значений (например, список организаций), то его свойство Значение должно быть типа СписокЗначений.
// Предположим, параметр "Организации"
ПараметрОрганизации = Настройки.ПараметрыДанных.Найти("Организации");
Если ПараметрОрганизации Тогда
СписокОрганизаций = Новый СписокЗначений;
// Добавляем нужные элементы справочника "Организации"
СписокОрганизаций.Добавить(Справочники.Организации.НайтиПоНаименованию("Организация А"));
СписокОрганизаций.Добавить(Справочники.Организации.НайтиПоНаименованию("Организация Б"));
ПараметрОрганизации.Значение = СписокОрганизаций;
ПараметрОрганизации.Использование = Истина;
КонецЕсли;
Аналогичным образом можно работать и с отборами. Коллекция Настройки.Отборы содержит элементы типа ЭлементОтбораКомпоновкиДанных. Принцип их создания и настройки схож с параметрами. Для более интерактивного взаимодействия можно использовать решение Пользовательская СКД, которое расширяет возможности построения отчетов на стороне клиента.
После того как вы программно изменили настройки СКД (добавили поля, установили параметры, скорректировали отборы), эти изменения не применятся автоматически. Чтобы отчет перестроился с учетом новых настроек, необходимо его обновить.
Для интерактивного отчета, который отображается в элементе формы (например, в поле ПолеРезультата типа "Поле отчета"), мы используем метод Обновить() этого элемента:
// После всех программных изменений настроек
Элементы.Результат.Обновить();
Этот метод инициирует процесс переформирования отчета, используя текущие настройки, которые мы только что изменили. Отчет будет скомпонован заново и отобразит обновленные данные и структуру. Для решения более сложных задач ознакомьтесь с тем, как выполнять программный вывод отчетов СКД любой сложности в 1С 8.3.
Важный нюанс: Если вы работаете с объектом отчета напрямую (то есть, используете ОтчетОбъект.КомпоновщикНастроек, а не компоновщик формы) и ваша цель — получить скомпонованный результат без вывода его на форму (например, для сохранения в файл или дальнейшей обработки), то метод Элементы.Результат.Обновить() будет неактуален. В этом случае вам потребуется вызвать методы самого объекта отчета, такие как СкомпоноватьРезультат(), передав ему нужный макет компоновки и данные расшифровки, если они требуются.
Однако для большинства случаев, связанных с изменением пользовательских настроек отчета на управляемых формах, именно Элементы.Результат.Обновить() является ключевым для применения изменений.
При программной работе с СКД в 1С мы сталкиваемся с широким спектром возможностей. Давайте рассмотрим несколько важных аспектов, которые помогут вам в дальнейшей разработке:
КомпоновщикНастроек.ПолучитьМакетКомпоновкиДанных().Настройки или напрямую через свойство СхемаКомпоновкиДанных.Настройки.Структура (для группировок) и Настройки.Отборы (для отборов). Для глубокой настройки макета изучите динамическое изменение структуры отчета и добавление группировок. Каждый элемент этих коллекций имеет свои специфические свойства для настройки.КомпоновщикНастроек.ЗагрузитьНастройки() и КомпоновщикНастроек.СохранитьНастройки(), работая с объектами типа ХранилищеНастроекКомпоновкиДанных или преобразуя настройки в XML-строку.КомпоновщикНастроек и Настройки. Это поможет вам понять их структуру и убедиться, что изменения применяются так, как вы ожидаете.Программное управление СКД открывает широкие возможности для создания гибких и мощных отчетов в 1С:Предприятии. Освоив представленные механизмы, вы сможете значительно расширить функционал ваших решений и предоставить пользователям более удобные и адаптируемые инструменты для анализа данных.