1с скд таблица значений как параметр
Перейти к содержимому

1с скд таблица значений как параметр

  • автор:

Пример использования внешнего источника данных в СКД

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

Изображение

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

Рассмотрим поэтапное создание подобного отчета и с помощью внешнего набора данных построим его на системе компоновки данных.

Читаем журнал регистрации

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

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

Для получения информации из журнала регистрации будем использовать метод глобального контекста «ВыгрузитьЖурналРегистрации()». В событии «ПриКомпоновкеРезультата» созданного отчета добавим следующий программный код:

Первый параметр метода «ВыгрузитьЖурналРегистрации» устанавливает таблицу значений, в которую будет выгружен результат выборки из журнала регистрации. Второй параметр устанавливаем фильтр на выбираемые записи. Филтр представляет собой структуру, ключи в котором — это поля, по которым устанавливается отбор. Мы используем поля «ДатаНачала» и «ДатаОкончания» для установки периода анализа журнала регистрации, а также поле «Событие», в который передаем массив строк (наименований событий). Добавленные в массив события соответствуют действиям на данными в базе.

Подробнее о использовании метода «ВыгрузитьЖурналРегистрации» Вы можете прочитать в синтаксис-помощнике.

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

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

1) Создать набор данных в схеме компоновки и задать его поля.Изображение2) В программный код модуля «ПриКомпоновкеРезультата» прописать передачу таблицы значений в СКД.

3) Настраиваем ресурсы и структуру отчета (подробнее смотри в файле отчета, ссылка на который дана в конце статьи).

На этом настройки отчета завершены и мы можем запустить его в режиме предприятия.

Внешний источник данных в СКД позвляет использовать в отчетах данные практически из любых источников, влючая те, данные которых мы не сможем получить запросами.

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

Скачать отчет из примера Вы можете по следующей ссылке .

Интересный вопрос по СКД — передача таблицы значения в качестве параметра?

Передаю в качестве параметра таблицу значения, все хорошо в таком коде:

ВЫБРАТЬ
Остатки.Склад,
ИЗ
РегистрНакопления.Остатки.Остатки КАК Остатки
ГДЕ
ОстаткиОстатки.Склад В(&Склад)

но все плохо в таком:

ВЫБРАТЬ
Остатки.Склад
ПОМЕСТИТЬ Таб
ИЗ
&Склад КАК Остатки
;

ВЫБРАТЬ
Таб.Склад
ИЗ
Таб КАК Таб

т.е. в СКД можно в качестве параметра передать таблицу только для использования в качестве фильтра в "ГДЕ"?
Или её все же можно как то использовать и в качестве источника запроса?

1с скд таблица значений как параметр

Создание нового внешнего отчета

Открываем модуль объекта и создаем предопределенную процедуру ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)

Создание предопределенной процедуры

Внутри этой процедуры будем собирать данные и формировать отчет.
В процедуре ПриКомпоновкеРезультата отключаем стандартную обработку. СтандартнаяОбработка = Ложь;
Затем формируем таблицу значений произвольным образом. Имена колонок таблицы значений должны совпадать с будущими полями набора данных в СКД.:

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

  • Из схемы получаем настройки по умолчанию.
  • В соответствующую переменную отправляем данные о расшифровке.
  • Формируем макет с помощью компоновщика макета.
  • Передаём в макет компоновки схему, настройки и данные расшифровки.
  • Выполняем компоновку с помощью процессора компоновки. Для этого выполняем метод процессора компоновки данных Инициализировать(). В качестве параметров передаём макет компоновки данных, внешние наборы данных (тип: Структура, ключ структуры должен совпадать с именем объекта в схеме компоновки данных , значение — сформированная таблица значений), данные расшифровки.
  • Очищаем поле табличного документа.
  • Выводим результат в табличный документ.

Добавление нового макета СКД

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

Создание набора данных и полей отчета СКД

Добавляем ресурсы, если это необходимо. По ним будут считаться итоги. В нашем случае это поля Количество и Сумма.

Добавление ресурсов набора данных СКД

В закладке Настройки с помощью конструктора настроек формируем вариант отчета по умолчанию

Настройка варианта отчета СКД

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

Пример отчета СКД с данными из таблицы значений
Вот и все. Достаточно просто, не правда ли?

Работа с внешними наборами данных в СКД

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

1. Настройка схемы компоновки данных.

1.1. Создаём основную схему компоновки данных.

Добавление набора данных - запрос

Создание запроса

1.2. На закладке «Наборы данных» добавляем набор данных — объект.

Добавление набора данных - объект

1.3. Добавляем необходимые поля набора данных (достаточно указать Поле) и указываем Имя объекта, содержащего данные.

Заполнение реквизитов набора данных - объект

1.4. Если в СКД есть другие наборы данных (например, Запрос), то создаём связи наборов данных на закладке «Связи наборов данных».

Создание связи наборов данных

1.5. Настраиваем вывод отчёта нужным образом.

Настройки СКД

2. Программный вывод отчёта.

2.1. В модуле объекта отчёта создаём процедуру-обработчик ПриКомпоновкеРезультата.

Создание процедуры ПриКомпоновкеРезультата

2.2. В процедуре ПриКомпоновкеРезультата отключаем стандартную обработку.

2.3. Формируем таблицу значений произвольным образом. Имена колонок таблицы значений должны совпадать с полями набора данных в СКД (п.1.3).

2.4. Получаем схему компоновки данных из макета.

2.5. Из схемы получаем настройки по умолчанию.

2.6. Помещаем данные о расшифровке в соответствующую переменную.

2.7. Формируем макет с помощью компоновщика макета.

2.8. Передаём в макет компоновки схему, настройки и данные расшифровки.

2.9. Выполняем компоновку с помощью процессора компоновки. Для этого выполняем метод процессора компоновки данных Инициализировать(). В качестве параметров передаём макет компоновки данных, внешние наборы данных (тип: Структура, ключ структуры должен совпадать с именем объекта в схеме компоновки данных (п.1.3), значение — сформированная таблица значений), данные расшифровки.

2.10. Очищаем поле табличного документа.

2.11. Выводим результат в табличный документ.

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

Пример сформированного отчёта:

Отчёт на СКД с использованием внешнего набора данных

Справочная информация из синтакс-помощника:

Пример использования внешних наборов данных в СКД (для УТ 10.3)

Комментарии

Обычный Александр (не проверено)

вт, 13/09/2016 — 10:25

Спасибо огромное за статью и прикреплённый пример. Очень помогло в работе.

Щукина Татьяна (не проверено)

пт, 16/12/2016 — 15:28

Спасибо — просто спасли. Только у меня Период не видит в модуле

пт, 16/12/2016 — 16:03

Можете файл отчёта выложить?

Щукина Татьяна (не проверено)

пт, 16/12/2016 — 17:14

положила все в модуль Объекта(база ЗиК 3), в СКД в Параметры добавила «Период» =стандартный период,НачалоПериода=&Период.ДатаНачала ; КонецПериода.. Не видит здесь Период и все..

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) экспорт

СтандартнаяОбработка = Ложь;
//ДанныеПечати = ПолучитьИзВременногоХранилища(Адр);
Запрос = Новый Запрос;
Запрос.Текст ;

//Запрос.УстановитьПараметр(«НачалоПериода», Период.ДатаНачала);
//Запрос.УстановитьПараметр(«КонецПериода», Период.ДатаОкончания);
НачалоПериода=Дата(«01.11.2016 00:00:00»); ;

Запрос.УстановитьПараметр(«НачалоПериода», НачалоПериода);
Запрос.УстановитьПараметр(«КонецПериода», КонецПериода);
Запрос.УстановитьПараметр(«СовмПроф», «Доплата за совм. проф. (4)»);

//Если СовмещСотрудник.Пустой() тогда
// //Сообщить(«В ЭТОЙ ГРУППЕ НЕТ КОНТРАГЕНТОВ » );
//конецесли;

Запрос = Новый Запрос;
Запрос.Текст ;
ффф= Перечисления.ГруппыНачисленияУдержанияВыплаты.Начислено ;
//Запрос.УстановитьПараметр(«НачалоПериода», Период.ДатаНачала);
//Запрос.УстановитьПараметр(«КонецПериода», Период.ДатаОкончания);
Запрос.УстановитьПараметр(«НачалоПериода», НачалоПериода);
Запрос.УстановитьПараметр(«КонецПериода»,КонецПериода);

Запрос.УстановитьПараметр(«ВидДеят», «Вид деятельности (Сотрудники)»);
Запрос.УстановитьПараметр(«ВидКат», «Категория (Сотрудники)»);
Запрос.УстановитьПараметр(«ДОП_1», «Вид з/п (Начисления)»);
Запрос.УстановитьПараметр(«ДОП_2», «Призн.н/о прибыли (Начисления))»);
Запрос.УстановитьПараметр(«ДОП_3», «Резерв отпусков (участие) (Начисления)»);
Запрос.УстановитьПараметр(«ДОП_4», «Код н/у (Начисления)»);
Запрос.УстановитьПараметр(«ДОП_5», «Фонд з/п (Начисления)»);
Запрос.УстановитьПараметр(«начисл»,ффф);

ПланВидовРЕЗ= РезультатПакета[6].Выгрузить();
ПланВидовРЕЗ.сортировать(«ПланВидовРасчетаНаименование»);

СотрРез = РезультатПакета[9].Выгрузить();
ДанныеПечати = РезультатПакета[10].Выгрузить(); //окончательный итог Сотрудник

//начисл_Сотр_подр = РезультатПакета[9].Выгрузить();
//начисл_Сотр_подр.сортировать(«Группа»);
//РезультатЗапроса.сортировать(«Группа,СпрОтрВБух_ВидДеятельности,ВидДеятельностиНАШ»);
ДанныеПечати.сортировать(«Сотрудник»);
ДанныеПечати.Колонки.Добавить(«ПодразделенияРодитель», Новый ОписаниеТипов(«строка»));
ДанныеПечати.Колонки.Добавить(«ВидДеятельностиНаш», Новый ОписаниеТипов(«строка»));

Если ДанныеПечати.Количество()=0 тогда
Сообщить(«Запрос Пустой » );
иначе
Для каждого Стр ИЗ ДанныеПечати Цикл //КОНТРАГЕНТ
если сокрЛП(Стр.НаименованиеНачисления) = «Доплата за совм. проф. (4)» тогда
СтруктураОтбор = Новый Структура();
СтруктураОтбор.Вставить(«СовмещСотрудник», Стр.Сотрудник);
СтруктураОтбор.Вставить(«СовмещСумма», Стр.Сумма);
СтруктураОтбор.Вставить(«СовмещПодразделениеОТКуда_отдел», Стр.Подразделение);

Если МассивНайденныеСтроки.Количество() > 0 Тогда
Для Каждого Ст Из МассивНайденныеСтроки Цикл
Стр.ВидДеятельностиНаш = Ст.СовмещСпособОтражения;
Если Ст.СовмещПодразделениеКуда = NULL Тогда
Счет =»»;
СубСчет =»»;
ПодразделениеСпрОтр =»»;
ВидДеятельностиСпрОтр =»»;
резЗапр = 0;

если резЗапр = 0 Тогда
ааа = «ОШИБКА нет в спр.СовмещСпособОтраженияСсылка записи = «+Ст.СовмещСпособОтраженияСсылка+» по «+Стр.Сотрудник +» cумма = «+ Стр.Сумма+» => ПодразделенияРодитель И ВидДеятельностиНаш берем из спр.Сотрудники» ;
Стр.ПодразделенияРодитель = Стр.ПодразделениеРод;
Стр.ВидДеятельностиНаш = Стр.ВидДеятельностиСотр;
иначе
Стр.ПодразделенияРодитель = ПодразделениеСпрОтр ;
Стр.ВидДеятельностиНаш = ВидДеятельностиСпрОтр;
конецесли;
иначе
Стр.ПодразделенияРодитель = Ст.СовмещПодразделениеКуда ; //это должен быть родитель подразделения
Стр.ВидДеятельностиНаш = Ст.СовмещСпособОтражения;
конецесли;
конецЦикла;
ИНАЧЕ
ааа = «ОШИБКА нет в табл.СовмещСотрРЕЗУЛЬТАТ «+Стр.Сотрудник +» cумма = «+ Стр.Сумма+» => ПодразделенияРодитель И ВидДеятельностиНаш берем из спр.Сотрудники» ;
Стр.ПодразделенияРодитель = Стр.ПодразделениеРод;
Стр.ВидДеятельностиНаш = Стр.ВидДеятельностиСотр;
конецЕсли ;
ИНАЧЕ
Стр.ПодразделенияРодитель = Стр.ПодразделениеРод;
Стр.ВидДеятельностиНаш = Стр.ВидДеятельностиСотр;
конецЕсли ;
КонецЦикла;
КонецЕсли;
ДанныеПечати.сортировать(«Сотрудник»);
//***************************************************************
//Получаем схему из макета
СхемаКомпоновкиДанных = ПолучитьМакет(«ОсновнаяСхемаКомпоновкиДанных»);

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

//Помещаем в переменную данные о расшифровке данных
ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;

//Формируем макет, с помощью компоновщика макета
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;

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

//Выполним компоновку с помощью процессора компоновки
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, Новый Структура(«ДанныеПечати», ДанныеПечати), ДанныеРасшифровки);

//Очищаем поле табличного документа
ДокументРезультат.Очистить();

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

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *