Несмотря на то, что в 4.5.1 нет как такого инструментария для исправления и возобновления задач, в самом DIRECTUM все спроектировано так, что задача которая прекратилась на блоке (Вычисление или др. блоке) видимо почти не отличается от задачи которая ожидает своей очереди на обработку службой Workflow. Возобновить прекращенную задачу можно задав ей признак в работе(State=W) и разместив её в очередь в таблицу SBWorkflowProcessing.
Сделать это можно так (сценарий Возобновление упавшей задачи (л)):
UPDATE SBTask SET State='W' WHERE XRecID =%s
INSERT INTO SBWorkflowProcessing VALUES( %s, 0, null, 0, null, 0 )
Смело возобновляйте задачи, если они прекратились из-за ошибки не связанной с разработкой маршрута т.е. в том случае если ошибка связана с платформой. К таким случаям относятся ошибки вида "истекло время для обработки..." или, когда произошла нехватка памяти на сервере, возникли перебои в работе SQL сервера или произошла ошибка в пакете .bpl платформы, такое случается очень редко, но на ранних версиях DIRECTUM это особенно неприятно т.к. нет явной возможности возобновить.
В тех случаях, когда задача прекратилась из-за ошибки, которая была допущена в разработке маршрута, нужно править непосредственно схему маршрута задачи.
В 4.5.1 отсутствуют инструменты для редактирования схемы запущенной задачи, но здесь у нас есть два варианта:
1-й вариант: мы можем воспользоваться инструментами более поздних версий DIRECTUM. Например, можно экспортировать схему маршрута из задачи 4.5.1 в задачу 4.9, поправить её там, вернуть в 4.5.1 и все скорее всего заработает. Workflow в лог *proc.log "выругается" не незнакомые строковые константы, но задачу обработает.
2-й вариант: можно внести изменения непосредственно в XML схему маршрута используя текстовый редактор(желательно с подсветкой). Т.к. код вычислений хранится в кодировке mime/base64, предварительно такие участки нужно декодировать, а изменив вычисления, закодировать схему маршрута обратно в mime/base64
Рассмотрим подробнее 1-й вариант:
Выгрузить текстовое описание схемы маршрута задачи можно следующим образом ( сценарий Выгрузить схему задачи (л) ):
задача = Tasks.GetObjectByID( <номер задачи> )
description = задача.WorkflowDescription
EditText( description )
Загрузить в задачу DIRECTUM, где уже разработаны инструменты ( сценарий Загрузить схему задачи (л) )
Task = Tasks.GetObjectByID( <номер задачи> )
task.WorkflowDescription = схема
task.Save
При выгрузке нужно указать номер задачи для редактирования, при загрузке укажите номер задачи, в которой будет выполняться редактирование. Текст переписки задачи не измениться, а вот схема будет присвоенная. Задача в которой будет выполняться редактирование желательно должна быть по типовому маршруту, т.к. кнопка "Схема маршрута" будет отсутствовать для задачи не по маршруту. В той системе, в которой будет выполняться редактирование, придется завести все роли и всех пользователей, которые были задействованы в ходе выполнения "подсаживаемой" задачи.
Показалось удобным работать через буфер обмена, поэтому 1-я обработка покажет схему в редакторе, копируйте в буфер, вставляйте в окно второй обработки, выполните редактирование нужных блоков и обработок и выгрузите/загрузите обратно из 4.x в 4.5.1. Воспользуйтесь обработкой для возобновления задачи в 4.5. В логи sbworkflowproc.log служба вероятно выдаст ошибки вида,
31.01.2013 14:52:00 1244 UVKDIR ISBuilderSystem ESBLocalizationError Localization Error! There is no string with code "TASK_ACCESS_TYPE_ALL" (Group "SYSRES_SYSCOMP", language "Russian"). <- ...
но задача будет работать дальше.
Рассмотрим 2-й вариант, когда редактирование будет выполняться непосредственно в 4.5.1
Здесь будет непосредственно корректироваться текстовое описание маршрута задачи. Чтобы иметь возможно исправить вычисления или события блоков, эти участки схемы нужно предварительно декодировать из mime/base64.
Участки схемы, которые содержат вычисления выглядят примерно так
[CDATA[{5314B05F-CF9F-4F66-99EC-24992A5FB114}Ly/R7+jx7uog7+7r8/fg8uXr5ekg7/Dg4gpBbGxSb2xlcyA9IEFycmF5T2YoIAoizeD34Ov87ejqz93OIjsKIsTo8OXq8u
Для обработки данной кодировки нам понадобятся функции MimeEncodeString и MimeDecodeString, которые по сути появились в 4.6. В 4.5.1 они не работают, возвращают пустой результат.
MimeEncodeString для 4.5.1 можно описать примерно так
oXML = CreateObject("Msxml2.DOMDocument.3.0")
oNode = oXML.CreateElement("base64")
oNode.dataType = "bin.base64"
adTypeText = 2
adTypeBinary = 1
BinaryStream = CreateObject("ADODB.Stream")
BinaryStream.Type = adTypeText
BinaryStream.CharSet = "windows-1251"
BinaryStream.Open
BinaryStream.WriteText( строка )
BinaryStream.Position = 0
BinaryStream.Type = adTypeBinary
BinaryStream.Position = 0
oNode.nodeTypedValue = BinaryStream.Read
result = oNode.text
MimeDecodeString так
oXML = CreateObject("Msxml2.DOMDocument.3.0")
oNode = oXML.CreateElement("base64")
oNode.dataType = "bin.base64"
oNode.text = строка_mime
Binary = oNode.nodeTypedValue
adTypeText = 2
adTypeBinary = 1
BinaryStream = CreateObject("ADODB.Stream")
BinaryStream.Type = adTypeBinary
BinaryStream.Open
BinaryStream.Write( Binary )
BinaryStream.Position = 0
BinaryStream.Type = adTypeText
BinaryStream.CharSet = "windows-1251"
result = BinaryStream.ReadText
Получить схему маршрута можно следующим образом
task = Tasks.GetObjectByID( ид_задачи )
схема = task.WorkflowDescription
Раскодировать схему можно следующим образом: в качестве парсера XML используется стандартный COM объект IXMLDomDocument. Через XPath запрос, отбираем все узлы, которые содержат код обработок(вычисления, события). Узлы которые содержат код вычислений, начинаются с указания GUID { XXXXXX-XXXXX-XXXXX }, далее следует текст обработки в кодировке mime/base64, это значение декодируется, а в конце XML документу выставляется кодировка в windows-1251.
XMLDoc = CreateObject("MSXml.DomDocument")
XMLDoc.LoadXML( схема )
xmlDoc.setProperty("SelectionLanguage"; "XPath")
выбрать_все_коды = "//*[count(*)=0 and contains(.,'{')]"
все_узлы = xmlDoc.selectNodes( выбрать_все_коды ) //IXMLDomSelection
количество_узлов = все_узлы.length
все_узлы.reset
i = 0
while i < количество_узлов
узел_с_кодом = все_узлы.nextNode // IXMLDOMElement
текст_узла = узел_с_кодом.Text
guid = Copy( текст_узла; 1; 38 )
mime_text = Copy( текст_узла; 39; length( текст_узла ) - 38 )
if Assigned( mime_text )
mime_text = loc_MimeDecodeString( mime_text )
result_text = guid & mime_text
if узел_с_кодом.hasChildNodes
cdata = узел_с_кодом.childNodes.item(0)
if cdata.nodeType = 4
cdata.data = result_text
endif
endif
endif
i = i + 1
endwhile
результат_схема = xmlDoc.XML
правильная_кодировка = 'version="1.0" encoding="windows-1251" standalone="yes"'
неправильная_кодировка = 'version="1.0" standalone="yes"'
результат_схема = Replace( результат_схема; неправильная_кодировка; правильная_кодировка )
result = результат_схема
xmlDoc = nil
Кодирование происходит таким же образом, только вместо MimeDecodeString используется MimeEncodeString.
В прикрепленной разработке вы найдете сценарии и функции для того чтобы выполнить оба описанных варианта корректировки схемы задачи.
Используйте сценарии как инструменты:
* Сценарий Править схему задачи (л) используйте для того чтобы выполнить правку текстового описания задачи непосредственно в базе. Перед этим обязательно выполните резервирование оригинала схемы маршрута задачи при помощи сценария Выгрузить схему задачи (л). Вы сможете восстановиться из копии используя обработку Загрузить схему задачи (л)
* Используйте сценарии Выгрузить схему задачи (л) и Загрузить схему задачи (л) соответственно в двух поставках DIRECTUM 4.5.1 и более старших DIRECTUM 4.x
Как распространить изменения
Самым простым способом распространить изменения в вычислениях событий, наверно, будет замена вычислений уже в закодированном виде.
Сценарий Распространить изменения маршрута (л) можно посмотреть как пример подобной пакетной правки.
Если будете исправлять вычисления задачи, имейте введу, что текущий исполняемый блок схемы дополнительно дублируется между тегами
Описание функций
лЗадача_Возобновить( значение_номер_задачи ) - возобновляет прекращенную задачу. Для этого задаче выставляется состояние В работе, затем задача помещается в очередь на обработку Workflow службой.
лСхема_РаскодироватьОбработки( <текстовое описание схемы как есть в базе данных> ) - возвращает строку, раскодированный вариант схемы приведя вычисления схемы к понятному виду.
лСхема_ЗакодироватьОбработки( <текстовое описание схемы с раскодированными обработками> ) - возвращает строку, закодированную схему приведя все вычисления схемы к тому виду, в котором они хранятся в базе данных
Загрузки
Набор инструментов Возобновление задач 4.5.1.zip (11,05 Кб)
Ссылки
MimeStringEncode/Decode алгоритм взят отсюда http://stackoverflow.com/questions/496751/base64-encode-string-in-vbscript
Ссылки на доп. инструменты
Для приведения XML схемы задачи в иерархичный вид, можно использовать онлайн инструмент
Для тестирования XPath запросов можно использовать онлайн инструмент
P.S. Будьте предельно внимательны корректируя XML схему задачи
Я не знаю насколько эти инструменты совместимы с 4.5, 4.4. Если у вас есть возможность протестировать, пожалуйста, отпишитесь о результатах.
Другие материалы на тему работы со схемой
Экспорт/Импорт схемы задач из системы DIRECTUM средствами ISBL Дмитрия Тарасова
Экспорт/Импорт схемы задач из системы DIRECTUM Антона Калашникова
Авторизуйтесь, чтобы написать комментарий