Содержание
Динамика работы пользователей
При открытии новых филиалов компании, для расчета нагрузки на сервер 1С:Предприятия и других задач пожет понадобиться посмотреть динамику работы пользователей в информационной базе в виде диаграммы.
Динамику нужно показать за выбранный пользователем период. В качестве отображаемых данных будет количество действий на данными пользователями в разрезе часов. Информация для подобного отчета может быть получена из журнала регистрации.
Рассмотрим поэтапное создание подобного отчета и с помощью внешнего набора данных построим его на системе компоновки данных.
Читаем журнал регистрации
И так, отчет будем строить на СКД. Данные же мы будем получать не с помощью запроса из базы данных, а из журнала регистрации. О способе хранения журнала регистрации платформой писал в предыдущей статье.
В соответствии с заданным периодом в отчете нам нужно получить все действия пользователя над данными информационной базы. Полученную таблицу сгруппировать по пользователю и вывести в виде диаграммы (см. скриншот выше).
Для получения информации из журнала регистрации будем использовать метод глобального контекста "ВыгрузитьЖурналРегистрации()". В событии "ПриКомпоновкеРезультата" созданного отчета добавим следующий программный код:
Первый параметр метода "ВыгрузитьЖурналРегистрации" устанавливает таблицу значений, в которую будет выгружен результат выборки из журнала регистрации. Второй параметр устанавливаем фильтр на выбираемые записи. Филтр представляет собой структуру, ключи в котором – это поля, по которым устанавливается отбор. Мы используем поля "ДатаНачала" и "ДатаОкончания" для установки периода анализа журнала регистрации, а также поле "Событие", в который передаем массив строк (наименований событий). Добавленные в массив события соответствуют действиям на данными в базе.
Подробнее о использовании метода "ВыгрузитьЖурналРегистрации" Вы можете прочитать в синтаксис-помощнике.
Передаем таблицу значений в СКД
Для того, чтобы СКД смогла работать с полученной таблице значений нужно проделать следующий действия:
1) Создать набор данных в схеме компоновки и задать его поля.2) В программный код модуля "ПриКомпоновкеРезультата" прописать передачу таблицы значений в СКД.
3) Настраиваем ресурсы и структуру отчета (подробнее смотри в файле отчета, ссылка на который дана в конце статьи).
На этом настройки отчета завершены и мы можем запустить его в режиме предприятия.
Внешний источник данных в СКД позвляет использовать в отчетах данные практически из любых источников, влючая те, данные которых мы не сможем получить запросами.
Использование СКД для таких источников позволяет создавать отчеты с гибкиой системой настроек, а также дает возможность пользователю изменять вывод отчета, его структуру. Все возможности системы компоновки данных будут задействованы для таких источников в полной мере.
Скачать отчет из примера Вы можете по следующей ссылке .
Очень часто бывают ситуации, когда необходимо сделать отчет СКД на сложном запросе, который используюет в себе вложенные запросы и объединения внутренние и полные и т.д. – в результате в консоли этот запрос формируется верно, а в скд половина полей пустые! Связано это с особенностью СКД в объединении внутренних данных, а так же не стоит забывать что в СКД наборы данных связываются как левое соединение.
Решения возможны следующие:
- Изменить запрос в СКД
- Сформировать запрос обычным способом и подставить эти данные в СКД как внешние
Рассмотрим последний вариант:
Внешний источник данных, грузим из ТЗ
Для вывода отчета я использую шаблон All4CF.ru_Template_SKD_v4.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. Выводим результат в табличный документ.
Помимо таблиц значений в качестве внешних наборов данных могут использоваться результаты запросов, табличные части.
Пример сформированного отчёта:
Справочная информация из синтакс-помощника:
Комментарии
Обычный Александр (не проверено)
вт, 13/09/2016 – 10:25
Спасибо огромное за статью и прикреплённый пример. Очень помогло в работе.
Щукина Татьяна (не проверено)
пт, 16/12/2016 – 15:28
Спасибо – просто спасли. Только у меня Период не видит в модуле
пт, 16/12/2016 – 16:03
Можете файл отчёта выложить?
Щукина Татьяна (не проверено)
пт, 16/12/2016 – 17:14
положила все в модуль Объекта(база ЗиК 3), в СКД в Параметры добавила "Период" =стандартный период,НачалоПериода=&Период.ДатаНачала ; КонецПериода.. Не видит здесь Период и все..
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) экспорт
СтандартнаяОбработка = Ложь;
//ДанныеПечати = ПолучитьИзВременногоХранилища(Адр);
Запрос = Новый Запрос;
Запрос.Текст = " ВЫБРАТЬ
| РазовоеНачисление.Ссылка,
| РазовоеНачисление.МесяцНачисления,
| РазовоеНачисление.Подразделение.Наименование как СовмещПодразделениеКуда ,
| РазовоеНачисление.СпособОтраженияЗарплатыВБухучете.Наименование как СовмещСпособОтражения,
| РазовоеНачисление.СпособОтраженияЗарплатыВБухучете как СовмещСпособОтраженияСсылка,
| РазовоеНачисление.Начисление.Наименование как СовмещНаименование,
| РазовоеНач.Ссылка,
| РазовоеНач.Результат как СовмещСумма,
| РазовоеНач.Сотрудник как СовмещСотрудник,
| РазовоеНач.Подразделение.Наименование как СовмещПодразделениеОТКуда_отдел,
| РазовоеНач.Подразделение.РОДИТЕЛЬ.Наименование как СовмещПодразделениеОТКуда
|ИЗ
| Документ.РазовоеНачисление КАК РазовоеНачисление
| левое СОЕДИНЕНИЕ Документ.РазовоеНачисление.Начисления КАК РазовоеНач
| по РазовоеНачисление.Ссылка = РазовоеНач.Ссылка
| ГДЕ
| РазовоеНачисление.МесяцНачисления >= &НачалоПериода И РазовоеНачисление.МесяцНачисления = &НачалоПериода И НачисленияУдержанияПоСотрудникам.Период 0 Тогда
Для Каждого Ст Из МассивНайденныеСтроки Цикл
Стр.ВидДеятельностиНаш = Ст.СовмещСпособОтражения;
Если Ст.СовмещПодразделениеКуда = NULL Тогда
Счет ="";
СубСчет ="";
ПодразделениеСпрОтр ="";
ВидДеятельностиСпрОтр ="";
резЗапр = 0;
если резЗапр = 0 Тогда
ааа = "ОШИБКА нет в спр.СовмещСпособОтраженияСсылка записи = "+Ст.СовмещСпособОтраженияСсылка+" по "+Стр.Сотрудник +" cумма = "+ Стр.Сумма+" => ПодразделенияРодитель И ВидДеятельностиНаш берем из спр.Сотрудники" ;
Стр.ПодразделенияРодитель = Стр.ПодразделениеРод;
Стр.ВидДеятельностиНаш = Стр.ВидДеятельностиСотр;
иначе
Стр.ПодразделенияРодитель = ПодразделениеСпрОтр ;
Стр.ВидДеятельностиНаш = ВидДеятельностиСпрОтр;
конецесли;
иначе
Стр.ПодразделенияРодитель = Ст.СовмещПодразделениеКуда ; //это должен быть родитель подразделения
Стр.ВидДеятельностиНаш = Ст.СовмещСпособОтражения;
конецесли;
конецЦикла;
ИНАЧЕ
ааа = "ОШИБКА нет в табл.СовмещСотрРЕЗУЛЬТАТ "+Стр.Сотрудник +" cумма = "+ Стр.Сумма+" => ПодразделенияРодитель И ВидДеятельностиНаш берем из спр.Сотрудники" ;
Стр.ПодразделенияРодитель = Стр.ПодразделениеРод;
Стр.ВидДеятельностиНаш = Стр.ВидДеятельностиСотр;
конецЕсли ;
ИНАЧЕ
Стр.ПодразделенияРодитель = Стр.ПодразделениеРод;
Стр.ВидДеятельностиНаш = Стр.ВидДеятельностиСотр;
конецЕсли ;
КонецЦикла;
КонецЕсли;
ДанныеПечати.сортировать("Сотрудник");
//***************************************************************
//Получаем схему из макета
СхемаКомпоновкиДанных = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
//Из схемы возьмем настройки по умолчанию
Настройки = СхемаКомпоновкиДанных.НастройкиПоУмолчанию;
//Помещаем в переменную данные о расшифровке данных
ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
//Формируем макет, с помощью компоновщика макета
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
//Передаем в макет компоновки схему, настройки и данные расшифровки
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);
//Выполним компоновку с помощью процессора компоновки
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, Новый Структура("ДанныеПечати", ДанныеПечати), ДанныеРасшифровки);
//Очищаем поле табличного документа
ДокументРезультат.Очистить();
//Выводим результат в табличный документ
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);