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

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

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

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

Решение для конфигураций на обычных формах (на примере УТ 10.3)

Проанализируем ситуацию, когда разработка ведется в исторической конфигурации, такой как «Управление торговлей 10.3». Большинство отчетов здесь построены на базе механизма УниверсальныйОтчет и используют построитель отчетов платформы 1С.

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

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


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	СохраненныеНастройки.Пользователь КАК Пользователь,
    |	СохраненныеНастройки.НаименованиеНастройки КАК НаименованиеНастройки,
    |	СохраненныеНастройки.СохраненнаяНастройка КАК ДанныеНастройки
    |ИЗ
    |	РегистрСведений.СохраненныеНастройки КАК СохраненныеНастройки
    |ГДЕ
    |	СохраненныеНастройки.ИмяОбъекта = &ИмяОбъекта";

Запрос.УстановитьПараметр("ИмяОбъекта", "Отчет.Продажи"); // Укажите имя нужного отчета
ТаблицаНастроек = Запрос.Выполнить().Выгрузить();

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

После того как пользователь отметил галочками интересующие его настройки, нам необходимо применить их к объекту отчета и сформировать его. Разберем этот процесс по шагам:


Для Каждого СтрокаНастройки Из ТаблицаНастроек Цикл
    Если НЕ СтрокаНастройки.Пометка Тогда // Пометка — колонка с флажком на форме
        Продолжить;
    КонецЕсли;
    
    // Создаем объект отчета программно
    ОтчетОбъект = Отчеты.Продажи.Создать();
    
    // Извлекаем структуру параметров из Хранилища Значения
    СтруктураНастроек = СтрокаНастройки.ДанныеНастройки.Получить();
    
    Если ТипЗнч(СтруктураНастроек) = Тип("Структура") Тогда
        // Загружаем настройки в универсальный отчет
        ОтчетОбъект.УниверсальныйОтчет.УстановитьНастройки(СтруктураНастроек);
    КонецЕсли;
    
    // Формируем результат в Табличный документ
    ТабДок = Новый ТабличныйДокумент;
    ОтчетОбъект.СформироватьОтчет(ТабДок);
    
    // Сохраняем или выводим полученный результат
    ТабДок.Показать(СтрокаНастройки.НаименованиеНастройки);
КонецЦикла;

Решение для современных конфигураций и СКД (Управляемые формы)

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

Для работы с вариантами отчетов и пользовательскими настройками используются объекты:

Рассмотрим, как получить список всех вариантов настроек конкретного СКД-отчета программно:


ИмяОтчета = "Отчет.ВыручкаИСебестоимостьПродаж";
СписокВариантов = ХранилищеВариантовОтчетов.ПолучитьСписок(ИмяОтчета);

Для Каждого Вариант Из СписокВариантов Цикл
    // Вариант.Значение содержит уникальный КлючНастройки
    // Вариант.Представление содержит понятное название настройки для пользователя
    Сообщить("Найдена настройка: " + Вариант.Представление + " [Ключ: " + Вариант.Значение + "]");
КонецЦикла;

Для применения выбранной пользователем настройки к отчету на СКД выполним следующую последовательность действий:


КлючНастройки = "ИмяВыбранногоВарианта"; // Получаем из выбранной строки списка
ОтчетОбъект = Отчеты[ИмяОтчета].Создать();

// Загружаем настройки из системного хранилища
Настройки = ХранилищеВариантовОтчетов.Загрузить(ИмяОтчета, КлючНастройки);

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

Особенности пакетного формирования на сервере (в регламентных заданиях)

Если заказчик просит перевести пакетное формирование в регламентное задание (например, чтобы отчеты формировались автоматически в 6:00 утра и к началу рабочего дня уже лежали готовыми на сервере), необходимо учитывать важные архитектурные ограничения:

  1. Отсутствие интерактивного контекста: На сервере в фоновом режиме нельзя использовать методы ПолучитьФорму() или ОткрытьФорму(). Код инициализации и вывода отчета должен выполняться полностью в фоновом режиме («headless» режим).
  2. Инициализация макета компоновки: При работе с СКД на сервере необходимо вручную инициализировать процессоры компоновки и вывода данных.

Посмотрим на пример правильного серверного вывода СКД-отчета в файл xlsx на диске:


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

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

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

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

// Сохраняем готовый отчет на сервере
ПутьКФайлу = "C:\Reports\DailyReport_" + Формат(ТекущаяДата(), "ДФ=yyyyMMdd") + ".xlsx";
ТабличныйДокумент.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX);

Использование готовых механизмов БСП (Библиотека стандартных подсистем)

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

Рассылка отчетов в БСП работает следующим образом:

Использование этого стандартного механизма БСП существенно экономит время разработки и гарантирует стабильную работу регламентных процедур при обновлениях конфигурации.

← На главную