В СБИС отправка документов похожа на отправку письма электронной почты. При формировании письма нужно:
- указать отправителя и получателя;
- заполнить тему письма, в электронном документе — набор вспомогательных реквизитов, например тип документа или регламент документооборота;
- приложить к письму вложения — электронные документы. В зависимости от содержимого вашего письма и настроек СБИС, дополнительно может потребоваться подписать или зашифровать вложения перед отправкой;
- отправить письмо.
Многие информационные системы появилось задолго до электронного документооборота и некоторые из них не умеют работать с 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 СБИС);
- обновление статуса ЭДО в ИС (Интеграционный модуль).
Максимальная скорость работы достигается алгоритмом при наибольшей загруженности всех параллельных потоков.
Чаще всего основной расход времени идет при подписании, шифровании, отправке и загрузке документов. Поэтому наиболее эффективным будет алгоритм:
- Интеграционный модуль отслеживает, чтобы одновременно отправлялось не более N документов (countThread).
- Как только освобождается поток для отправки (поступило событие / статус что документ отправлен), сразу же в него передается следующий документ.
- Пока заняты всех потоки отправки, интеграционный модуль готовит к отправке следующие документы (п.1-2), как правило достаточно иметь запас не превышающий количеству потоков.
- В случаях когда заняты все потоки и запас сформирован происходит обновление статуса ЭДО, т.к. в ряде случаев это то же может быть длительной операцией, она выполняется по одной на итерацию.
Пояснения к схеме
- 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 не опустеет.
Отправка электронных документов без формирования вложений
На входе имеем список объектов «Документ», подлежащих отправке, и набор относящихся к ним файлов вложений в каталоге. Нам требуется загрузить и запустить объект в документооборот СБИС, и, если надо, выполнить операции подписания и шифрования.