К статье
Практический материал

Отчеты и Аналитика · 11 мин

Как получить настройки компоновки данных в 1С

Как получить настройки компоновки данных в 1С: через компоновщик настроек, из отчёта, из хранилища, программно. Примеры кода и разбор типичных ошибок.

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

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

Что представляют собой настройки СКД и где они хранятся

Настройки компоновки данных — это объект типа НастройкиКомпоновкиДанных, который содержит отборы, параметры, выбранные поля, группировки, порядок сортировки и условное оформление. Физически это дерево элементов, которое можно обходить программно, изменять и сохранять.

Храниться настройки могут в нескольких местах. Во-первых, в самой схеме компоновки данных — это настройки по умолчанию, заданные разработчиком в макете. Во-вторых, в хранилище пользовательских настроек (объект ХранилищеПользовательскихНастроекОтчетов) — сюда платформа сохраняет варианты, которые пользователь менял в режиме предприятия. В-третьих, в оперативной памяти — в компоновщике настроек на форме отчёта, пока пользователь работает с отчётом интерактивно.

Получение настроек по умолчанию из схемы компоновки

Самый простой случай — нужны исходные настройки, которые разработчик задал в макете схемы. Они доступны через свойство НастройкиПоУмолчанию объекта схемы:

Схема = Отчеты.ПродажиПоМесяцам.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");

НастройкиПоУмолчанию = Схема.НастройкиПоУмолчанию;

Для Каждого ЭлементОтбора Из НастройкиПоУмолчанию.Отбор.Элементы Цикл

Сообщить(Строка(ЭлементОтбора.ЛевоеЗначение) + " = " + ЭлементОтбора.ПравоеЗначение);

КонецЦикла;

Этот способ подходит, когда нужно сформировать отчёт «как задумано», без учёта пользовательских изменений. Важно помнить: объект настроек по умолчанию принадлежит схеме, поэтому при изменении его элементов в цикле формирований лучше работать с копией или каждый раз получать макет заново, иначе изменения накопятся между вызовами.

Получение текущих настроек через компоновщик настроек

Когда нужны актуальные настройки с учётом того, что пользователь поменял в форме, работают с компоновщиком настроек. Для программного формирования отчёта компоновщик создаётся вручную:

Схема = Отчеты.ПродажиПоМесяцам.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");

КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных;

КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(Схема));

КомпоновщикНастроек.ЗагрузитьНастройки(Схема.НастройкиПоУмолчанию);

ТекущиеНастройки = КомпоновщикНастроек.ПолучитьНастройки();

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

Порядок действий для программного формирования
  1. 1
    Получите макет схемы компоновки методом ПолучитьМакет()
  2. 2
    Создайте КомпоновщикНастроекКомпоновкиДанных и инициализируйте его источником доступных настроек
  3. 3
    Загрузите настройки по умолчанию или нужный вариант через ЗагрузитьНастройки()
  4. 4
    При необходимости примените пользовательские настройки через ЗагрузитьПользовательскиеНастройки()
  5. 5
    Получите итоговые настройки методом ПолучитьНастройки()
  6. 6
    Передайте настройки в КомпоновщикМакетаКомпоновкиДанных вместе со схемой

Получение настроек из формы отчёта

В типовых конфигурациях и отчётах, созданных на основе формы отчёта, компоновщик уже существует как реквизит формы. Обращение к нему зависит от того, как устроен отчёт. Для отчёта с основной формой на управляемом приложении настройки доступны так:

&НаКлиенте

Процедура ПоказатьТекущиеНастройки(Команда)

Настройки = Отчет.КомпоновщикНастроек.ПолучитьНастройки();

Для Каждого Параметр Из Настройки.ПараметрыДанных.Элементы Цикл

Сообщить(Строка(Параметр.Параметр) + " = " + Параметр.Значение);

КонецЦикла;

КонецПроцедуры

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

Получение сохранённых пользовательских настроек из хранилища

Если задача — прочитать варианты отчёта, которые пользователи сохранили ранее (например, для рассылки или пакетного формирования), используется хранилище настроек. В типовых конфигурациях это ХранилищеПользовательскихНастроекОтчетов:

Отбор = Новый Структура("КлючОбъекта", "Отчет.ПродажиПоМесяцам");

Выборка = ХранилищеПользовательскихНастроекОтчетов.Выбрать(Отбор);

Пока Выборка.Следующий() Цикл

Сообщить(Выборка.КлючНастроек + " — " + Выборка.Пользователь);

СохраненныеНастройки = Выборка.Настройки; // значение типа ПользовательскиеНастройкиКомпоновкиДанных

КонецЦикла;

Полученные из хранилища настройки — это только пользовательские изменения (дельта), а не полный набор. Чтобы получить рабочие настройки, их нужно загрузить в компоновщик поверх настроек по умолчанию методом ЗагрузитьПользовательскиеНастройки. В конфигурациях на БСП для этих задач предусмотрены программные интерфейсы модулей вариантов отчётов — используйте их вместо прямой работы с хранилищем, это устойчивее к обновлениям.

Сравнение источников настроек

Схема.НастройкиПоУмолчанию

Подходит для формирования отчёта с исходными параметрами. Не учитывает изменения пользователя.

КомпоновщикНастроек.ПолучитьНастройки()

Даёт актуальные настройки с учётом загруженных пользовательских. Требует ручной инициализации компоновщика.

Реквизит формы Отчет.КомпоновщикНастроек

Самый простой путь внутри формы отчёта. Работает только в контексте формы.

Хранилище пользовательских настроек

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

Как сохранить и передать настройки между сеансами

Частая задача — передать настройки из клиентского сеанса в фоновое задание или сохранить их в файл. Напрямую объект настроек в параметры фонового задания передавать нельзя, поэтому используют сериализацию через ЗначениеВСтрокуВнутр или XDTO:

СтрокаНастроек = ЗначениеВСтрокуВнутр(КомпоновщикНастроек.ПолучитьНастройки());

// ...передача строки в фоновое задание...

ВосстановленныеНастройки = ЗначениеИзСтрокиВнутр(СтрокаНастроек);

КомпоновщикНастроек.ЗагрузитьНастройки(ВосстановленныеНастройки);

Альтернатива — стандартное хранилище настроек: сохранить настройки методом ХранилищеПользовательскихНастроекОтчетов.Сохранить под уникальным ключом, а в фоновое задание передать только этот ключ. Такой подход надёжнее при больших настройках и не раздувает параметры задания.

Типичные ошибки и проверка результата

Самая распространённая ошибка — обращение к КомпоновщикНастроек.Настройки вместо ПолучитьНастройки() и удивление, почему пользовательский отбор «не применился». Вторая частая проблема — попытка установить значение параметра по имени, которого нет в схеме: элемент коллекции параметров нужно сначала найти через НайтиЗначениеПараметра и проверить на Неопределено.

Ещё одна ловушка — сравнение настроек «на глаз». Два визуально одинаковых варианта могут отличаться скрытыми элементами отбора с Использование = Ложь. При отладке выгружайте настройки в XML через сериализатор XDTO и сравнивайте текст — так видны все отличия.

Типичные ошибки
01
Чтение свойства Настройки вместо вызова ПолучитьНастройки() — пользовательские отборы игнорируются
02
Обращение к параметру без проверки на Неопределено — ошибка исполнения при переименовании параметра в схеме
03
Изменение НастройкиПоУмолчанию в цикле формирований — изменения накапливаются, отчёты формируются с чужими отборами
04
Передача объекта настроек напрямую в фоновое задание — ошибка сериализации, задание падает
05
Забытый вызов Инициализировать у компоновщика — доступные поля пустые, настройки не загружаются корректно
Контрольные точки

Как проверить результат

Отборы в итоговых настройках
Норма

Элементы отбора содержат все пользовательские условия с Использование = Истина

Тревожный признак

Отбор пуст или содержит только условия из схемы

Параметры данных
Норма

Значения параметров заполнены, типы совпадают с описанием в схеме

Тревожный признак

Параметры имеют пустые значения или не найдены в коллекции

Формирование отчёта
Норма

Отчёт формируется без ошибок, данные соответствуют отборам

Тревожный признак

Ошибка компоновки макета или отчёт игнорирует установленные условия

FAQ

Чем отличаются Настройки и ПользовательскиеНастройки компоновщика?

Настройки — это полный набор: структура отчёта, группировки, выбранные поля, отборы. ПользовательскиеНастройки — только быстрые изменения, доступные пользователю на панели отчёта (обычно период и несколько отборов). Полные настройки с учётом пользовательских получают методом ПолучитьНастройки().

Как получить настройки варианта отчёта из справочника вариантов в БСП?

В конфигурациях на БСП варианты хранятся в справочнике вариантов отчётов, а настройки — в реквизите-хранилище. Рекомендуется использовать программный интерфейс общих модулей работы с вариантами отчётов, а не читать реквизит напрямую: структура хранения может меняться между версиями библиотеки.

Почему ПолучитьНастройки() возвращает пустые настройки?

Чаще всего компоновщик не инициализирован источником доступных настроек или в него не загружены настройки схемы. Проверьте, что вызваны Инициализировать с объектом ИсточникДоступныхНастроекКомпоновкиДанных и ЗагрузитьНастройки.

Можно ли получить настройки отчёта, не открывая его форму?

Да. Создайте объект отчёта через Отчеты.ИмяОтчёта.Создать(), получите схему методом ПолучитьМакет, инициализируйте компоновщик и загрузите нужные настройки. Форма для этого не требуется.

Как программно добавить отбор в полученные настройки?

Добавьте элемент в коллекцию Настройки.Отбор.Элементы с типом ЭлементОтбораКомпоновкиДанных, заполните ЛевоеЗначение (объект ПолеКомпоновкиДанных), ВидСравнения, ПравоеЗначение и установите Использование = Истина. Перед добавлением убедитесь, что поле доступно в схеме.

Настройки сохраняются, но после обновления конфигурации отчёт не открывается. Что делать?

При обновлении в схеме могли переименоваться поля или параметры, и старые сохранённые настройки стали невалидными. Пользователю достаточно сбросить настройки отчёта к стандартным через меню «Ещё» в форме отчёта. Администратору — проверить и при необходимости очистить проблемные записи в хранилище пользовательских настроек.

Итог

Что важно запомнить

Настройки СКД получают через компоновщик настроек: ПолучитьНастройки() для актуальных данных, НастройкиПоУмолчанию для исходных, хранилище настроек — для сохранённых вариантов. Для передачи между сеансами сериализуйте настройки, а перед изменениями проверяйте существование параметров и полей.