Отчеты и Аналитика · 11 мин
Как получить настройки компоновки данных в 1С
Как получить настройки компоновки данных в 1С: через компоновщик настроек, из отчёта, из хранилища, программно. Примеры кода и разбор типичных ошибок.
Настройки компоновки данных (СКД) определяют, какой отчёт увидит пользователь: какие поля выводятся, какие отборы применены, как сгруппированы данные. Получить эти настройки программно нужно в самых разных задачах — от сохранения пользовательских вариантов до формирования отчёта в фоновом задании без участия пользователя.
В зависимости от ситуации настройки извлекаются по-разному: через объект КомпоновщикНастроекКомпоновкиДанных, из реквизита формы отчёта, из хранилища пользовательских настроек или напрямую из схемы компоновки. Дальше разберём каждый способ с готовыми примерами кода.
Что представляют собой настройки СКД и где они хранятся
Настройки компоновки данных — это объект типа НастройкиКомпоновкиДанных, который содержит отборы, параметры, выбранные поля, группировки, порядок сортировки и условное оформление. Физически это дерево элементов, которое можно обходить программно, изменять и сохранять.
Храниться настройки могут в нескольких местах. Во-первых, в самой схеме компоновки данных — это настройки по умолчанию, заданные разработчиком в макете. Во-вторых, в хранилище пользовательских настроек (объект ХранилищеПользовательскихНастроекОтчетов) — сюда платформа сохраняет варианты, которые пользователь менял в режиме предприятия. В-третьих, в оперативной памяти — в компоновщике настроек на форме отчёта, пока пользователь работает с отчётом интерактивно.
Получение настроек по умолчанию из схемы компоновки
Самый простой случай — нужны исходные настройки, которые разработчик задал в макете схемы. Они доступны через свойство НастройкиПоУмолчанию объекта схемы:
Схема = Отчеты.ПродажиПоМесяцам.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
НастройкиПоУмолчанию = Схема.НастройкиПоУмолчанию;
Для Каждого ЭлементОтбора Из НастройкиПоУмолчанию.Отбор.Элементы Цикл
Сообщить(Строка(ЭлементОтбора.ЛевоеЗначение) + " = " + ЭлементОтбора.ПравоеЗначение);
КонецЦикла;
Этот способ подходит, когда нужно сформировать отчёт «как задумано», без учёта пользовательских изменений. Важно помнить: объект настроек по умолчанию принадлежит схеме, поэтому при изменении его элементов в цикле формирований лучше работать с копией или каждый раз получать макет заново, иначе изменения накопятся между вызовами.
Получение текущих настроек через компоновщик настроек
Когда нужны актуальные настройки с учётом того, что пользователь поменял в форме, работают с компоновщиком настроек. Для программного формирования отчёта компоновщик создаётся вручную:
Схема = Отчеты.ПродажиПоМесяцам.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных;
КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(Схема));
КомпоновщикНастроек.ЗагрузитьНастройки(Схема.НастройкиПоУмолчанию);
ТекущиеНастройки = КомпоновщикНастроек.ПолучитьНастройки();
Ключевой момент — разница между Настройки и результатом ПолучитьНастройки(). Свойство КомпоновщикНастроек.Настройки содержит загруженные настройки, а метод ПолучитьНастройки() дополнительно применяет зафиксированные пользовательские настройки (если вызывался ЗагрузитьПользовательскиеНастройки). Для программного формирования почти всегда нужен именно ПолучитьНастройки().
- 1Получите макет схемы компоновки методом ПолучитьМакет()
- 2Создайте КомпоновщикНастроекКомпоновкиДанных и инициализируйте его источником доступных настроек
- 3Загрузите настройки по умолчанию или нужный вариант через ЗагрузитьНастройки()
- 4При необходимости примените пользовательские настройки через ЗагрузитьПользовательскиеНастройки()
- 5Получите итоговые настройки методом ПолучитьНастройки()
- 6Передайте настройки в КомпоновщикМакетаКомпоновкиДанных вместе со схемой
Получение настроек из формы отчёта
В типовых конфигурациях и отчётах, созданных на основе формы отчёта, компоновщик уже существует как реквизит формы. Обращение к нему зависит от того, как устроен отчёт. Для отчёта с основной формой на управляемом приложении настройки доступны так:
&НаКлиенте
Процедура ПоказатьТекущиеНастройки(Команда)
Настройки = Отчет.КомпоновщикНастроек.ПолучитьНастройки();
Для Каждого Параметр Из Настройки.ПараметрыДанных.Элементы Цикл
Сообщить(Строка(Параметр.Параметр) + " = " + Параметр.Значение);
КонецЦикла;
КонецПроцедуры
В отчётах, подключённых к БСП (Библиотека стандартных подсистем), структура формы сложнее: настройки лежат в Отчет.КомпоновщикНастроек, а пользовательские — отдельно, через ПользовательскиеНастройки компоновщика. Перед обращением к реквизиту убедитесь, что в модуле формы он действительно существует — в некоторых конфигурациях реквизит называется иначе.
Получение сохранённых пользовательских настроек из хранилища
Если задача — прочитать варианты отчёта, которые пользователи сохранили ранее (например, для рассылки или пакетного формирования), используется хранилище настроек. В типовых конфигурациях это ХранилищеПользовательскихНастроекОтчетов:
Отбор = Новый Структура("КлючОбъекта", "Отчет.ПродажиПоМесяцам");
Выборка = ХранилищеПользовательскихНастроекОтчетов.Выбрать(Отбор);
Пока Выборка.Следующий() Цикл
Сообщить(Выборка.КлючНастроек + " — " + Выборка.Пользователь);
СохраненныеНастройки = Выборка.Настройки; // значение типа ПользовательскиеНастройкиКомпоновкиДанных
КонецЦикла;
Полученные из хранилища настройки — это только пользовательские изменения (дельта), а не полный набор. Чтобы получить рабочие настройки, их нужно загрузить в компоновщик поверх настроек по умолчанию методом ЗагрузитьПользовательскиеНастройки. В конфигурациях на БСП для этих задач предусмотрены программные интерфейсы модулей вариантов отчётов — используйте их вместо прямой работы с хранилищем, это устойчивее к обновлениям.
Сравнение источников настроек
Подходит для формирования отчёта с исходными параметрами. Не учитывает изменения пользователя.
Даёт актуальные настройки с учётом загруженных пользовательских. Требует ручной инициализации компоновщика.
Самый простой путь внутри формы отчёта. Работает только в контексте формы.
Позволяет читать сохранённые варианты других пользователей. Возвращает только дельту изменений, требует наложения на базовые настройки.
Как сохранить и передать настройки между сеансами
Частая задача — передать настройки из клиентского сеанса в фоновое задание или сохранить их в файл. Напрямую объект настроек в параметры фонового задания передавать нельзя, поэтому используют сериализацию через ЗначениеВСтрокуВнутр или XDTO:
СтрокаНастроек = ЗначениеВСтрокуВнутр(КомпоновщикНастроек.ПолучитьНастройки());
// ...передача строки в фоновое задание...
ВосстановленныеНастройки = ЗначениеИзСтрокиВнутр(СтрокаНастроек);
КомпоновщикНастроек.ЗагрузитьНастройки(ВосстановленныеНастройки);
Альтернатива — стандартное хранилище настроек: сохранить настройки методом ХранилищеПользовательскихНастроекОтчетов.Сохранить под уникальным ключом, а в фоновое задание передать только этот ключ. Такой подход надёжнее при больших настройках и не раздувает параметры задания.
Типичные ошибки и проверка результата
Самая распространённая ошибка — обращение к КомпоновщикНастроек.Настройки вместо ПолучитьНастройки() и удивление, почему пользовательский отбор «не применился». Вторая частая проблема — попытка установить значение параметра по имени, которого нет в схеме: элемент коллекции параметров нужно сначала найти через НайтиЗначениеПараметра и проверить на Неопределено.
Ещё одна ловушка — сравнение настроек «на глаз». Два визуально одинаковых варианта могут отличаться скрытыми элементами отбора с Использование = Ложь. При отладке выгружайте настройки в XML через сериализатор XDTO и сравнивайте текст — так видны все отличия.
Как проверить результат
Элементы отбора содержат все пользовательские условия с Использование = Истина
Отбор пуст или содержит только условия из схемы
Значения параметров заполнены, типы совпадают с описанием в схеме
Параметры имеют пустые значения или не найдены в коллекции
Отчёт формируется без ошибок, данные соответствуют отборам
Ошибка компоновки макета или отчёт игнорирует установленные условия
FAQ
Чем отличаются Настройки и ПользовательскиеНастройки компоновщика?
Настройки — это полный набор: структура отчёта, группировки, выбранные поля, отборы. ПользовательскиеНастройки — только быстрые изменения, доступные пользователю на панели отчёта (обычно период и несколько отборов). Полные настройки с учётом пользовательских получают методом ПолучитьНастройки().
Как получить настройки варианта отчёта из справочника вариантов в БСП?
В конфигурациях на БСП варианты хранятся в справочнике вариантов отчётов, а настройки — в реквизите-хранилище. Рекомендуется использовать программный интерфейс общих модулей работы с вариантами отчётов, а не читать реквизит напрямую: структура хранения может меняться между версиями библиотеки.
Почему ПолучитьНастройки() возвращает пустые настройки?
Чаще всего компоновщик не инициализирован источником доступных настроек или в него не загружены настройки схемы. Проверьте, что вызваны Инициализировать с объектом ИсточникДоступныхНастроекКомпоновкиДанных и ЗагрузитьНастройки.
Можно ли получить настройки отчёта, не открывая его форму?
Да. Создайте объект отчёта через Отчеты.ИмяОтчёта.Создать(), получите схему методом ПолучитьМакет, инициализируйте компоновщик и загрузите нужные настройки. Форма для этого не требуется.
Как программно добавить отбор в полученные настройки?
Добавьте элемент в коллекцию Настройки.Отбор.Элементы с типом ЭлементОтбораКомпоновкиДанных, заполните ЛевоеЗначение (объект ПолеКомпоновкиДанных), ВидСравнения, ПравоеЗначение и установите Использование = Истина. Перед добавлением убедитесь, что поле доступно в схеме.
Настройки сохраняются, но после обновления конфигурации отчёт не открывается. Что делать?
При обновлении в схеме могли переименоваться поля или параметры, и старые сохранённые настройки стали невалидными. Пользователю достаточно сбросить настройки отчёта к стандартным через меню «Ещё» в форме отчёта. Администратору — проверить и при необходимости очистить проблемные записи в хранилище пользовательских настроек.
Что важно запомнить
Настройки СКД получают через компоновщик настроек: ПолучитьНастройки() для актуальных данных, НастройкиПоУмолчанию для исходных, хранилище настроек — для сохранённых вариантов. Для передачи между сеансами сериализуйте настройки, а перед изменениями проверяйте существование параметров и полей.