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

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

При разработке сложных систем автоматизации на платформе 1С:Предприятие 8.3, особенно в конфигурациях на базе Библиотеки стандартных подсистем (БСП), таких как Управление торговлей 11.5, ERP 2.5 или Комплексная автоматизация, часто возникает задача программного формирования отчетов. Одной из наиболее распространенных проблем является ситуация, когда отчет формируется по «стандартному» варианту, игнорируя фильтры, даты и параметры, которые пользователь установил и сохранил в своем варианте отчета. В этой статье мы подробно разберем, как правильно извлечь все настройки и заставить Систему компоновки данных (СКД) работать с учетом пользовательских правок. Для реализации вывода отчета на форму с добавлением отборов можно использовать пример вывода отчета на форму через варианты отчетов БСП.

Анализ проблемы: почему стандартный подход не работает

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

  1. Основные настройки варианта: Это структура отчета — группировки, выбранные поля, порядок сортировки и условное оформление.
  2. Пользовательские настройки: Это конкретные значения параметров (например, Период) и отборов (например, Организация или Склад), которые пользователь вынес на форму для быстрого изменения.

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

Разберем структуру хранения настроек в БСП

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

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

Решение 1: Прямое извлечение данных из справочника

Рассмотрим первый способ, который основан на непосредственном обращении к данным справочника. Этот метод полезен, если вы хотите детально контролировать процесс получения данных. Предположим, что ВариантОтчета — это ссылка на элемент справочника Варианты отчетов, выбранная пользователем на форме вашей обработки.


// Получаем объект варианта отчета для доступа к хранилищам
ОбъектВарианта = ВариантОтчета.ПолучитьОбъект();

// Извлекаем настройки из ХранилищаЗначения
ОсновныеНастройки = ОбъектВарианта.Настройки.Получить();
ПользовательскиеНастройки = ОбъектВарианта.ПользовательскиеНастройки.Получить();

// Инициализируем компоновщик
СКД = Отчеты.ИМЯОТЧЕТА.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
Компоновщик = Новый КомпоновщикНастроекКомпоновкиДанных;
ИсточникДоступныхНастроек = Новый ИсточникДоступныхНастроекКомпоновкиДанных(СКД);
Компоновщик.Инициализировать(ИсточникДоступныхНастроек);

// Загружаем сначала структуру варианта
Если ТипЗнч(ОсновныеНастройки) = Тип("НастройкиКомпоновкиДанных") Тогда
    Компоновщик.ЗагрузитьНастройки(ОсновныеНастройки);
КонецЕсли;

// Затем загружаем пользовательские фильтры
Если ТипЗнч(ПользовательскиеНастройки) = Тип("ПользовательскиеНастройкиКомпоновкиДанных") Тогда
    Компоновщик.ЗагрузитьПользовательскиеНастройки(ПользовательскиеНастройки);
КонецЕсли;

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

Решение 2: Использование программного интерфейса БСП (Рекомендуется)

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


// Получаем полные данные варианта через API БСП
ДанныеВарианта = ВариантыОтчетов.НастройкиВарианта(ВариантОтчета);

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

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

Преимущество этого метода в том, что БСП берет на себя проверку прав доступа и корректность распаковки данных из хранилищ. Обратите внимание: если вы используете этот метод в регламентном задании, убедитесь, что вариант отчета доступен пользователю, под которым запущена служба (авторство варианта или общая видимость).

Пошаговая реализация вывода данных в Таблицу Значений

Теперь, когда мы выяснили, как получить настройки, соберем полный цикл формирования данных в ТаблицуЗначений. Это часто требуется для последующей выгрузки в Excel или формирования собственных аналитических таблиц.


// 1. Инициализация схемы и настроек
СКД = Отчеты.ИМЯОТЧЕТА.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
Компоновщик = Новый КомпоновщикНастроекКомпоновкиДанных;
Компоновщик.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СКД));

// 2. Загрузка настроек (используем ранее изученный метод)
ДанныеВарианта = ВариантыОтчетов.НастройкиВарианта(ВариантОтчета);
Компоновщик.ЗагрузитьНастройки(ДанныеВарианта.Настройки);
Компоновщик.ЗагрузитьПользовательскиеНастройки(ДанныеВарианта.ПользовательскиеНастройки);

// 3. Получение эффективных настроек для компоновщика макета
// Важно: берем именно через ПолучитьНастройки()!
ЭффективныеНастройки = Компоновщик.ПолучитьНастройки();

// 4. Компоновка макета
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СКД, ЭффективныеНастройки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));

// 5. Инициализация процессора компоновки
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);

// 6. Вывод результата в таблицу значений
ДанныеТЗ = Новый ТаблицаЗначений;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ПроцессорВывода.УстановитьОбъект(ДанныеТЗ);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);

// Теперь ДанныеТЗ содержат результат с учетом всех фильтров пользователя

Почему ХранилищеПользовательскихНастроек может быть пустым?

Разберем ситуацию, на которую часто жалуются разработчики: попытка получить данные через системное хранилище ХранилищеПользовательскихНастроекОтчетов.Выбрать() возвращает пустой результат. Это происходит потому, что в типовых конфигурациях 1С (УТ, ERP) это хранилище используется только как временный буфер для текущих изменений на форме. Как только пользователь нажимает кнопку «Сохранить вариант», настройки перемещаются в справочник ВариантыОтчетов. Следовательно, искать их нужно именно там, как мы рассмотрели выше.

Особенности работы в регламентных заданиях

Проанализируем ситуацию, когда этот код выполняется на сервере в рамках регламентного задания. Здесь нас могут подстерегать две сложности:

  1. Права доступа (RLS): Если вариант отчета помечен как «Личный», регламентное задание, работающее под системной учетной записью, может его «не увидеть». Рекомендуется использовать для автоматических выгрузок варианты с общим доступом.
  2. Параметры сеанса: Некоторые отчеты СКД используют параметры сеанса (например, ТекущийПользователь). При запуске в фоне эти параметры могут быть не инициализированы, что приведет к ошибке формирования. В таком случае параметры нужно устанавливать программно в объекте ЭффективныеНастройки.ПараметрыДанных.

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

← На главную