Хранение согласуемого документа в параметре задачи – как изменить документ?

8 0

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

Теперь вдруг произошла нештатная ситуация и нужно изменить значения в параметрах без рестарта задачи. Особенно это важно для распределенных задач, пришедших из других систем через DICS. Такую задачу нельзя просто прекратить и создать новую.

Итак, мы без труда поменяем вложение в задачу. Кроме того, администратор может поменять и значение в параметре. Для этого надо открыть задачу на редактирование, зайти в схему маршрута, открыть параметры, и внести нужные изменения.

Однако «здесь мудрость», как писал Иоанн Богослов. Когда служба Workflow доходит до прикладного блока, то она сохраняет его в особом разделе схемы задачи, в «сохраненных блоках». Изменения, произведенные в прикладном блоке (через утилиты разработчика), не будут распространяться на уже сохраненный блок, они подхватятся только в тех блоках, до которых маршрут еще не дошел. При этом в «сохраненном блоке» сохраняется не только код, но и все значения свойств блока.

Т.е. если у нас в блоке есть свойство «Согласуемый документ» и мы передаем в него параметр в качестве значения, то, как бы мы не меняли значение параметра, в свойстве будет храниться то значение, которое было в параметре на момент старта блока. На практике это означает, что изменения в параметрах не повлияют на уже созданные задания.

Как выкрутиться из этой ситуации? Нужно заставить блок перечитывать значения параметров, а не пользоваться сохраненными. Для этого надо знать имя параметра, который передан в качестве значения свойства блока. Допустим, у нас есть свойство блока с именем «Document». Вот два разных способа получения документа из этого свойства.

Первый способ традиционный – в нем используется сохраненное в блоке значение.

Property = Sender.Properties.ValueByName('Document')
EDocCached = Property.Value

Второй способ с перечитыванием значения параметра.

Property = Sender.Properties.ValueByName('Document')
EDoc = Object.WorkflowParams.ValueByName(Property.ValueParamNames.Value).Value

Разумеется, второй способ можно использовать только тогда, когда мы уверены, что в качестве значения свойства передан именно параметр, а не явно указанный документ. Если может быть и то, и то, то надо предусмотреть в коде дополнительную проверку.

Property = Sender.Properties.ValueByName('Document')
if Property.ValueParamNames.Count > 0
  EDoc = Object.WorkflowParams.ValueByName(Property.ValueParamNames.Value).Value
else    
  EDoc = Property.Value
endif

Таким образом, если вы гипотетически допускаете, что в маршруте может быть потребность в изменении сохраненных параметров (а это могут быть не только документы), то при разработке блока стоит воспользоваться свойством Property.ValueParamNames и перечитывать значения параметров заново.

Пока комментариев нет.

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