Сравнение схем типовых маршрутов при импорте разработки

20 11

При импорте типовых маршрутов частенько возникает вопрос: А чем же отличаются текущий ТМ и импортируемый? Как понять какие изменения вносятся и не затереть важных изменений?

На клабе уже публиковали решение, позволяющее сравнивать схемы ТМ

Предлагаю простое решение, не требующее сторонних утилит: для каждого ТМ создавать функцию, содержащую в тексте схему маршрута. Текст функции обновлять при каждом сохранении ТМ. При экспорте ТМ необходимо делать выгрузку соответствующей функции, перед импортом сравнить текст функций используя стандартный механизм сравнения при импорте разработки.

В схеме маршрута прикладной код событий и вычислений хранится в формате base64, поэтому в текст функции записывается декодированный текст. Попутно схема ТМ приводится в более читабельный вид - с переносами строк, отступами.

Функция для вставки в событие сохранения справочника "Типовые маршруты": 20160711 SRCompare.zip

Ну и простенький код для первоначального создания функций

  Ref = CreateReference('ТМТ')
  Ref.Open
  foreach Record in Ref
    Record.OpenRecord
    UDL_UpdateFuncForSR(Record)
  endforeach
Владимир Гладких

Небольшое замечание: в тексте функции в лист с путями XPath надо добавить 

SectionsToDecodeXPath.Add("//Value//text()")

Чтобы еще и текст инструкции с base64 переводило. Только надо предварительно делать проверку на наличие GUID "{5314B05F-CF9F-4F66-99EC-24992A5FB114}" в переводимой строке.

Александр Чугунов

Владимир, спасибо. По хорошему надо еще декодировать заголовки параметров, имена блоков, текстовые параметры блоков и может что-то еще.

Владимир Гладких

В этом случае можно прикрутить функцию с реплейсом в которой перечислять необходимые замены, либо заморочится на справочник типа словаря локализации из 2 столбцов (Параметр/Перевод) в табличной части и реплейсить на его основе.
Кстати что значит сей гуид {5314B05F-CF9F-4F66-99EC-24992A5FB114}?  Во всех ли версиях системы он одинаковый? Но это уже скорее вопрос к вендору

Григорий Бехтерев

{5314B05F-CF9F-4F66-99EC-24992A5FB114} это просто метка. Она говорит о том, что дальше идет текст в base64. Думаю, об этом Вы уже и так догадались.

Во всех ли версиях системы он одинаковый?

Насколько знаю, не менялся.

Константин Тарасов

Добрый день, коллеги! Интересная статья и решение.

Пробую изменить ТМ Согласование СЗ и сравниваю полученные ф-ции до и после изменения схемы. Изменения специально сделал не существенные, а сравнение показывает, что параметр "NextActualID" изменился. Просьба пояснить, что означают NextActualID, StartCycleBlockActualID и Iteration="0" PreviousBlockID="-1" StartServer=""
<ExecutedBlocks NextActualID="95">
  <RouteBlock Type="0" ID="71" StartCycleBlockActualID="93" Iteration="0" PreviousBlockID="-1" StartServer="">
  </RouteBlock>
  <RouteBlock Type="0" ID="72" StartCycleBlockActualID="93" Iteration="0" PreviousBlockID="-1" StartServer="">
  </RouteBlock>
  <RouteBlock Type="0" ID="73" StartCycleBlockActualID="93" Iteration="0" PreviousBlockID="-1" StartServer="">
  </RouteBlock>
  <RouteBlock Type="0" ID="74" StartCycleBlockActualID="93" Iteration="0" PreviousBlockID="-1" StartServer="">
  </RouteBlock>
  <RouteBlock Type="0" ID="76" StartCycleBlockActualID="93" Iteration="0" PreviousBlockID="-1" StartServer="">
  </RouteBlock>
  <RouteBlock Type="0" ID="77" StartCycleBlockActualID="93" Iteration="0" PreviousBlockID="-1" StartServer="">
  </RouteBlock>
  <RouteBlock Type="0" ID="78" StartCycleBlockActualID="93" Iteration="0" PreviousBlockID="-1" StartServer="">
  </RouteBlock>
  <RouteBlock Type="1" ID="85" ActualID="93" NextBlockID="71" StartCycleBlockActualID="-1" Iteration="0" PreviousBlockID="-1">

Александр Чугунов

Константин, секция ExecutedBlocks вообще не должна быть заполнена в схеме маршрута, это баг директума, эта секция появляется если после отладки ТМ сохранить его. Эту секцию лучше очистить, иногда из-за нее всякие глюки начинаются.

Константин Тарасов

Доброго времени суток, Александр!

Спасибо за ответ, про баг знаю и о том, что нужно очищать содержимое тегов:

<ExecutedBlocks></ExecutedBlocks> и <CurrentBlocks></CurrentBlocks> у меня есть письмо от саппорта. Удивляет другое, во всех стандартных ТМ, которые нам поставили вместе с дистрибутивом (Версия 5.4) ("Заявка на установку программного обеспечения", "Согласование официальных документов", "Согласование договорных документов" и т.д.) секция ExecutedBlocks заполнена. В более старых версиях аналогично. Очень прошу сообщество проверить, у кого-то очищен параметр ExecutedBlocks в схемах ТМ? Или все разработчики после отладки его каждый раз чистят руками? Для проверки необходимо открыть схему маршрута в виде XML (сочетание клавиш Alt-X на карточке ТМ).

Вопрос нужно (желательно) выяснить, так как, если схема ТМ перестаёт открываться (а такое случалось в моей практике), то саппорт высылает рекомендацию (https://club.directum.ru/knowledge/93282) об очистке этих двух секций. Хотя у меня во всех ТМ секция CurrentBlocks не содержит открывающий тег, и состоит только из </CurrentBlocks>. Это разве нормально?

Александр Чугунов

Константин, никто не сохраняет ТМ после отладки как раз чтобы эти лишние секции XML не писались.
По поводу CurrentBlocks без открывающих тегов - такого быть не можетдолжно. Проверьте внимательнее. Проверьте схему ТМ в каком-нибудь стороннем софте на валидность.

Константин Тарасов

Добрый день, Александр!

Очень Вас прошу скопировать аналогичный кусок из ТМ УтвЗаявл, у меня это выглядит так (выделил полужирным 2 тега):

end
]]></Ribbon></Block></Blocks><Route><Link ID="0"><Inputs/><Outputs><Output ID="2" ResultCode=""/></Outputs></Link><Link ID="1"><Inputs><Input ID="7" ResultCode=""/><Input ID="10" ResultCode="N"/><Input ID="12" ResultCode=""/><Input ID="14" ResultCode=""/></Inputs><Outputs/></Link><Link ID="2"><Inputs><Input ID="0" ResultCode=""/><Input ID="4" ResultCode=""/></Inputs><Outputs><Output ID="3" ResultCode="С"/><Output ID="4" ResultCode=" ELSE"/><Output ID="9" ResultCode="О"><Point X="100" Y="200"/></Output></Outputs></Link><Link ID="3"><Inputs><Input ID="2" ResultCode="С"/></Inputs><Outputs><Output ID="11" ResultCode="С"/><Output ID="9" ResultCode="О"><Point X="181" Y="360"/><Point X="152" Y="360"/></Output><Output ID="12" ResultCode=" ELSE"/><Output ID="4" ResultCode="Д"><Point X="440" Y="270"/><Point X="463" Y="265"/></Output></Outputs></Link><Link ID="4"><Inputs><Input ID="2" ResultCode=" ELSE"/><Input ID="3" ResultCode="Д"/></Inputs><Outputs><Output ID="2" ResultCode=""><Point X="480" Y="130"/><Point X="380" Y="130"/></Output></Outputs></Link><Link ID="7"><Inputs><Input ID="10" ResultCode="Y"/></Inputs><Outputs><Output ID="1" ResultCode=""/></Outputs></Link><Link ID="9"><Inputs><Input ID="2" ResultCode="О"/><Input ID="3" ResultCode="О"/></Inputs><Outputs><Output ID="14" ResultCode=""/></Outputs></Link><Link ID="10"><Inputs><Input ID="15" ResultCode=""/></Inputs><Outputs><Output ID="7" ResultCode="Y"/><Output ID="1" ResultCode="N"/></Outputs></Link><Link ID="11"><Inputs><Input ID="3" ResultCode="С"/></Inputs><Outputs><Output ID="15" ResultCode=""/></Outputs></Link><Link ID="12"><Inputs><Input ID="3" ResultCode=" ELSE"/></Inputs><Outputs><Output ID="1" ResultCode=""><Point X="680" Y="360"/><Point X="680" Y="870"/></Output></Outputs></Link><Link ID="14"><Inputs><Input ID="9" ResultCode=""/></Inputs><Outputs><Output ID="1" ResultCode=""><Point X="100" Y="870"/></Output></Outputs></Link><Link ID="15"><Inputs><Input ID="11" ResultCode=""/></Inputs><Outputs><Output ID="10" ResultCode=""/></Outputs></Link></Route><ExecutedBlocks NextActualID="31"><RouteBlock Type="0" ID="2" StartCycleBlockActualID="30" Iteration="0" PreviousBlockID="-1" StartServer=""/><RouteBlock Type="0" ID="3" StartCycleBlockActualID="30" Iteration="0" PreviousBlockID="-1" StartServer=""/><RouteBlock Type="0" ID="4" StartCycleBlockActualID="30" Iteration="0" PreviousBlockID="-1" StartServer=""/><RouteBlock Type="1" ID="16" ActualID="30" NextBlockID="2" StartCycleBlockActualID="-1" Iteration="0" PreviousBlockID="-1"/><RouteBlock Type="0" ID="0" StartCycleBlockActualID="-1" Iteration="0" PreviousBlockID="-1" StartServer=""/><RouteBlock Type="0" ID="1" StartCycleBlockActualID="-1" Iteration="0" PreviousBlockID="-1" StartServer=""/><RouteBlock Type="0" ID="7" StartCycleBlockActualID="-1" Iteration="0" PreviousBlockID="-1" StartServer=""/><RouteBlock Type="0" ID="9" StartCycleBlockActualID="-1" Iteration="0" PreviousBlockID="-1" StartServer=""/><RouteBlock Type="0" ID="10" StartCycleBlockActualID="-1" Iteration="0" PreviousBlockID="-1" StartServer=""/><RouteBlock Type="0" ID="11" StartCycleBlockActualID="-1" Iteration="0" PreviousBlockID="-1" StartServer=""/><RouteBlock Type="0" ID="12" StartCycleBlockActualID="-1" Iteration="0" PreviousBlockID="-1" StartServer=""/><RouteBlock Type="0" ID="14" StartCycleBlockActualID="-1" Iteration="0" PreviousBlockID="-1" StartServer=""/><RouteBlock Type="0" ID="15" StartCycleBlockActualID="-1" Iteration="0" PreviousBlockID="-1" StartServer=""/></ExecutedBlocks><CurrentBlocks/><RouteActions><Action Code="Approved" Caption="Согласовано" CaptionLocalizeID="BPM.DIRBLOCK_PICK_0F4E7CBF_43CB_4EB7_B080_2DE06DBD924C" Hint="Согласовать документ" HintLocalizeID="COMMON.DIRAAA963D2_255C_49E8_9EF9_AE37346D56DE" EditModeEnabledState="0" AllowedJobStates="0" EnabledWhenAttchmentSelected="false" ImageName="PerformJobIcon"><ISBLText><![CDATA[ICAvLyDC++/u6+3o8vwg5+Dk4O3o5SDxIPDl5/Pr/PLg8u7sINHu4+vg8e7i4O3uDQogIE9iamVjdC5Gb3JtLlBlcmZvcm1XaXRoUmVzdWx0KCfR7uPr4PHu4uDt7icpIA==]]></ISBLText></Action><Action Code="Revision" Caption="На доработку" CaptionLocalizeID="BPM.DIRBLOCK_PICK_1453DE08_4D82_4FAE_BCD8_999E9B5BB623" Hint="Отправить задание на доработку" HintLocalizeID="COMMON.DIR3B5082C8_622D_4452_BC47_6E933E30DD75" EditModeEnabledState="0" AllowedJobStates="0" EnabledWhenAttchmentSelected="false" ImageName="ResumeTaskIcon"><ISBLText><![CDATA[ICAvLyDC++/u6+3o8vwg5+Dk4O3o5SDxIPDl5/Pr/PLg8u7sIM3gIOTu8ODh7vLq8w0KICBPYmplY3QuRm9ybS5QZXJmb3JtV2l0aFJlc3VsdCgnzeAg5O7w4OHu8urzJykg]]></ISBLText></Action><Action Code="Refused" Caption="Отказано" CaptionLocalizeID="BPM.DIRBLOCK_PICK_E7204EDE_D363_4EB3_B3F6_3DCABE6C78A4" Hint="Отказать в принятии заявления" HintLocalizeID="COMMON.DIR721862FA_001A_461B_844F_DD1F07A85211" EditModeEnabledState="0" AllowedJobStates="0" EnabledWhenAttchmentSelected="false" ImageName="Delete2Icon"><ISBLText><![CDATA[ICAvLyDC++/u6+3o8vwg5+Dk4O3o5SDxIPDl5/Pr/PLg8u7sIM7y6uDn4O3uDQogIE9iamVjdC5Gb3JtLlBlcmZvcm1XaXRoUmVzdWx0KCfO8urg5+Dt7icp]]></ISBLText></Action><Action Code="ChiefApprove" Caption="Утверждено" CaptionLocalizeID="MM.PICK_47" Hint="Утвердить заявление" HintLocalizeID="COMMON.DIR585153E9_B156_4ED3_A9F9_7C83479322A7" EditModeEnabledState="0" AllowedJobStates="0" EnabledWhenAttchmentSelected="false" ImageName="PerformJobIcon"><ISBLText><![CDATA[ICAvLyDC++/u6+3o8vwg5+Dk4O3o5SDxIPDl5/Pr/PLg8u7sINPy4uXw5uTl7e4NCiAgT2JqZWN0LkZvcm0uUGVyZm9ybVdpdGhSZXN1bHQoJ9Py4uXw5uTl7e4nKSA=]]></ISBLText></Action></RouteActions></Settings>

Александр Чугунов

Константин, у меня такого ТМ нет. Да и я так и понял в чем у Вас проблема, схема выглядит вполне нормально. <CurrentBlocks/> - это полноценный, завершенный тег, просто пустой. Ну а ExecutedBlocks просто после отладки остались, в принципе, это нормально, что ТМ в таком состоянии в коробке.

Константин Тарасов

Перечитав статью https://club.directum.ru/knowledge/93282

"ОТВЕТ

Данная ошибка возникает в случае, когда ТМ был изменен и сохранен во время выполнения отладки, либо отладка некорректно завершилась. Для исправления необходимо открыть схему маршрута в виде XML (сочетание клавиш Alt-X на карточке ТМ) и очистить содержимое тегов:

  • <ExecutedBlocks></ExecutedBlocks>
  • <CurrentBlocks></CurrentBlocks>." понял, что блока <CurrentBlocks></CurrentBlocks> ни у кого нет и не будет ни в одном ТМ. И вместо конструкции <CurrentBlocks> .......</CurrentBlocks> нормально иметь в ТМ конструкцию в виде <CurrentBlocks/>

Авторизуйтесь, чтобы написать комментарий