Очереди событий¶
Очереди событий предназначены для лучшего контроля обработки событий. Как правило, очереди используются при интеграции с внешними системами. Очереди состоят из потоков. Потоки удобно использовать для разделения событий из разных систем или разнородных событий из одной системы. Выполнение событий фиксируется в журнале очередей и журнале потоков.
В очередь могут попадать входящие и исходящие события.
Исходящее событие инициируется внутри системы "Первая Форма". Для этого должен выполниться пакет действий, в котором содержится смарт-действие Добавить новое событие в очередь — оно добавляет в указанный поток запись с нужными параметрами.
Входящее событие инициируется внешней системой. Для обработки входящих событий в "Первой Форме" настраиваются кастомные действия и к ним привязываются пакеты действий.
Обработка очереди запускается заданием по таймеру 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