В рамках серии статей, посвященных разработке на ISBL, нами ранее были рассмотрены следующие вопросы:
В этой статье мы поговорим о механизме формирования отчетов в Directum: рассмотрим, какие отчеты бывают, и какие средства для их разработки имеются. В качестве практики мы, продолжая решать задачу, разработаем небольшой RTF-отчет.
Как и при работе с любой другой системой, предполагающей накопление данных, при работе с Directum рано или поздно возникает необходимость просмотра и анализа информации в виде отчетов: реестры договоров, графики совещаний, перечни невыполненных поручений и так далее. Кроме того, работа с некоторыми документами предполагает получение заполненной по имеющимся данным формы установленного образца в бумажном варианте для последующего ее подписания и хранения, либо передачи контрагенту. Для решения этих задач в Directum используется механизм отчетов.
Отчеты являются объектами системы и объединяют в себе Расчет – вычисление на языке ISBL, предназначенное для получения и подготовки данных отчета, и Шаблон, описывающий структуру результирующей формы отчета. При формировании отчета первым выполняется расчет, формируя данные, которые затем используются при обработке шаблона. И, наконец, полученный текст отчета передается в приложение для просмотра, указанное при настройке отчета. Для подготовки шаблона можно использовать как встроенный редактор, так и внешнее приложение, например, Microsoft Excel, в зависимости от задачи. Формирование отчета может выполняться пользователем вручную (пользователь находит отчет в списке и нажимает кнопку Выполнить), либо программно (метод Execute() объекта IReport).
По составу данных отчеты делятся на интегрированные и аналитические. Интегрированные отчеты выполняются в контексте конкретного справочника и используют его данные. В частности, в текстах расчета и шаблона интегрированного отчета имеется возможность обратиться к текущей записи справочника через предопределенную переменную Object. Доступ к интегрированным отчетам для разработки осуществляется из компоненты Типы справочников, из формы списка соответствующего справочника через меню Сервис – Отчеты. В отличие от интегрированных аналитические отчеты предназначены для анализа информации по всей системе в целом, а их разработка ведется в компоненте разработчика Разработка отчетов.
При выводе отчетов в Microsoft Excel имеется возможность формирования сводных таблиц. Эта возможность предоставляется надстройкой directum.xla. Для формирования сводной таблицы выходные данные отчета должны содержать строку заголовков и строки данных формируемой сводной таблицы. Параметры настройки сводной таблицы при этом передаются через переменную СводТабл, либо полученная таблица настраивается вручную в Microsoft Excel. Если для получения данных отчета используется SQL-запрос, то системная функция SQL2XLSTAB() позволяет сформировать данные для сводной таблицы на основании текста запроса без промежуточных действий.
Чтобы "потрогать все своими глазами" и закрепить теорию на практике, создадим интегрированный отчет для справочника Права доступа работников на ПО. Отчет будет выводить список ПО и прав к нему из открытой карточки справочника в RTF-документ.
Откройте справочник Права доступа работников на ПО, в меню Сервис выберите пункт Отчеты. Открывшийся при этом список и есть список интегрированных отчетов нашего справочника. Создайте новый отчет и заполните поля на открывшейся карточке как показано на рисунке:
Теперь создадим текст расчета. Нажмите кнопку Расчет и введите следующий текст:
// Получить наименование работника Worker = Object.Requisites('Работник').DisplayText // Получить детальный набор с правами доступа работника к ПО UserPermissions = Object.DetailDataSet(1) // Получить количество записей детального набора RecordCount = UserPermissions.RecordCount // Заполнить список ПО и прав к нему для формирования отчета Permissions = CreateList() foreach UserPermission in UserPermissions Permissions.Add( UserPermission.Requisites('SoftwareT').DisplayText; UserPermission.Requisites('PermissionsTypeT').DisplayText ) endforeach
Тут ничего сложного: из текущей записи справочника, доступ к которой мы получаем через предопределенную переменную Object, считываем значение реквизита Работник, количество записей детального набора сохраняем в переменной RecordCount, а данными детального набора заполняем список Permissions. На этом подготовка данных для нашего отчета завершена. Сохраните текст расчета и закройте окно редактора. Переходим к созданию текста шаблона. Нажмите кнопку Шаблон и в открывшемся редакторе введите следующий текст:
SEMICOLON = ';' // Сформировать заголовок RTF-документа отчета #[РТФЗагОтч()] // Сформировать текстовый заголовок отчета #{\b\qc\fs28 Права доступа к программному обеспечению\par} #{\b\qc\fs22 работника [Worker]\par} \par // Сформировать шапку табличной части отчета #[РТФШапкаТабл('1;8;8'; '\qc\b №;Программное обеспечение;Права доступа')] // Цикл по спискам исходных данных и формирование строк // табличной части отчета Index = 1 while Index <= RecordCount #[РТФСтрТабл('1;8;8'; '\qc ' & Index & SEMICOLON & Permissions.Names(Index - 1) & SEMICOLON & Permissions.Values(Index - 1) )] Index = Index + 1 endwhile // Сформировать конец RTF-документа отчета #[РТФКонОтч()]
На тексте шаблона остановимся подробнее. Что тут где? В целом текст шаблона представляет собой обычное вычисление на ISBL, однако имеются две особенности. Во-первых, бросаются в глаза строки, начинающиеся с символа «#». Это строки будущего отчета. Текст этих строк, за исключением самого символа «#», в неизменном виде выводится в текст документа отчета, причем квадратные скобки «[» и «]» раскрываются, а их содержимое интерпретируется как выражения на ISBL. В нашем примере мы видим, что в этих строках происходит непосредственное создание тела RTF-документа с помощью тегов. Функции РТФЗагОтч(), РТФШапкаТабл(), РТФСтрокаТабл() и РТФКонОтч() являются прикладными и формируют соответствующие элементы RTF-документа также с помощью тегов. Второй особенностью текста шаблона является обращение к переменным, объявленным в тексте расчета. Иначе говоря, область видимости переменных расчета простирается и на шаблон, обеспечивая их связь. Вообще, в случае простых отчетов, когда алгоритм сбора и подготовки данных несложный, его можно разместить в тексте шаблона, совместив с выводом. Например, в нашем случае можно прямо в шаблоне получить все данные из карточки справочника, написав соответствующие выражения в квадратных скобках.
Сохраните и закройте текст шаблона. Наш отчет готов, можно сохранить и закрыть его карточку. Осталось дать пользователю удобный способ формирования отчета – кнопку в карточке справочника Права доступа работников на ПО. Для этого создайте в справочнике новое действие и связанную с ним кнопку на форме карточки. Если забыли, как это делается, вспоминаем тут. Вычисление действия в нашем случае будет простое:
// Найти в списке интегрированных отчетов справочника // отчет 'PermissionsReport' и выполнить его Object.Reports.ValueByName('PermissionsReport').Execute()
Убедитесь, что имя отчета в вычислении соответствует имени, указанному нами при создании отчета в его карточке. После сохранения всех изменений можно приступать к тестированию отчета. Перейдите в список справочника, найдите понравившуюся запись, откройте ее карточку и нажмите только что созданную кнопку формирования отчета. Если ничего не пропустили и все сделали правильно, то в результате работы отчета увидим сформированный RTF-документ, открытый в Microsoft Word:
Если откроем файл RTF-отчета как текстовый документ, то увидим его содержимое: текст, сформированный прикладными функциями, а также строки, указанные нами в шаблоне, без каких-либо изменений. Так что здесь нет никакого волшебства, все в наших руках, все под контролем. Аналогичным образом, используя теги, можно создавать отчеты в формате HTML и других подобных форматах.
Разработка аналитических отчетов ведется ровно таким же образом с той лишь разницей, что в случае аналитического отчета мы не работаем в контексте определенного справочника, и предопределенная переменная Object предоставляет доступ к объекту IReport выполняющегося отчета.
В данной статье мы познакомились с механизмом формирования отчетов в Directum, его назначением и особенностями, выяснили отличие между интегрированными и аналитическими отчетами. На примере разработки несложного RTF-отчета мы рассмотрели инструменты и порядок создания отчетов в Directum.
А подскажите, как можно реализовать, чтобы сформированный отчёт Report выгружался в определённую папку пользователю?
Авторизуйтесь, чтобы написать комментарий