При работе с Системой компоновки данных (СКД) начинающие разработчики часто сталкиваются с путаницей между похожими названиями объектов. Мы часто слышим про «Схему», «Настройки» и «Компоновщик настроек». Если назначение схемы компоновки данных (самого скелета отчета) обычно понятно, то роль объекта КомпоновщикНастроекКомпоновкиДанных часто ускользает. Давайте разберем этот механизм подробно и поймем, почему без него работа с современными отчетами в 1С была бы крайне трудоемкой.
Проанализируем простую ситуацию: у нас есть отчет, в котором программист в Конфигураторе задал стандартный отбор по «Складу». Однако пользователь, открыв отчет в режиме «1С:Предприятие», хочет добавить свой отбор по «Товару» или изменить сортировку. В этот момент в системе сосуществуют сразу несколько вариантов настроек. Компоновщик настроек — это специальный «умный» объект-менеджер, который берет на себя задачу по объединению всех пожеланий (и программиста, и пользователя) в единую структуру, которую сможет понять генератор отчета.
Рассмотрим подробнее три независимых слоя, которыми управляет компоновщик:
Выясним причину существования компоновщика как отдельной сущности. Главная проблема — это синхронизация. В управляемых формах 1С существует механизм «автозаполнения». Когда мы выносим на форму таблицу и указываем путь к данным Отчет.КомпоновщикНастроек, платформа автоматически отрисовывает все доступные поля.
Если бы компоновщика не было, программисту пришлось бы вручную писать огромные блоки кода, чтобы:
Компоновщик делает это автоматически. Когда пользователь меняет значение даты на форме, компоновщик мгновенно «проецирует» это изменение на внутреннюю структуру настроек компоновки.
Для того чтобы компоновщик начал выполнять свои функции, его необходимо правильно подготовить. Проанализируем основные этапы его жизненного цикла в коде.
1. Инициализация
Компоновщик не может работать «в пустоте». Ему нужно знать, какие поля вообще существуют в базе данных и какие правила к ним применимы. Для этого используется метод Инициализировать(). Ему передается ИсточникДоступныхНастроекКомпоновкиДанных, который создается на основании схемы СКД или URL-адреса схемы.
// Пример инициализации компоновщика
ИсточникНастроек = Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемыВХранилище);
Отчет.КомпоновщикНастроек.Инициализировать(ИсточникНастроек);
2. Метод ПолучитьНастройки()
Это, пожалуй, самый важный момент. Перед формированием отчета мы вызываем этот метод. Что он делает? Он берет «базовый скелет» из первого слоя, накладывает сверху «фиксированные запреты» из третьего слоя и добавляет «пользовательские хотелки» из второго. На выходе мы получаем объект типа НастройкиКомпоновкиДанных. Именно этот итоговый «коктейль» передается дальше — в компоновщик макета.
Этот вопрос часто задают на форумах. Посмотрим на ситуацию наглядным примером:
Рассмотрим, как программно установить фиксированный отбор, который пользователь не сможет отключить. Это одна из самых частых задач для программиста 1С.
// Установка фиксированного отбора по организации
НовыйОтбор = Отчет.КомпоновщикНастроек.ФиксированныеНастройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
НовыйОтбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Организация");
НовыйОтбор.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
НовыйОтбор.ПравоеЗначение = Справочники.Организации.НайтиПоРеквизиту("ИНН", "7701010101");
НовыйОтбор.Использование = Истина;
В данном примере мы обратились к коллекции ФиксированныеНастройки. Если бы мы добавили этот же код в коллекцию Настройки, пользователь увидел бы этот отбор в окне настроек и смог бы его снять. А через компоновщик в слое фиксированных настроек мы обеспечиваем жесткий контроль данных.
Также важно упомянуть работу с параметрами. Часто параметры СКД (например, Период) выносятся в пользовательские настройки. Чтобы программно заполнить их из кода формы, мы будем обращаться именно к компоновщику:
// Установка значения параметра через компоновщик настроек
ПараметрПериод = Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("Период");
Если ПараметрПериод <> Неопределено Тогда
ПараметрПериод.Значение = Новый СтандартныйПериод(НачалоМесяца(ТекущаяДата()), КонецМесяца(ТекущаяДата()));
ПараметрПериод.Использование = Истина;
КонецЕсли;
Мы выяснили, что КомпоновщикНастроекКомпоновкиДанных — это не просто контейнер для хранения фильтров, а мощный механизм автоматизации UI и логического объединения разных уровней настроек. Он избавляет разработчика от необходимости вручную синхронизировать форму и схему компоновки, обеспечивая целостность данных. Понимание его работы — это ключ к созданию гибких и надежных отчетов в системе 1С:Предприятие 8.