1С СКД. Программный запуск отчета с открытием и настройкой.

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

Открытие формы отчета с помощью ПолучитьФорму и расширения формы отчета.

Сначала получаем форму.

Если отчет хранится в базе тогда выполняем на клиенте код:

Форма = ПолучитьФорму("Отчет.<Отчет>.Форма");

Иначе

Отчет = ВнешниеОтчеты.Создать("ПутьКОтчету");
Форма = Отчет.ПолучитьФорму("ИмяФормы");

Если нужен не «вариант по умолчанию»

Форма.УстановитьТекущийВариант("<КлючВарианта>");

Далее получаем настройки:

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

Через серверный вызов получаем настройки и если нужно заполняем параметры Компоновщика в отдельной процедуре.

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

Загружаем измененные настройки в компоновщик

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

Формируем отчет

Форма.СкомпоноватьРезультат();

Открываем форму

Форма.Открыть();

Открытие формы отчета с помощью ОткрытьФорму и расширения формы отчета.

Код выполняется на клиенте, сначала мы формируем структуру с необходимыми параметрами формы, а потом вызываем процедуру открытия. Часто используемые параметры в данном случае это:

  1. СформироватьПриОткрытии — нужен чтобы отчет открылся сразу сформированным.
  2. Отбор — Устанавливает отбор на результат СКД.
  3. КлючВарианта — Имя варианта настроек для отчетов с несколькими вариантами.

Пример:

УсловияОтбора = Новый Структура("<ИмяПоля>",<ЗначениеОтбора>);
ПараметрыФормы = Новый Структура("Отбор, СформироватьПриОткрытии,КлючВарианта", УсловияОтбора, Истина, <КлючВарианта>);
ОткрытьФорму("Отчет.<Отчет>.Форма", ПараметрыФормы);

Программный вывод СКД в табличный документ и таблицу значений.

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

Код выполняется на сервере.

Получение локального макета

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

Получение макета произвольного отчета

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

Получение макета во внешней обработке

Обработка =  РеквизитФормыВЗначение("Объект");
СхемаКомпоновкиДанных = Обработка.ПолучитьМакет(<ИмяМакета>);

Получение макета из внешней обработки или отчета

Обработка = ВнешниеОбработки.Создать("ПутьКОбработке");
СхемаКомпоновкиДанных = Обработка.ПолучитьМакет("ИмяМакета");

или

Отчет = ВнешниеОтчеты.Создать("ПутьКОтчету");
СхемаКомпоновкиДанных = Отчет.ПолучитьМакет("ИмяМакета");

Далее мы получаем настройки. Настройки СКД могут быть взяты из разных источников. Мы можем их получить из самой СКД:

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

Мы можем создать новый компоновщик настроек на основе схемы и получить настройки из него.

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

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

//В процедуре формы ПриСозданииНаСервере()
URLСхемы = ПоместитьВоВременноеХранилище(СхемаКомпоновкиДанных, Новый УникальныйИдентификатор());
ИсточникНастроек = Новый ИсточникДоступныхНастроекКомпоновкиДанных(URLСхемы);
КомпоновщикНастроекРеквизитФормы.Инициализировать(ИсточникНастроек);
КомпоновщикНастроекРеквизитФормы.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию);

И когда будем формировать

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

Далее программно заполняем параметры Компоновщика. Об этом подробно в разделе 4 .

Объявляем создаем необходимые объекты:

ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;

Создаем макет компоновки с помощью компоновщика макета:

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

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

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

Инициализируем процессор компоновки данных

ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, ,ДанныеРасшифровки);

Создаем процессор вывода:

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

Для вывода в таблицу значений используется другой процессор вывода:

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

Запускаем процесс вывода:

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

Теперь мы можем проводить нужные операции с полученными данными.

Если вывод в таблицу значений завершился ошибкой “Не поддерживается вывод таблиц и диаграмм в универсальную коллекцию значений” значит настройки СКД не подходят для такой выгрузки, и нужно их изменить, об этом ниже.

Возможности настройки Схемы Компоновки Данных и Компоновщика Настроек СКД при программном формировании.

При программном формировании СКД как в пункте 2 у нас есть огромное количество возможностей по управлению отчетом. Опишем самые часто используемые из них.

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

СхемаКомпоновкиДанных.НаборыДанных[0].Запрос = СхемаКомпоновкиДанных.НаборыДанных[0].Запрос + " ГДЕ Не Водители.ПометкаУдаления";

Или если с добавлением нового параметра

СхемаКомпоновкиДанных.НаборыДанных[0].Запрос = СхемаКомпоновкиДанных.НаборыДанных[0].Запрос + " ГДЕ Не Водители.ПометкаУдаления = &Пометка";

Также при получении настроек можно выбрать не «настройки по умолчанию», а один из вариантов настроек.

Настройки = СхемаКомпоновкиДанных.ВариантыНастроек[0].Настройки;

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

Параметры

Все параметры создаются при создании исходного отчета, исключение если параметр был добавлен при редактировании запроса. Значение существующего параметра устанавливается следующим образом:

Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("<ИмяПараметра>",<ЗначениеПараметра>);

Добавление параметра делается следующим образом

СтрПараметр = Настройки.ПараметрыДанных.Элементы.Добавить();
СтрПараметр.Параметр = Новый ПараметрКомпоновкиДанных("<ИмяПараметра>");
СтрПараметр.Значение = <ЗначениеПараметра>;
СтрПараметр.Использование = Истина;

Отбор

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

ПолеПоиска = Новый ПолеКомпоновкиДанных("<ИмяПоля>");
Найден = Ложь;
Для Каждого Элемент Из Настройки.Отбор.Элементы Цикл
 Если Элемент.ЛевоеЗначение = ПолеПоиска Тогда
   Элемент.ПравоеЗначение = <ЗначениеОтбора>;
   Элемент.Использование = Истина;
   Найден = Истина;
   Прервать;
 КонецЕсли;
КонецЦикла;
Если Не Найден Тогда
 Если Настройки.Отбор.ДоступныеПоляОтбора.Элементы.Найти("<ИмяПоля>") <> Неопределено Тогда
   НовыйОтбор = Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
   НовыйОтбор.ЛевоеЗначение = ПолеПоиска;
   НовыйОтбор.ПравоеЗначение = <ЗначениеОтбора>;
   НовыйОтбор.Использование = Истина;
 КонецЕсли;
КонецЕсли;

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

Структура

Для адаптации отчета к выводу в таблицу значений нужно очистить структуру группировок отчета и создать поле группировки “Детальные записи”.

Настройки.Структура.Очистить();  
СтрГруппировка = Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
СтрГруппировка.Использование = Истина;
СтрГруппировка.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
СтрГруппировка.Порядок.Элементы.Добавить(Тип("АвтоЭлементПорядкаКомпоновкиДанных"));

Резюме

Система компоновки данных была создана для ускорения разработки отчетов и упрощения работы пользователей. Программные изменения помогают усилить этот эффект. Программист может создать выгрузки и по сути свои отчеты на основании типовых отчетов. К примеру, выгрузка заработной платы в управленческую базу. Структура базы может сильно изменена, но поля в отчете “Расчетная ведомость Т-51” будут называться так же, и сам отчет вряд ли переименуется. Да и если что-то переименуется — выгрузку исправить будет очень просто.

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

Приведенные примеры кода были протестированы на платформе 1С:Предприятие 8.3 (8.3.13.1690).

Comments

So empty here ... leave a comment!

Добавить комментарий

Sidebar