В процессе работы с базами данных 1С у пользователей часто возникает потребность автоматизировать рутинные операции. Типичный сценарий: один опытный сотрудник («умный пользователь») тщательно настраивает комплексные отчеты (задает сложные отборы, группировки, сортировки и условное оформление), а остальные сотрудники должны ежедневно формировать эти отчеты пакетом, не тратя время на ручную настройку. Еще более продвинутый шаг — перевести эту задачу на автоматическое выполнение по расписанию (в регламентные задания).
В этой статье мы подробно разберем, как программно перехватить сохраненные настройки пользователей, вывести их в интерактивную таблицу в виде списка с флажками и выполнить пакетное формирование отчетов в фоновом или интерактивном режиме.
Проанализируем ситуацию, когда разработка ведется в исторической конфигурации, такой как «Управление торговлей 10.3». Большинство отчетов здесь построены на базе механизма УниверсальныйОтчет и используют построитель отчетов платформы 1С.
Выясним, где именно хранятся настройки пользователей в таких конфигурациях. В отличие от современных решений на базе управляемых форм, в УТ 10.3 данные настроек записываются в специализированный регистр сведений СохраненныеНастройки. Этот регистр имеет следующие ключевые измерения и ресурсы:
"Отчет.Продажи");ХранилищеЗначения, внутри которого находится сериализованная структура со всеми параметрами (отборы, колонки, показатели).Для того чтобы вывести список доступных настроек в нашу обработку, напишем запрос к этому регистру сведений. Рассмотрим пример кода:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СохраненныеНастройки.Пользователь КАК Пользователь,
| СохраненныеНастройки.НаименованиеНастройки КАК НаименованиеНастройки,
| СохраненныеНастройки.СохраненнаяНастройка КАК ДанныеНастройки
|ИЗ
| РегистрСведений.СохраненныеНастройки КАК СохраненныеНастройки
|ГДЕ
| СохраненныеНастройки.ИмяОбъекта = &ИмяОбъекта";
Запрос.УстановитьПараметр("ИмяОбъекта", "Отчет.Продажи"); // Укажите имя нужного отчета
ТаблицаНастроек = Запрос.Выполнить().Выгрузить();
Полученную таблицу значений мы можем легко вывести на форму обработки, добавив колонку с типом Булево (флажок) для выбора нужных вариантов пользователем.
После того как пользователь отметил галочками интересующие его настройки, нам необходимо применить их к объекту отчета и сформировать его. Разберем этот процесс по шагам:
Для Каждого СтрокаНастройки Из ТаблицаНастроек Цикл
Если НЕ СтрокаНастройки.Пометка Тогда // Пометка — колонка с флажком на форме
Продолжить;
КонецЕсли;
// Создаем объект отчета программно
ОтчетОбъект = Отчеты.Продажи.Создать();
// Извлекаем структуру параметров из Хранилища Значения
СтруктураНастроек = СтрокаНастройки.ДанныеНастройки.Получить();
Если ТипЗнч(СтруктураНастроек) = Тип("Структура") Тогда
// Загружаем настройки в универсальный отчет
ОтчетОбъект.УниверсальныйОтчет.УстановитьНастройки(СтруктураНастроек);
КонецЕсли;
// Формируем результат в Табличный документ
ТабДок = Новый ТабличныйДокумент;
ОтчетОбъект.СформироватьОтчет(ТабДок);
// Сохраняем или выводим полученный результат
ТабДок.Показать(СтрокаНастройки.НаименованиеНастройки);
КонецЦикла;
В современных конфигурациях на платформе 1С 8.3, использующих Систему компоновки данных (СКД), хранение настроек реализовано принципиально иначе — через стандартные системные хранилища настроек. Платформа предоставляет разработчику прямой доступ к этим хранилищам через глобальный контекст.
Для работы с вариантами отчетов и пользовательскими настройками используются объекты:
ХранилищеВариантовОтчетов — хранит предопределенные и созданные пользователями глобальные варианты;ХранилищеПользовательскихНастроекОтчетов — управляет быстрыми персональными настройками (выбранными элементами, текущими отборами на форме).Рассмотрим, как получить список всех вариантов настроек конкретного СКД-отчета программно:
ИмяОтчета = "Отчет.ВыручкаИСебестоимостьПродаж";
СписокВариантов = ХранилищеВариантовОтчетов.ПолучитьСписок(ИмяОтчета);
Для Каждого Вариант Из СписокВариантов Цикл
// Вариант.Значение содержит уникальный КлючНастройки
// Вариант.Представление содержит понятное название настройки для пользователя
Сообщить("Найдена настройка: " + Вариант.Представление + " [Ключ: " + Вариант.Значение + "]");
КонецЦикла;
Для применения выбранной пользователем настройки к отчету на СКД выполним следующую последовательность действий:
КлючНастройки = "ИмяВыбранногоВарианта"; // Получаем из выбранной строки списка
ОтчетОбъект = Отчеты[ИмяОтчета].Создать();
// Загружаем настройки из системного хранилища
Настройки = ХранилищеВариантовОтчетов.Загрузить(ИмяОтчета, КлючНастройки);
Если Настройки <> Неопределено Тогда
// Загружаем полученные настройки в компоновщик настроек отчета
ОтчетОбъект.КомпоновщикНастроек.ЗагрузитьНастройки(Настройки);
КонецЕсли;
Если заказчик просит перевести пакетное формирование в регламентное задание (например, чтобы отчеты формировались автоматически в 6:00 утра и к началу рабочего дня уже лежали готовыми на сервере), необходимо учитывать важные архитектурные ограничения:
ПолучитьФорму() или ОткрытьФорму(). Код инициализации и вывода отчета должен выполняться полностью в фоновом режиме («headless» режим).Посмотрим на пример правильного серверного вывода СКД-отчета в файл xlsx на диске:
// Инициализируем схему и настройки
СхемаКомпоновкиДанных = ОтчетОбъект.СхемаКомпоновкиДанных;
НастройкиКомпоновщика = ОтчетОбъект.КомпоновщикНастроек.ПолучитьНастройки();
// Создаем макет компоновки
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, НастройкиКомпоновщика);
// Инициализируем процессор компоновки данных
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
// Выводим результат в табличный документ
ТабличныйДокумент = Новый ТабличныйДокумент;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ТабличныйДокумент);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
// Сохраняем готовый отчет на сервере
ПутьКФайлу = "C:\Reports\DailyReport_" + Формат(ТекущаяДата(), "ДФ=yyyyMMdd") + ".xlsx";
ТабличныйДокумент.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX);
Перед тем как приступать к написанию собственной обработки «с нуля», обязательно проверьте версию вашей конфигурации. Если ваша информационная база построена на современных версиях БСП (например, УТ 11, Комплексная автоматизация 2 или ERP), в системе уже присутствует мощнейший готовый инструмент, который решает эту задачу без единой строчки кода. Этот инструмент называется «Рассылка отчетов».
Рассылка отчетов в БСП работает следующим образом:
Рассылки отчетов;Использование этого стандартного механизма БСП существенно экономит время разработки и гарантирует стабильную работу регламентных процедур при обновлениях конфигурации.