Отправить документы

Отправить документы

В СБИС отправка документов похожа на отправку письма электронной почты. При формировании письма нужно:

  • указать отправителя и получателя;
  • заполнить тему письма, в электронном документе — набор вспомогательных реквизитов, например тип документа или регламент документооборота;
  • приложить к письму вложения — электронные документы. В зависимости от содержимого вашего письма и настроек СБИС, дополнительно может потребоваться подписать или зашифровать вложения перед отправкой;
  • отправить письмо.

Многие информационные системы появилось задолго до электронного документооборота и некоторые из них не умеют работать с JSON, BASE64, криптографией, шифрованием, HTTPS или делают это недостаточно эффективно — работают исключительно синхронно (последовательно). В ExtSdk2 имеется набор вспомогательных инструментов, который помогает решить эти проблемы.

Отправка электронного документа

Отправка любого комплекта документов в СБИС состоит из 3 этапов.

Записать документ в СБИС

Результат этапа — в одном из реестров СБИС будет создан объект «Документ» — карточка документа.

В СБИС записываются все необходимые данные. В зависимости от размера и количества файлов эта операция может выполняться за один или несколько вызовов. Реквизиты «Тип» и «Регламент» определяют поведение документа в системе и атрибутный состав. К любому документу СБИС может быть прикреплено неограниченное количество вложений. Это могут быть формализованные или не формализованные файлы любого размера.

Загрузите файлы вложения:

  • вызовите для каждого вложения метод записи WriteAttachment,
  • передайте данные вложения в метод записи документа WriteDocument.

Подготовить действие

Результат — объект «Документ» подготовлен к переходу на следующий этап документооборота. Метод PrepareAction.

На этом этапе нужно передать в СБИС информацию о действии над документом. СБИС:

  • проверит достаточность данных;
  • выполнит вспомогательные операции — допишет в документы идентификаторы участников документооборота, переименует вложения в соответствии с форматом;
  • конвертирует XML в PDF для контрагентов в роуминге;
  • определит какие файлы нужно подписать, какой подписью и в каком формате это сделать.

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

Выполнить действие

Результат — над объектом «Документ» выполнено действие и он подготовлен к переходу на следующий этап документооборота. Метод ExecuteAction.

СБИС загружает подписи и недостающие файлы и отправляет документ.

Комплексный метод отправки электронного документа

Для облегчения интеграции в ExtSdk2 реализован комплексный метод WriteDocumentEx. Он выполняет несколько операций за один вызов — WriteDocument + PrepareAction + ExecuteAction.

Более подробную информацию о том, как вызывать методы и получать ответы от ExtSdk2 см. в разделе Подключиться к ExtSdk2 через OLE.

Массовая отправка электронных документов

Задача алгоритма массовой отправки — эффективно формировать и отправлять пакеты документов. Алгоритм предназначен для систем с синхронным исполнением кода, которые будут использовать ExtSdk2 через OLE объект.

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

Общее время отправки документа складывается из следующих операций:

  • получение данных из ИС для формирования электронного документа (интеграционный модуль);
  • формирование электронного документа (интеграционный модуль + ExtSdk2);
  • подписание, шифрование электронного документа (ExtSdk2 + СКЗИ);
  • загрузка и отправка электронного документа (ExtSdk2 + API СБИС);
  • получение статуса отправки (ExtSdk2 + API СБИС);
  • обновление статуса ЭДО в ИС (Интеграционный модуль).

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

Чаще всего основной расход времени идет при подписании, шифровании, отправке и загрузке документов. Поэтому наиболее эффективным будет алгоритм:

  1. Интеграционный модуль отслеживает, чтобы одновременно отправлялось не более N документов (countThread).
  2. Как только освобождается поток для отправки (поступило событие / статус что документ отправлен), сразу же в него передается следующий документ.
  3. Пока заняты всех потоки отправки, интеграционный модуль готовит к отправке следующие документы (п.1-2), как правило достаточно иметь запас не превышающий количеству потоков.
  4. В случаях когда заняты все потоки и запас сформирован происходит обновление статуса ЭДО, т.к. в ряде случаев это то же может быть длительной операцией, она выполняется по одной на итерацию.

Пояснения к схеме

  • countAll — количество документов, которые требуется отправить;
  • countThread — количество потоков отправки;
  • countFreeThread — количество свободных потоков отправки;
  • countSend — количество документов, по которым запущена процедура отправки;
  • countComplete — количество документов, по которым отправка завершена, в т.ч. обновлен статус отправки;
  • countError — количество ошибок;
  • countPrepare — количество подготовленных к отправке документов;
  • cachePrepare — массив с данными, подготовленных к отправке документов. Эти данные достаточно передать методу отправки;
  • cacheAnswer — массив с результатами отправки;
  • getData — получает из информационной системы данные и формирует комплект электронных документов с нужными метаданными. Подготовленный объект сохраняет в cachePrepare;
  • sendDocFromCache — берет первый документ из cachePrepare и вызывает метод отправки ExtSdk2.WriteDocumentEx. По идентификатору запроса регистрирует обработчик обратного вызова. Обновляет счетчики свободных потоков и количества подготовленных/отправленных документов;
  • readEvents — получает одну страницу событий (OLE.ReadAll). Если пришел ответ, результат отправки (есть зарегистрированный обработчик обратного вызова — вызываем);
  • callback WriteDocumentEx — обработчик обратного вызова отправки документов. Вызывается, когда приходит событие с результатом отправки (положительным или отрицательным). В любом случае, помечаем, что освободился поток отправки, положительный результат и критическую ошибку помещаем в массив с необработанными результатами. Для временных ошибок, если не достигнут лимит повторных отправок, запускаем отправку документа заново.
  • processAnswer — берет первые N записей из chacheAnswer и обновляет статусы у документа. N определяем динамически по времени работы метода. Начинаем с N = countThread и рассчитываем после каждого выполнения, сколько помещается в 3 секунды, исходя из среднего времени на один статус;
  • processAllAnswer — вызывает processAnswer пока chacheAnswer не опустеет.

Отправка электронных документов без формирования вложений

На входе имеем список объектов «Документ», подлежащих отправке, и набор относящихся к ним файлов вложений в каталоге. Нам требуется загрузить и запустить объект в документооборот СБИС, и, если надо, выполнить операции подписания и шифрования.

Нашли неточность? Выделите текст с ошибкой и нажмите ctrl + enter.