Не так давно пришлось решать задачу с автоматическим сохранением отчетов вида «Сводная таблица» для Excel в базе данных DIRECTUM, сформированных пользователем из DIRECTUM, без участия самого пользователя.
Казалось бы, задача простая – создаем сценарий или кнопку для карточки справочника, которые будут находить и запускать нужный отчет, а затем создавать документ из файла во временной папке. Но в реальности получилось не так просто, как казалось.
Все дело в том, что порядок формирования отчетов типа «сводная таблица» состоит из двух этапов:
Т.е. файл, получаемый при сохранении отчета в файл, еще не содержит листа сводной таблицы по тому, что сама сводная таблица формируется не в момент сохранения файла, а в момент открытия документа в Excel.
Появляется вопрос – как сохранить отчет в DIRECTUM с уже сформированной сводной таблицей, а не только файл с исходными данными, и при этом не заставлять пользователя делать какие то дополнительные телодвижения типа сохранения файла или создания из него документа в DIRECTUM.
Решение было найдено за счет использования функции VBScript GetObject(). Ниже представлен пример текста сценария. Сценарий выполняет отчет с именем «ReportName», отчет отображается для пользователя, формируется сводная таблица, затем отчет со сводной таблицей сохраняется в системе DIRECTUM.
// Выполнить отчет
ReportName = 'Сводная таблица по документам'
Rep = Reports.GetObjectByName(ReportName)
Rep.Destination = rdWindow
Rep.Execute
// Заменить пробелы в наименовании отчета на подчеркивания
ReportTitle = Replace(Rep.Title; ' '; '_')
tmp = GetTempFolder()
// Получить имя временного файла
Source = Format('%s~%s.drsf'; ArrayOf(tmp; ReportTitle))
// Если во временной папке уже есть старый файл отчета - необходимо подобрать первое свободное имя
i = 1
While FileExists(Source)
Source = Format('%s~%s%s.drsf'; ArrayOf(tmp; ReportTitle; i))
i = i +1
endWhile
// Используется VBScript, так как на ISBL нельзя вызывать метод GetObject()
ScriptControl = CreateObject("MSScriptControl.ScriptControl")
ScriptControl.Language = "VBScript"
ScriptControl.Reset
// Скрипт выполнит подключение к активному процессу Excel и сохранит копию файла
Script = '
Dim Excel
Set Excel = GetObject(, "Excel.Application")
Dim Doc
Set Doc = Excel.ActiveWorkbook
Excel.DisplayAlerts = False
Doc.SaveAs "%s", -4143
Doc.Close
Excel.DisplayAlerts = True
'
ScriptControl.ExecuteStatement(Format(Script; Source))
// Создать документ в системе DIRECTUM
Editor = "EXCEL"
Kind = "Г000027"
Type = "ПЭА"
Doc = EDocuments.CreateNewFromFile(Type; Kind; Editor; Source; FALSE)
Doc.Save
Петр, а нет ли возможности сделать создание отчета вообще без участия пользователя?
Например, руководство каждый месяц в первый рабочий день желает получать сводный отчет по прошлому месяцу для каких либо своих целей (например для контроля процессов и прочее). Отчет достаточно большой и может строится достаточно долго, чтоб делать его самому, а поручать кому-то может нецелесообразно из-за соображений безопасности (кубы данных и CrystalReports дорого для одной задачи). Будет удобно, если отчет автоматически создавался бы ночью в определенное время, сохранялся и затем отправлялся бы вложением в задачу заданному руководителю.
Еще вариант - для генерации отчетов использовать конструктор документов.
Попробовали реализовать пример, но вышло сообщение "невозможно создание объекта контейнером ActiveX: 'GetObject'".
Разобрались, спасибо за статью и код ))
В код скрипта нужно добавить очищение переменной, без этого у меня не корректно работает:
После
добавить
Авторизуйтесь, чтобы написать комментарий