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

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

Как получить настройки отчета 1С программно

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

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

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

Ниже разобраны основные способы: получение настроек из формы отчета, загрузка варианта, сохранение и восстановление через хранилище, а также типичные ошибки, из-за которых программно установленные настройки «не применяются».

Как устроены настройки отчета на СКД

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

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

У внешнего отчета компоновщик доступен через объект отчета после его создания. У отчета, встроенного в конфигурацию, — через менеджер отчетов: Отчеты.ИмяОтчета.Создать().

Как получить настройки из формы отчета

Если код выполняется в модуле формы отчета (типовая форма отчета в управляемом приложении), компоновщик настроек доступен через реквизит формы Отчет:

Компоновщик = Отчет.КомпоновщикНастроек;

Настройки = Компоновщик.Настройки;

ПользовательскиеНастройки = Компоновщик.ПользовательскиеНастройки;

Через полученный объект Настройки можно прочитать или изменить отборы, параметры, порядок и структуру. Например, установка значения параметра:

ПараметрПериод = Настройки.ПараметрыДанных.НайтиЗначениеПараметра(

Новый ПараметрКомпоновкиДанных("НачалоПериода"));

Если ПараметрПериод <> Неопределено Тогда

ПараметрПериод.Значение = НачалоМесяца(ТекущаяДатаСеанса());

ПараметрПериод.Использование = Истина;

КонецЕсли;

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

Как получить настройки без формы: создание объекта отчета

Для фоновых заданий, регламентных операций и внешних обработок формы нет, поэтому объект отчета создают программно:

ОтчетОбъект = Отчеты.ПродажиПоМесяцам.Создать();

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

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

Компоновщик.Инициализировать(

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

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

Настройки = Компоновщик.Настройки;

Ключевые моменты этого кода. Метод Инициализировать с источником доступных настроек обязателен: без него компоновщик не знает, какие поля и параметры существуют в схеме, и попытка обратиться к ним даст ошибку или пустые коллекции. Метод ЗагрузитьНастройки принимает объект настроек — чаще всего Схема.НастройкиПоУмолчанию или настройки конкретного варианта.

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

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

Как загрузить настройки конкретного варианта отчета

В типовых конфигурациях варианты отчетов хранятся в справочнике «Варианты отчетов», а сами настройки — в хранилище вариантов. Получить их можно так:

Вариант = ХранилищеВариантовОтчетов.ПолучитьСсылку(

"Отчет.ПродажиПоМесяцам", "МойВариант");

НастройкиВарианта = Вариант.ХранилищеНастроек.Получить();

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

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

Как сохранить и восстановить настройки через XML

Универсальный способ переноса настроек между базами или хранения их вне хранилища вариантов — сериализация в XML. Платформа предоставляет объект СериализаторXDTO:

// Сохранение в строку XML

ЗаписьXML = Новый ЗаписьXML;

ЗаписьXML.УстановитьСтроку();

СериализаторXDTO.ЗаписатьXML(ЗаписьXML, Настройки, "Settings",

"http://v8.1c.ru/8.1/data-composition-system/settings");

СтрокаНастроек = ЗаписьXML.Закрыть();

// Восстановление

ЧтениеXML = Новый ЧтениеXML;

ЧтениеXML.УстановитьСтроку(СтрокаНастроек);

Настройки = СериализаторXDTO.ПрочитатьXML(ЧтениеXML,

Тип("НастройкиКомпоновкиДанных"));

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

Этот подход удобен для хранения настроек в файле, в реквизите справочника типа «ХранилищеЗначения» или для передачи между информационными базами. Ограничение: сериализованные настройки жестко привязаны к структуре схемы — если в базе-приемнике схема отличается, часть настроек не применится.

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

Как проверить, что настройки применились

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

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

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

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

ПроцессорКомпоновки.Инициализировать(Макет);

Результат = Новый ТабличныйДокумент;

ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;

ПроцессорВывода.УстановитьДокумент(Результат);

ПроцессорВывода.Вывести(ПроцессорКомпоновки);

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

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

Частые ошибки и ограничения

Самая распространенная проблема — «настройки установил, а отчет формируется со старыми». Причины почти всегда одни и те же: у элемента отбора или параметра не выставлено свойство Использование = Истина, либо изменения внесены в одну копию настроек, а формируется отчет по другой. Проверяйте, что объект настроек, который вы меняете, — тот же, что передается в компоновщик макета.

Вторая группа ошибок связана с пользовательскими настройками. Если отчет формируется на форме, пользовательские настройки применяются поверх основных и могут перекрывать программно установленные значения. В этом случае либо очищайте пользовательские настройки, либо вносите изменения именно в них.

Третья группа — прав доступа. Внешние отчеты и доступ к хранилищу вариантов могут быть ограничены ролями. Если код выполняется под пользователем без нужных прав, объект отчета не создастся или вариант не найдется. Для регламентных заданий это решается установкой привилегированного режима там, где это оправдано.

Итог

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

Настройки отчета на СКД получают через КомпоновщикНастроекКомпоновкиДанных: из формы — через Отчет.КомпоновщикНастроек, без формы — через создание объекта отчета, инициализацию компоновщика и ЗагрузитьНастройки. Для переноса настройки сериализуют в XML, для проверки — формируют отчет через компоновщик макета, не забывая про Использование у параметров и отборов.

Частые вопросы

Как получить настройки отчета, если он не на СКД?

Если отчет построен без системы компоновки данных, настройки обычно хранятся в реквизитах объекта отчета или формы. Программно к ним обращаются напрямую: ОтчетОбъект.ИмяРеквизита. Для сохранения таких настроек используют СохранитьЗначение и ВосстановитьЗначение или собственный механизм хранения.

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

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

Почему параметр установлен, но отчет его не учитывает?

Чаще всего у параметра не установлено свойство Использование в значение Истина. Реже — параметр ищется не по тому имени, или изменения внесены в одну копию настроек, а отчет формируется по другой (например, через ПолучитьНастройки, которая возвращает отдельный объект).

Можно ли получить настройки отчета другого пользователя?

Да, если настройки сохранены как вариант отчета в хранилище вариантов — их можно загрузить по ключу варианта. Личные (не сохраненные как вариант) пользовательские настройки хранятся в системном хранилище и доступны через ХранилищеПользовательскихНастроекОтчетов с указанием имени пользователя, при наличии соответствующих прав.

Как перенести настройки отчета между разными базами?

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

Нужен ли метод Инициализировать, если настройки только читаются?

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