СБИС¶
В процессе реализации системы обмена документами ключевым этапом является получение документов из системы электронного документооборота СБИС. Это включает в себя сохранение входящих файлов в файловое хранилище, что позволяет хранить исходные документы, их печатные версии и ФНС-архив, включая подписанные обеими сторонами документы в формате PDF. Также предусмотрено автоматизированное извлечение атрибутов формализованных документов, таких как дата, номер, тип документа, номер и дата договора, сумма и комментарий, а также основание. В дополнение к этому система способна обрабатывать данные неформализованных документов и извлекать атрибуты входящих пакетов, включая юридическое лицо, ИНН и КПП контрагента.
В системе СБИС¶
У пользователя, под которым идет работа, должна быть зарегистрирована электронная подпись в системе СБИС.
На рабочем месте пользователя¶
Чтобы подписывать и отправлять электронные документы в системе СБИС, необходимо использовать квалифицированную электронную подпись (КЭП). В СБИС можно работать с различными СКЗИ, например с КриптоПро CSP.
-
плагин КриптоПро (ссылка на сайт КриптоПро). Не забудьте его включить!
-
КриптоПро CSP (ссылка на сайт КриптоПро)
Технические требования к рабочему месту
В "Первой Форме"
Действия для настройки интеграции:
1. Добавьте сервис с типом Sbis.
2. Выберите его в качестве значения Sbis service в общих настройках приложения.
3. Убедитесь, что задание SyncEdocumentsFromSbisJob работает.
4. Добавьте пользовательский ключ SbisLastEventsId.
5. Автоматизируйте действия, которые могут потребоваться при интеграции со СБИС.
Доступные смарт-действия при создании пакета действий:
-
СБИС - Отправить отказ от аннулирования
-
СБИС - Отправить подписание
-
СБИС - Отправить подписанное извещение о получении
-
СБИС - Отправить подписанные соглашения об аннулировании
-
СБИС - Отправить подписанный отказ от подписи
-
СБИС - Отправить соглашение об аннулировании
-
СБИС - Отправить электронный документ
-
СБИС - Получить архив МЧД (возвращает System.Int32)
-
СБИС - Получить сертификаты (возвращает System.Int32)
-
СБИС - Получить статус МЧД (возвращает System.Int32)
-
СБИС - Получить тэги документа (возвращает System.Int32)
-
СБИС - Синхронизировать статусы документов в сообщении (возвращает System.Int32)
-
СБИС - Создать файл аннулирования подписи (возвращает TCClassLib.Orm.FileStorageFileInfo)
-
СБИС - Создать файл извещения о получении (возвращает TCClassLib.Orm.FileStorageFileInfo)
-
СБИС - Создать файлы отказа от аннулирования (возвращает TCClassLib.Orm.FileStorageFileInfo)
-
СБИС - Создать файлы отказа от подписи (возвращает TCClassLib.Orm.FileStorageFileInfo)
-
СБИС - Создать файлы подтверждения подписи (возвращает TCClassLib.Orm.FileStorageFileInfo)
Доступные смарт-действия при создании смарт-скрипта (LUA):
-
GenerateRejectionSbisSignature — Создать файл отказа от подписи
-
GenerateRevocationRejectionSbisSignature — Создать файл отказа от аннулирования
-
SbisAttachRejectSignature — Отправить подписанный отказ от подписи в СБИС
-
SbisAttachRevocationRequestedSignature — Отправить соглашение об аннулировании в СБИС
-
SbisAttachRevocationSignature — Отправить соглашение об аннулировании в СБИС
-
SbisAttachSignature — Отправить подписание в СБИС
-
SbisGenerateRevocationTitle — Создать файл аннулирования подписи
-
SyncMessageStatusSbis — Синхронизировать статусы документов в сообщении СБИС
Отклонение документа¶
Для отклонения сперва создается файл отказа от подписи с помощью смарт-действия GenerateRejectionSbisSignature.
Входящие параметры:
-
File* — ID файла
-
Reason* — Причина отказа
-
Thumbprint* — Отпечаток сертификата, находится в системе СБИС в информации о сертификатах для подписи
-
ServiceId* — ID сервиса
-
PowerOfAttorney* — МЧД. PowerOfAttorney должен представлять собой JSON вида:
{
"registerNumber":string, //Номер МЧД
"issuerInn": string, //ИНН доверителя
"useDefault": string
}
где: RegisterNumber — номер МЧД, IssuerInn — ИНН доверителя, useDefault — используется, если необходимо применять по умолчанию МЧД, которая указана в СБИС для пользователя/сервиса. Если в СБИС указана одна МЧД или установлена МЧД "по умолчанию", то при UseDefault = true будут проигнорированы документы, которые нельзя подписать с помощью этой МЧД. Необязательный параметр. В качестве значения указывается true или false без кавычек.
Смарт возвращает объект с параметрами: {FileId, VersionId, AttachmentId, DocumentId}. Сохраните AttachmentId, DocumentId и сам файл.
Файл необходимо подписать ЭЦП, отпечаток которой был передан в параметре Thumbprint.
Затем отправляется подписанный отказ от подписи в СБИС с помощью смарт-действия SbisAttachRejectSignature.
Входящие параметры:
-
File* — ID файла
-
RejectionFile* — ID файла отказа, который был получен из смарт-действия GenerateRejectionSbisSignature и затем подписан.
-
ServiceId* — ID сервиса
-
Signature* — Подпись
-
Reason* — Комментарий
-
AttachmentId* — Идентификатор титула
-
PowerOfAttorney* — МЧД. PowerOfAttorney должен представлять собой Json такого вида -
{
"registerNumber":string, //Номер МЧД
"issuerInn": string, //ИНН доверителя
"useDefault": string //
}
где: RegisterNumber — номер МЧД, IssuerInn — ИНН доверителя, useDefault — используется, если необходимо применять по умолчанию МЧД, которая указана в СБИС для пользователя/сервиса.
Пример:
SMART:execute_action('SbisAttachRejectSignature', TASKID, 'task', {
File = file,
RejectionFile = rejFile,
AttachmentId = '73e5ea53-3133-4954-9254-ca2b825abfc8',
Reason = 'test'
})
Предварительно создается файл аннулирования подписи с помощью смарт-действия SbisGenerateRevocationTitle.
Входящие параметры:
-
File* — ID файла. Может описывать любое вложение из документа, поскольку аннулируется весь документ, а не только отдельные вложения в нем.
-
Reason* — Причина аннулирования
-
Thumbprint* — Отпечаток сертификата, находится в системе СБИС в информации о сертификатах для подписи
-
ServiceId* — ID сервиса
-
PowerOfAttorney* — МЧД. PowerOfAttorney должен представлять собой Json такого вида -
{
"registerNumber":string, //Номер МЧД
"issuerInn": string, //ИНН доверителя
"useDefault": string //
}
где: RegisterNumber — номер МЧД, IssuerInn — ИНН доверителя, useDefault — используется, если необходимо применять по умолчанию МЧД, которая указана в СБИС для пользователя/сервиса.
Смарт возвращает массив объектов {FileId, VersionId, AttachmentId, DocumentId} для каждого вложения, которое есть в документе.
Пример:
return SMART:execute_action('SbisGenerateRevocationTitle', userId, 'user', {
File = file,
Reason = "test",
Thumbprint = "5C8D1DCDAAB1E199009ECA8CCD2383494BA57453"
})
После создания файла требуется отправить соглашение об аннулировании в СБИС с помощью смарт-действия SbisAttachRevocationSignature.
Входящие параметры:
-
Files* — ID файла. В параметр передается массив объектов { FileId, VersionId, AttachmentId, DocumentId }
-
ServiceId* — ID сервиса
-
Signature* — Подпись
-
Reason* — Комментарий
-
PowerOfAttorney* — МЧД. PowerOfAttorney должен представлять собой Json такого вида -
{
"registerNumber":string, //Номер МЧД
"issuerInn": string, //ИНН доверителя
"useDefault": string //
}
где: RegisterNumber — номер МЧД, IssuerInn — ИНН доверителя, useDefault — используется, если необходимо применять по умолчанию МЧД, которая указана в СБИС для пользователя/сервиса.
Пример:
local files = {
{ FileId = 1928371, VersionId = 1, AttachmentId = '15e1cc2e-2697-42ba-b0ea-4d4c90da475e', DocumentId = '6702d6d9-0e84-4458-9de2-b94c8ba946e1'},
{ FileId = 1928372, VersionId = 1, AttachmentId = '4db8c1aa-ce9b-4ec6-b07d-f5a8a12874cf', DocumentId = '6702d6d9-0e84-4458-9de2-b94c8ba946e1'}
}
SMART:execute_action('SbisAttachRevocationSignature', TASKID, 'task', {
Files = files,
Reason = "test"
})
При запросе на аннулирование в EdocumentSbisLink придет N количество вложений со статусом 27 — в ожидании аннулирования.
Они связаны с аннулируемыми вложениями только по DocumentId.
Для аннулирования документа с тем же DocumentId необходимо отправить соглашение об аннулировании в СБИС с помощью смарт-действия SbisAttachRevocationRequestedSignature.
Входящие параметры:
-
Files* — Файлы. В параметр передается массив объектов {FileId, VersionId, AttachmentId, DocumentId} для уже подписанных ЭЦП вложений на стороне "Первой Формы" со статусом 27 (в ожидании аннулирования).
-
ServiceId* — ID сервиса
-
Signature* — Подпись
-
Reason* — Комментарий
-
PowerOfAttorney* — МЧД. PowerOfAttorney должен представлять собой Json такого вида -
{
"registerNumber":string, //Номер МЧД
"issuerInn": string, //ИНН доверителя
"useDefault": string //
}
где: RegisterNumber — номер МЧД, IssuerInn — ИНН доверителя, useDefault — используется, если необходимо применять по умолчанию МЧД, которая указана в СБИС для пользователя/сервиса.
В данном смарт-действии первостепенно необходимо заполнить FileId и VersionId, т.к. они сохраняются в таблице EdocumentSbisLink и вы получаете его контент, когда он придет как "новый документ". Стоит понимать, что это не полноценный "новый документ", а только соглашение на аннулирование.
Отклонение аннулирования входящего документа¶
Предварительно создается файл отказа от аннулирования с помощью смарт-действия GenerateRevocationRejectionSbisSignature.
Входящие параметры:
-
File* — ID файла. Может описывать любое вложение из документа, поскольку аннулируется весь документ, а не только отдельные вложения в нем.
-
Reason* — Причина отказа
-
Thumbprint* — Отпечаток сертификата, находится в системе СБИС в информации о сертификатах для подписи
-
ServiceId* — ID сервиса
-
PowerOfAttorney* — МЧД. PowerOfAttorney должен представлять собой Json такого вида -
{
"registerNumber":string, //Номер МЧД
"issuerInn": string, //ИНН доверителя
"useDefault": string //
}
где: RegisterNumber — номер МЧД, IssuerInn — ИНН доверителя, useDefault — используется, если необходимо применять по умолчанию МЧД, которая указана в СБИС для пользователя/сервиса.
Смарт возвращает массив объектов {FileId, VersionId, AttachmentId, DocumentId} для каждого вложения, которое есть в документе. Эти документы должны быть подписаны
После создания файла требуется отправить отказ от аннулирования в СБИС с помощью смарт-действия SbisAttachRevocationRejectionSignature.
Входящие параметры:
-
Files* — ID файла. В параметр передается массив объектов { FileId, VersionId, AttachmentId, DocumentId } из файлов, которые были получены в действии GenerateRevocationRejectionSbisSignature и затем подписаны.
-
ServiceId* — ID сервиса
-
Signature* — Подпись
-
Reason* — Комментарий
-
PowerOfAttorney* — МЧД. PowerOfAttorney должен представлять собой Json такого вида -
{
"registerNumber":string, //Номер МЧД
"issuerInn": string, //ИНН доверителя
"useDefault": string //
}
где: RegisterNumber — номер МЧД, IssuerInn — ИНН доверителя, useDefault — используется, если необходимо применять по умолчанию МЧД, которая указана в СБИС для пользователя/сервиса.
Логирование ответов¶
В "Первой Форме" есть возможность логировать ответы при интеграции с сервисом СБИС. По умолчанию логирование отключено.\ Для его включения необходимо добавить пользовательский ключ SbisLastEventsId и установить его в значении true.
ℹ️ SbisLastEventsId хранит ID последнего обработанного события (числовое значение), а не флаг. Для включения расширенного логирования уточните актуальный ключ в документации СБИС.
После включения в системе будут логироваться все события, в том числе определяется новый ли это документ или происходит изменение уже существующего.
Записи в журнале не появляются, если при итерации заданий не было событий на обработку.
Полезные ссылки¶
Использование JINT/SmartScript для кастомизации ЭДО¶
Начиная с версии 2.267 часть бизнес-логики интеграции со СБИС может быть реализована не только через встроенные C# смарт-действия, но и через системные библиотеки SmartScript на JavaScript (JINT).
Базовая библиотека eds-common подключается первой и предоставляет общие функции: HTTP-вызовы, SQL-хелперы, логирование, кэш токенов, загрузку файлов и работу с JSON. Для интеграции со СБИС дополнительно подключается библиотека sbis-api.
Это позволяет вынести клиентскую бизнес-логику, маршрутизацию, обработку ответов API и сценарии обмена документами в SmartScript без доработки ядра и без новой сборки приложения.
Рекомендуемый шаблон подключения:
include("[edo] eds-common");
include("[edo] sbis-api");
Новые сценарии рекомендуется писать на JavaScript. При этом прежние C#-смарт-действия сохраняют работоспособность и могут использоваться параллельно.
Для отладки JINT-сценариев следует использовать инфраструктуру логирования SmartScript.
В JINT-реализации основные операции выполняются синхронно и возвращают результат сразу в момент вызова скрипта, тогда как очередь сообщений используется главным образом для сценариев синхронизации статусов и входящих документов.