Андрей Смирнов
Время чтения: ~8 мин.
Просмотров: 40

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

СКД

Очень часто встречаю что программистов заводит в тупик такой момент как программная установка параметров системы компоновки данных (далее СКД). Сделать это можно через ‘КомпоновщикНастроек’ нашей СКД.

Допустим у нас есть отчет ‘ЗадачиКлиента’ и в СКД в наборе данных есть параметр ‘&Владелец’. Сразу уточню что это отчет реализован через 1C Enterprise Development Tools, но решения здесь будут точно такие же, как если бы мы это делали через классический конфигуратор:

izobrazhenie-1.png
Набора данных СКД.

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

izobrazhenie-2.png
СКД. Ограничение доступности.

И так что бы программно установить параметру СКД определенное значение, мы можем использовать процедуру модуля отчета ‘ПриКомпоновкеРезультата’ и компоновщиком настроек:

Практически аналогично поступаем и в модуле формы отчета, но там для того что бы получить компоновщик настроек, нам придется обратится к основному реквизиту формы ‘Отчет’:

izobrazhenie-3.png
Реквизит формы отчета на СКД ‘Отчет’.

Программный код будет почти аналогичным предыдущему за счет пары нюансов:

Так же можно использовать и другую конструкцию при установке параметров СКД:

И напоследок. Прежде чем писать какой-то свой код, убедитесь, что до вас его уже не написали:

izobrazhenie-5.png
УстановитьЗначениеПараметраКомпоновщика.

Всем удачи и простой разработки отчетов на СКД!

2+

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

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

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

Иначе

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

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

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

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

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

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

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

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

Пример:

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

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

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

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

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

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

или

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Параметры

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

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

Отбор

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

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

Структура

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

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

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

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


/// Запускается "ПриСоздании на сервереФункция УстановитьНастройкиСервис() СКД = Отчеты.Выработка.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");  Поле = СКД.ВычисляемыеПоля.Добавить(); Поле.ПутьКДанным ="ЗаказНаряд.payer"; Поле.Заголовок ="payer"; Поле.Выражение ="Выбор   |Когда ЗаказНаряд.ВидРемонта.КодВыгрузки = ""КР""   |Тогда ""Клиент""   |Иначе """"   |Конец";  Поле = СКД.ВычисляемыеПоля.Добавить(); Поле.ПутьКДанным ="ЗаказНаряд.product_type"; Поле.Заголовок ="product_type"; Поле.Выражение ="Выбор   |Когда ЗаказНаряд.ВидРемонта.КодВыгрузки = ""КР""   |Тогда ""Клиент""   |Иначе """"   |Конец";  Поле = СКД.ВычисляемыеПоля.Добавить(); Поле.ПутьКДанным ="ЗаказНаряд.order_type"; Поле.Заголовок ="order_type"; Поле.Выражение ="Выбор   |Когда ЗаказНаряд.ВидРемонта.КодВыгрузки = """"   |Тогда ""Укажите код выгрузки для вида ремонта "" + ЗаказНаряд.ВидРемонта.Наименование   |Иначе ЗаказНаряд.ВидРемонта.КодВыгрузки   |Конец";  Поле = СКД.ВычисляемыеПоля.Добавить(); Поле.ПутьКДанным ="ЗаказНаряд._date"; Поле.Заголовок ="date"; Поле.Выражение ="НАЧАЛОПЕРИОДА(ЗаказНаряд.Дата,""ДЕНЬ"")";  Поле = СКД.ВычисляемыеПоля.Добавить(); Поле.ПутьКДанным ="ЗаказНаряд.order_number"; Поле.Заголовок ="order_number"; Поле.Выражение ="Выбор   |Когда ПОДСТРОКА(ЗаказНаряд.Номер,4,1) <> ""0""   |Тогда ПОДСТРОКА(ЗаказНаряд.Номер,4,7)   | Когда ПОДСТРОКА(ЗаказНаряд.Номер,5,1) <> ""0""   |Тогда ПОДСТРОКА(ЗаказНаряд.Номер,5,6)   | Когда ПОДСТРОКА(ЗаказНаряд.Номер,6,1) <> ""0""   |Тогда ПОДСТРОКА(ЗаказНаряд.Номер,6,5)   | Когда ПОДСТРОКА(ЗаказНаряд.Номер,7,1) <> ""0""   |Тогда ПОДСТРОКА(ЗаказНаряд.Номер,7,4)   | Когда ПОДСТРОКА(ЗаказНаряд.Номер,8,1) <> ""0""   |Тогда ПОДСТРОКА(ЗаказНаряд.Номер,8,3)   | Когда ПОДСТРОКА(ЗаказНаряд.Номер,9,1) <> ""0""   |Тогда ПОДСТРОКА(ЗаказНаряд.Номер,9,2)   | Когда ПОДСТРОКА(ЗаказНаряд.Номер,10,1) <> ""0""   |Тогда ПОДСТРОКА(ЗаказНаряд.Номер,10,1)   |Конец";  Поле = СКД.ВычисляемыеПоля.Добавить(); Поле.ПутьКДанным ="Отметка"; Поле.Заголовок ="Отметка"; Поле.Выражение ="НЕ ЗаказНаряд.ВидРемонта.КодВыгрузки = """"";   АдресСхемыКомпоновкиДанных = ПоместитьВоВременноеХранилище(СКД,Новый УникальныйИдентификатор); КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемыКомпоновкиДанных)); КомпоновщикНастроек.ЗагрузитьНастройки(СКД.НастройкиПоУмолчанию); СтруктураПолей =Новый Структура("Отметка, ЗаказНаряд, ВидРемонта, Автомобиль|,vin|,date|,order_number|,work_total|,parts_total|,order_Type|,mileage|,payer|,product_type","Отметка","ЗаказНаряд","ЗаказНаряд.ВидРемонта","Автомобиль","Автомобиль.VIN","ЗаказНаряд._date","ЗаказНаряд.order_number","СуммаРабот","СуммаНоменклатуры","ЗаказНаряд.order_type","ЗаказНаряд.Пробег","ЗаказНаряд.payer","ЗаказНаряд.product_type");  Настройки = КомпоновщикНастроек.Настройки;      УдалитьСтандартныеНастройки(Настройки);  Группировка = Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных")); Группировка.Использование =Истина;ДляКаждого КиЗ ИЗ СтруктураПолей Цикл ВыбранноеПоле = Группировка.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных")); ВыбранноеПоле.Заголовок = КиЗ.Ключ; ВыбранноеПоле.Использование =Истина; ВыбранноеПоле.Поле =Новый ПолеКомпоновкиДанных(КиЗ.Значение);КонецЦикла;  Группа = Настройки.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных")); Группа.ТипГруппы  = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ;  ЭлементОтбора = Группа.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ЭлементОтбора.ЛевоеЗначение =Новый ПолеКомпоновкиДанных("Автомобиль"); ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.ВИерархии; ЭлементОтбора.ПравоеЗначение = Справочники.Автомобили.НайтиПоКоду("ЦБ00000002");  ЭлементОтбора = Группа.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ЭлементОтбора.ЛевоеЗначение =Новый ПолеКомпоновкиДанных("Автомобиль.VIN"); ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.НеНачинаетсяС; ЭлементОтбора.ПравоеЗначение ="1N"; ЭлементОтбора.Использование =Ложь;  ЭлементОтбора = Группа.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ЭлементОтбора.ЛевоеЗначение =Новый ПолеКомпоновкиДанных("Автомобиль.VIN"); ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Заполнено;  ЭлементОтбора = Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));  ЭлементОтбора.ЛевоеЗначение =Новый ПолеКомпоновкиДанных("ПодразделениеКомпании"); ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.НеВСпискеПоИерархии; СписокПодразделений =Новый СписокЗначений; СписокПодразделений.Добавить(Справочники.ПодразделенияКомпании.НайтиПоКоду("ЦБ000014")); СписокПодразделений.Добавить(Справочники.ПодразделенияКомпании.НайтиПоКоду("ЦБ000021")); ЭлементОтбора.ПравоеЗначение = СписокПодразделений;  ЭлементОтбора = Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));  ЭлементОтбора.ЛевоеЗначение =Новый ПолеКомпоновкиДанных("Поставщик"); ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ЭлементОтбора.ПравоеЗначение = Справочники.Контрагенты.НайтиПоКоду("ЦБ011454"); ЭлементОтбора.Использование =Ложь;  ЭлементОтбора = Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));  ЭлементОтбора.ЛевоеЗначение =Новый ПолеКомпоновкиДанных("ЗаказНаряд.Состояние"); ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ЭлементОтбора.ПравоеЗначение = Справочники.ВидыСостоянийЗаказНарядов.Закрыт;  ЭлементПорядка = Настройки.Порядок.Элементы.Добавить(Тип("ЭлементПорядкаКомпоновкиДанных")); ЭлементПорядка.ТипУпорядочивания = НаправлениеСортировкиКомпоновкиДанных.Возр; ЭлементПорядка.Поле =Новый ПолеКомпоновкиДанных("ЗаказНаряд._date");КонецФункции/// Запускается пользователемФункция СформироватьДанныеВыработки()Экспорт  тзРезультат = ВыполнитьСКД(СКД, КомпоновщикНастроек);  тзРезультат.Свернуть("Отметка, ЗаказНаряд, ВидРемонта, Автомобиль,vin,date,order_number,order_Type,payer,mileage,product_type","work_total,parts_total"); тзРезультат.Сортировать("date");Возврат тзРезультат;КонецФункцииФункция ВыполнитьСКД(текСКД, текКомпоновщик) КомпоновщикМакета =Новый КомпоновщикМакетаКомпоновкиДанных;Если текКомпоновщик.Настройки.ПараметрыДанных.ДоступныеПараметры.Элементы.Найти("ДатаНачала")<>НеопределеноТогда текКомпоновщик.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("ДатаНачала", НачалоМесяца(Дата));КонецЕсли;Если текКомпоновщик.Настройки.ПараметрыДанных.ДоступныеПараметры.Элементы.Найти("ДатаОкончания")<>НеопределеноТогда текКомпоновщик.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("ДатаОкончания", КонецДня(Дата));КонецЕсли;Если текКомпоновщик.Настройки.ПараметрыДанных.ДоступныеПараметры.Элементы.Найти("ДатаОтчета")<>НеопределеноТогда текКомпоновщик.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("ДатаОтчета", КонецДня(Дата));КонецЕсли;  МакетКомпоновки = КомпоновщикМакета.Выполнить(текСКД, текКомпоновщик.Настройки,,,Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));  ПроцессорКомпоновкиДанных =Новый ПроцессорКомпоновкиДанных; ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки,,);  тзРезультат =Новый ТаблицаЗначений; ПроцессорВывода =Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений; ПроцессорВывода.УстановитьОбъект(тзРезультат); ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);ДляКаждого Колонка ИЗ тзРезультат.Колонки ЦиклПОПЫТКА//На случай, если заголовок с пробелом и т.п. Колонка.Имя = Колонка.Заголовок;ИСКЛЮЧЕНИЕКОНЕЦПОПЫТКИ;КонецЦикла;Возврат тзРезультат;КонецФункции

</pre>

Код раскрашен тут

Используемые источники:

  • https://craft1c.ru/skd-ustanovit-parametry-programmno/
  • https://wiki.programstore.ru/1s-skd-programmnyj-zapusk-otcheta-s-otkrytiem-i-nastrojkoj/
  • https://dsite.kz/skd-soft-edit/

Рейтинг автора
5
Подборку подготовил
Максим Уваров
Наш эксперт
Написано статей
171
Ссылка на основную публикацию
Похожие публикации