Здравствуйте, такой вопрос, как в бизнес процессе можно отследить, что в файлах контрагента появилась новая запись?
Нравится
Николай, добрый день.
Например, можно написать функцию, которая по ID контрагента выполняет запрос на выборку из таблицы tbl_FileInAccount, где значение поля AccountID равно значению ID контрагента, а дата создания записей в таблице больше некоторого системного параметра, предварительно созданного. Если запрос возвращает значения, значит, новые файлы появились. Присваиваем результирующей переменной значение true, если запрос содержит записи, иначе - false. Обновляем системный параметр текущей датой и возвращаемся в БП.
Для реализации необходимо создать запрос sq_CheckNewFilesInAccount такого вида:
select ID from tbl_FileInAccount where AccountID = :AccountID and CreatedOn > :LastCheckDate
Также, как уже говорилось, необходимо создать системный параметр для хранения даты последней проверки.
Пример функции проверки:
function CheckAreNewFilesInAccount(AccountID) { var CheckQuery = GetSingleItemByCode('sq_CheckNewFilesInAccount'); var LastCheckDate = GetSystemParameterValueEx('LastCheckDate', false); ApplySelectQueryFilter(CheckQuery, 'AccountID', AccountID, true); SetParameterValue(CheckQuery.Parameters, 'LastCheckDate', LastCheckDate); var CheckDataset = CheckQuery.Open(); var Result = !IsDatasetEmpty(CheckDataset); CheckDataset.Close(); SetSystemParameterValue('LastCheckDate', new Date().getVarDate()); return Result; }
Олег, спасибо за ответ. Получается что где то надо будет постоянно выполнять эту функцию пока запрос не вернет значение?
Ну почему же постоянно? Насколько я понял, Вам необходимо при создании определённого элемента БП узнать, появились ли новые файлы у контрагента. Тогда вызываем функцию проверки при обработке событий этого элемента.
Или я Вас неправильно понял, и Вам необходимо отслеживать именно момент появления нового файла, и при появлении запускать БП? В таком случае можно (по аналогии с напоминаниями) выполнять эту функцию в обработке TimerOnTimer скрипта scr_Main, и если она возвращает true, запускать БП. Второй вариант - через триггер на OnInsert таблицы tbl_FileInAccount, но я бы его не рекомендовал, так как он гораздо сложнее в реализации.
Да, мне нужно именно момент появления нового файла, я думал, но это получится же что постоянно запросы к базе будут посылаться, или на скорости работы не скажется?
Да, запросы будут посылаться. То же самое происходит и в механизме напоминаний - система с заданной периодичностью посылает запрос в базу на выборку из таблицы напоминаний.
Что касается скорости, я не думаю, что она так уж заметно изменится. Вряд ли Вы будете добавлять в систему по несколько сотен файлов одновременно, а запрос построен таким образом, чтобы выбирать только последние записи из таблицы, а не все.
Олег, спасибо за помощь) буду делать.. А как потом запустить дальше бизнес процесс.. Ну принцип такой, создается задача, она выполняется и пока файл к контрагенту не добавился, следующая задача не начинается.
Один из примеров - реализовать БП таким образом:
1) Добавить в БП параметр, отвечающий за шаг, с которого будет запускаться БП (например, StepNumber). Если значение параметра не определено - БП запускается с начала.
2) В начале БП добавить элемент "Выбор", в котором проверять значение параметра StepNumber. Если его значение равно номеру задачи, которая должна выполняться после добавления файла, переходить сразу на эту задачу. Иначе - запускать БП с первого шага.
3) Убрать переход между задачами "перед созданием файла" и "после создания" (или направить первую задачу в конец БП).
4) После выполнения функции проверки на новые файлы (в обработчике TimerOnTimer) анализировать её результат и в случае положительного результата запускать БП (WFStartByID) с установленным параметром StepNumber.
Возможное неудобство этого решения - фактически БП разбивается на две части, и физически задачи будут принадлежать разным процессам. Если это критично, необходимо искать другое решение.
Например, перед выполнением блока
if ((!TaskEdit.StatusChanged) || (!IsFinished) || (IsEmptyGUID(WorkflowItemID))) { return; }
добавить проверку на название элемента процесса (и название процесса). Если они совпадают с нужными нам элементом и процессом, выходить из функции даже при условии IsFinished = true (переход к следующему элементу БП осуществляется вызовом WorkflowEngine.ProcessWorkflowItem(WorkflowItemID)).
Далее, в случае появления нового файла у контрагента анализировать все связанные с ним задачи. Если найдётся выполненная задача, связана с элементом БП, состояние которого не равно "Выполнен" (элемент перечисления "Состояние элемента процесса" с кодом ws_Done), выполняем для этого элемента WorkflowEngine.ProcessWorkflowItem(WorkflowItemID).