Перейти к содержанию

Очереди событий

Очереди событий предназначены для лучшего контроля обработки событий. Как правило, очереди используются при интеграции с внешними системами. Очереди состоят из потоков. Потоки удобно использовать для разделения событий из разных систем или разнородных событий из одной системы. Выполнение событий фиксируется в журнале очередей и журнале потоков.

В очередь могут попадать входящие и исходящие события.

Исходящее событие инициируется внутри системы "Первая Форма". Для этого должен выполниться пакет действий, в котором содержится смарт-действие Добавить новое событие в очередь — оно добавляет в указанный поток запись с нужными параметрами.

Входящее событие инициируется внешней системой. Для обработки входящих событий в "Первой Форме" настраиваются кастомные действия и к ним привязываются пакеты действий.

Обработка очереди запускается заданием по таймеру QueueEventsJob.

Потоки

На странице Потоки можно создать потоки и настроить стратегию их обработки.

Для добавления нового потока нажмите кнопку Создать и в открывшемся окне заполните обязательные поля.

Настройки потока:

Параметр Описание
ID Уникальный идентификатор потока, заполняется автоматически
Название потока Название потока
Неудачных попыток до полной остановки Количество неудачных попыток. После того, как счетчик достигнет этой цифры, обработка потока будет остановлена.
Поведение в случае ошибки Поведение в случае ошибки. Возможные значения: "Пропускать", "Останавливать".
Если выбрано значение "Пропускать" в случае возникновения ошибки в очереди, обработка остальных событий не прекращается. Счетчик неудачных попыток при этом увеличен не будет.
Если выбрано значение "Останавливать" в случае возникновения ошибки при обработке одного из событий обработка остальных событий прекращается и увеличивается счетчик неудачных попыток. Администратор должен удалить ошибочное событие из очереди или исправить ошибку (объект, над которым выполняется действие) и запустить выполнение события вручную.
Есть ошибки Наличие флажка означает, что в потоке есть ошибки обработки очереди

Для редактирования существующего потока нажмите на него в списке.

Для удаления потока нажмите кнопку Удалить на форме редактирования или выберите пункт Удалить в контекстном меню строки.

Очереди событий

На странице Очереди событий можно создать события, к которым потом будут привязываться смарт-пакеты (по аналогии с произвольными событиями в категориях).

Для добавления новой очереди нажмите кнопку Создать и в открывшемся окне заполните название и описание очереди.

Настройки очереди:

Параметр Описание
ID Уникальный идентификатор события, заполняется автоматически
Название события Название события
Описание Описание действия в свободной форме

Для редактирования существующей очереди нажмите на нее в списке.

Для удаления очереди нажмите кнопку Удалить на форме редактирования или выберите пункт Удалить в контекстном меню строки.

Привязки кастомных действий

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

Для создания новой привязки действия нажмите кнопку Создать и в открывшемся окне выберите очередь и пакет действий. При необходимости укажите фильтр.

Настройки привязки:

Параметр Описание
Название события Событие, при наступлении которого вызывается пакет действий
Smart фильтр Условия, при которых пакет действий выполняется. Если смарт-фильтр не задан, то условия не проверяются, и пакет действий выполняется всегда
Пакет действий Пакет, который выполняется при наступлении события

Для редактирования привязки выберите пункт Редактировать в контекстном меню строки.

В открывшемся окне внесите изменения и нажмите кнопку Сохранить.

Для удаления привязки выберите пункт Удалить в контекстном меню строки.

Системные события, к которым можно привязать пакеты действий

Событие Описание
ChangeEdocumentStatus Изменился статус электронного документа в системе Диадок
ReceiveNewEdocument Получен новый электронный документ через систему Диадок

Пример использования очереди событий

Пример использования очереди исходящих событий

Пример: Массовая рассылка сообщений, инициируемая внутри системы "Первая Форма".

Порядок действий:

1. На странице Потоки создайте поток по кнопке + и настройте стратегию его обработки

2. На странице Очереди событий создайте событие, к которому будет привязан смарт-пакет

3. На странице Привязки действий к событиям привяжите смарт-пакет к кастомному событию

4. Создайте пакет действий, в котором содержится смарт-действие Добавить новое событие в очередь

Пример использования очереди входящих событий

Пример: Изменение статуса документа в системе Диадок.

Порядок действий:

1. На странице Привязки действий к событиям привяжите действие к системному событию ChangeEdocumentStatus.

2. В пакете действий настройте смарт-действие "Выполнить смарт-скрипт".

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

Контекст события:

Для обработки поступающих событий в Lua можно использовать параметр CONTEXT, который содержит JSON вида: {"inn":"...","created":"...","kpp":"...","type":"...","fileVersion":"...","id":"...","direction":"...","status":"...","field":"..."} -inn — ИНН -kpp — КПП -created — дата создания -type — тип документа в Диадоке. Возможные значения: oNonformalized — неформализованный документ (значение по умолчанию) oInvoice — счет-фактура oInvoiceRevision — исправление счета-фактуры oInvoiceCorrection — корректировочный счет-фактура oInvoiceCorrectionRevision — исправление корректировочного счета-фактуры oTrustConnectionRequest — запрос на инициацию канала обмена документами через Диадок oTorg12 — товарная накладная ТОРГ-12 oAcceptanceCertificate — акт о выполнении работ / оказании услуг oProformaInvoice — счет на оплату oXmlTorg12 — товарная накладная ТОРГ-12 в XML-формате oXmlAcceptanceCertificate — акт о выполнении работ / оказании услуг в XML-формате oPriceList — ценовой лист oPriceListAgreement — протокол согласования цены oCertificateRegistry — реестр сертификатов oReconciliationAct — акт сверки oContract — договор oTorg13 — накладная ТОРГ-13 oServiceDetails — детализация oSupplementaryAgreement — дополнительное соглашение к договору oUniversalTransferDocument — универсальный передаточный документ (УПД) oUniversalTransferDocumentRevision — исправление универсального передаточного документа oUniversalCorrectionDocument — универсальный корректировочный документ (УКД) oUniversalCorrectionDocumentRevision — исправление универсального корректировочного документа oUnknownDocumentType — неизвестный тип документа; может выдаваться лишь в случае, когда клиент использует устаревшую версию SDK и не может интерпретировать тип документа, переданный сервером -fileId — ID файла -fileVersion — версия документа -id — ID электронного документа -direction — Inbound для входящих, Outbound для исходящих -status — статус документа. Возможные значения: oUnknown — по какой-то причине Диадок не может вернуть статус документа oNotAcceptable — ответного действия не требуется. Либо это односторонний документ (например, счет, счет-фактура и УПД СЧФ), либо документ с опциональным запросом подписи, которая не была запрошена. Также сюда относится однотитульный акт (XmlAcceptanceCertificate) oWaiting — ожидается ответное действие получателя документа. Если документ исходящий, то никаких действий не требуется; если входящий — нужно подписать документ или отклонить подпись oSigned — получатель подписал документ oRejected — получатель отклонил подпись Пример Lua-скрипта для события ChangeEdocumentStatus:

-- Меняем статус документа в зависимости от сообщения, полученного из Диадока
-- State = 3 — статус Завершено
-- State = 4 — статус Отклонено
-- InitUser = 3 и CommentAuthor = 3 — здесь 3 это ID пользователя Systemrobot

-- ищем номер задачи, в которой файл подписан с помощью ЭП
local taskId = SQL:scalar([[
   SELECT TOP 1 TaskId
   FROM
       EdsFileInfo
   WHERE SignedFileId = @fileId AND SignedFileVersionId = @fileVersion
]], {fileId = CONTEXT.FileId, fileVersion = CONTEXT.FileVersionId});
-- в зависимости от статуса, пришедшего из Диадока, меняем статус найденной задачи и пишем комментарий
if CONTEXT.Status == "Signed" then

   SMART:execute_action('ChangeTaskStateForcibly', taskId, "task", { Task = taskId, InitUser = 3, State = 3, DoNotCheckRights = true, DoNotWriteComment = true, DoNotThrowErrors = true})

   SMART:execute_action('PostComment', taskId, "task", { CommentAuthor = 3, CommentText = "Контрагент подписал документ.", Task = taskId, ForcedEmail = false, CommentSMS = false, NoSubscription = true, TextAsHTML = false})
elseif CONTEXT.Status == "Rejected" then

   SMART:execute_action('ChangeTaskStateForcibly', taskId, "task", { Task = taskId, InitUser = 3, State = 4, DoNotCheckRights = true, DoNotWriteComment = true, DoNotThrowErrors = true})

   SMART:execute_action('PostComment', taskId, "task", { CommentAuthor = 3, CommentText = "Контрагент отказал в подписи. Причина: '" .. CONTEXT.StatusMessage .. "'", Task = taskId, ForcedEmail = false, CommentSMS = false, NoSubscription = true, TextAsHTML = false})
end
RESULT = taskId

Очереди событий в прежнем интерфейсе администрирования