# Смарт-действия ЭДО: Диадок и СБИС

> Документ охватывает все смарт-действия, связанные с электронным документооборотом через Диадок и СБИС.
> Группа действий: «Работа с ЭДО»
>
> **Терминология.** Интеграция настраивается для конкретного клиента. Все стороны, с которыми клиент обменивается документами — это **контрагенты**, независимо от направления передачи.

---

## Архитектурный паттерн

Действия делятся на два паттерна исполнения:

**Синхронные** — сразу выполняют операцию и возвращают результат. Используются для операций чтения, генерации файлов и проверки статусов.

**Через очередь** — помещают событие в очередь и возвращают управление. Используются для отправки документов и подписей — операций, требующих гарантированной доставки и повторных попыток при сбое.

**МЧД во всех операциях подписания.** Параметр `МЧД` типа `string` присутствует почти во всех действиях, связанных с подписью. Передаётся как JSON. Поддерживает подписание по машиночитаемой доверенности (63-ФЗ).

---

## Диадок

MCP-группа: `EdiDiadoc = 16` («ЭДО Диадок»)

> **Если действие падает с «Unauthorized».** Текст `Invalid auth token` (код `DiadocErrorCode: Http.Auth`) означает отказ Диадока в уже выданном токене, а не ошибку учётных данных. Для операций чтения и формирования XML платформа обновляет токен и повторяет вызов сама; для отправки, удаления и восстановления документа автоматического повтора нет — действие нужно повторить вручную. Подробности и разбор по журналам — в гайде ЭДО: решение проблем.
Тип сервиса: `ServiceType.Diadoc = 7`
Таблица учётных данных: `DiadocServiceCredentials`
Фоновая синхронизация: `SyncEdocumentsFromDiadocJob`

**Авторизация сервиса.** Сервис настраивается на вход по логину и паролю либо по OpenID Connect; порядок настройки, поля OIDC и обновление токена — в [admin.md](https://help.1forma.ru/domains/integrations/admin.md), раздел «Диадок (ЭДО)».

![Форма настройки сервиса Diadoc в AdminSPA: подключение, BoxId, ClientId, API Url](https://help.1forma.ru/help-images/integrations/diadoc-service-settings.png)

---

### Диадок — Отправить электронный документ

**Enum:** `SendEdocument = 113`
**Исполнение:** через очередь

**Что делает и зачем:**
Отправляет файл из хранилища 1Ф контрагенту через Диадок. Основная точка входа для исходящего документооборота. Поддерживает счета-фактуры, УПД, акты и неформализованные документы. Можно запросить ответную подпись от контрагента.

| # | Параметр | Тип | Обяз. | Описание |
|---|----------|-----|-------|----------|
| 0 | ID файла | `FileFromLibrary` | ✓ | Ссылка на файл в хранилище 1Ф, который будет отправлен контрагенту. Для формализованных документов (УПД, СФ) должен быть корректный XML в формате ФНС; для неформализованных — любой формат |
| 1 | ИНН контрагента | `string` | ✓ | ИНН организации-получателя. Используется Диадок для поиска ящика контрагента и маршрутизации документа |
| 2 | КПП контрагента | `string` | ✓ | КПП организации-получателя. Совместно с ИНН однозначно определяет юридическое лицо или его обособленное подразделение |
| 3 | Нужна ли ответная подпись | `bool` | — | Если `true` — документ отправляется с требованием ответной подписи от контрагента. Актуально для актов, УПД и других двусторонних документов |
| 4 | Тип документа | `string` | — | Тип документа по классификатору Диадок (например: `UniversalTransferDocument`, `Invoice`, `Nonformalized`). Определяет схему валидации и правила маршрутизации в ЭДО |
| 5 | Сумма | `decimal` | — | Сумма документа. Обязательна для счетов-фактур и платёжных документов; подставляется в метаданные при отправке |
| 6 | ID сервиса | `int?` | — | Идентификатор настройки подключения к Диадок из справочника сервисов 1Ф. Если не указан — используется настройка по умолчанию из конфигурации |
| 7 | Уникальный идентификатор организации | `string` | — | `BoxId` ящика отправителя в системе Диадок. Используется когда у организации несколько ящиков (разные юридические лица или подразделения). Если не указан — берётся ящик из настроек сервиса |
| 8 | Подпись | `string` | — | Электронная подпись документа в формате Base64 (CMS/PKCS#7). Если не передана — используется подпись, сформированная на стороне 1Ф (если была). Заполняется только при серверном подписании вне 1Ф |
| 9 | МЧД | `string` | — | Машиночитаемая доверенность в формате JSON. Передаётся когда сотрудник подписывает документ по доверенности, а не собственной ЭП |
| 10 | Номер договора | `string` | — | Номер договора, к которому относится отправляемый документ. Заполняется в реквизитах документа для привязки к договорной базе |
| 11 | К договору | `string` | — | Номер основного договора при отправке приложений и дополнений к нему. Позволяет Диадок связать документ с родительским договором |
| 12 | От (к договору) | `string` | — | Дата основного договора в строковом формате. Используется совместно с параметром «К договору» для полной идентификации договора в реквизитах |
| 13 | Исходный ящик | `string` | — | `BoxId` ящика, от имени которого отправляется документ. Актуален при роуминге или наличии нескольких зарегистрированных ящиков у одной организации |
| 14 | Дата документа | `string` | — | Дата составления документа в строковом формате. Подставляется в метаданные при отправке, если не содержится в XML-файле документа |
| 15 | Код валюты | `string` | — | Цифровой код валюты по классификатору ОКВ (например: `643` — рубль, `840` — доллар США). Используется при формировании счетов-фактур |

---

### Диадок — Получить документ

**Enum:** `ReceiveMissedDocDiadoc = 150`
**Исполнение:** синхронный
**Возвращает:** ничего

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

| # | Параметр | Тип | Обяз. | Описание |
|---|----------|-----|-------|----------|
| 0 | MessageId | `string` | ✓ | Идентификатор сообщения в системе Диадок (GUID). Каждый обмен документами между ящиками образует сообщение; `MessageId` — его уникальный идентификатор |
| 1 | EntityId | `string` | ✓ | Идентификатор конкретной сущности внутри сообщения (GUID). Сообщение может содержать несколько сущностей (файл документа, подписи, извещения); `EntityId` указывает на нужную |
| 2 | ServiceId | `int?` | — | Идентификатор настройки подключения к Диадок |

---

### Диадок — Получить контрагентов

**Enum:** `GetCounteragents = 164`
**Исполнение:** синхронный
**Возвращает:** `string` (JSON-массив)

**Что делает и зачем:**
Возвращает список контрагентов, зарегистрированных в ящике Диадок. Используется для наполнения справочников в 1Ф, проверки наличия ЭДО-подключения с контрагентом перед отправкой документа.

| # | Параметр | Тип | Обяз. | Описание |
|---|----------|-----|-------|----------|
| 0 | ID сервиса | `int` | ✓ | Идентификатор настройки подключения к Диадок. Обязателен — при нескольких ящиках нужно явно указать из какого запрашивать список контрагентов |

---

### Диадок — Сохранить контент электронного документа

**Enum:** `SaveEdocumentContentByLink = 114`
**Исполнение:** синхронный, контекст `EdocumentLink`
**Возвращает:** `FileFromLibrary`

**Что делает и зачем:**
Скачивает XML/бинарное содержимое электронного документа от контрагента из Диадок и сохраняет его как файл в хранилище 1Ф. Результат — ссылка на файл, которую можно прикрепить к задаче или карточке.

| # | Параметр | Тип | Обяз. | Описание |
|---|----------|-----|-------|----------|
| 0 | ID ссылки на электронный документ | `int` | ✓ | Идентификатор записи `EdocumentLink` — внутренней ссылки, связывающей документ в Диадок с объектами системы 1Ф. Через неё определяются `MessageId`, `EntityId` и другие реквизиты для скачивания |
| 1 | ID сервиса | `int?` | — | Идентификатор настройки подключения к Диадок |

---

### Диадок — Сохранить печатную форму электронного документа

**Enum:** `SaveEdocumentPrintFormByLink = 115`
**Исполнение:** синхронный, контекст `EdocumentLink`
**Возвращает:** `FileFromLibrary`

**Что делает и зачем:**
Скачивает PDF-печатную форму документа из Диадок и сохраняет в хранилище 1Ф. Нужен когда к карточке задачи или документа необходимо приложить человекочитаемую версию ЭД.

| # | Параметр | Тип | Обяз. | Описание |
|---|----------|-----|-------|----------|
| 0 | ID ссылки на электронный документ | `int` | ✓ | Идентификатор записи `EdocumentLink`. Диадок генерирует печатную форму на своей стороне по данным из XML |
| 1 | ID сервиса | `int?` | — | Идентификатор настройки подключения к Диадок |

---

### Диадок — Сохранить архив с файлами подписей электронного документа

**Enum:** `SaveEdocumentArchiveFormByLink = 127`
**Исполнение:** синхронный, контекст `EdocumentLink`
**Возвращает:** `FileFromLibrary` (ZIP-архив)

**Что делает и зачем:**
Скачивает ZIP-архив с файлом документа и всеми подписями к нему. Флаг «Весь документооборот» (`true` по умолчанию) выгружает полную цепочку: оба титула, извещения, подписи всех сторон. Нужен для долгосрочного архивного хранения ЭД.

| # | Параметр | Тип | Обяз. | Описание |
|---|----------|-----|-------|----------|
| 0 | ID ссылки на электронный документ | `int` | ✓ | Идентификатор записи `EdocumentLink` |
| 1 | ID сервиса | `int?` | — | Идентификатор настройки подключения к Диадок |
| 2 | Весь документооборот | `bool?` | — | Если `true` (по умолчанию) — в архив включается полный документооборот: файлы обеих сторон, все служебные документы (извещения, титулы, подписи). Если `false` — только основной файл с подписями |

---

### Диадок — Сохранить контент аннулирования электронного документа

**Enum:** `SaveRevocationFile = 143`
**Исполнение:** синхронный, контекст `EdocumentLink`
**Возвращает:** `FileFromLibrary`

**Что делает и зачем:**
Скачивает и сохраняет в хранилище 1Ф файл аннулирования, присланного контрагентом. Используется как подготовительный шаг перед ответом на запрос аннулирования — после этого файл передаётся в действие «Отправить подписанный файл об аннулировании».

> **Примечание.** Рекомендуется вызывать в обработчике события `change` Диадок: именно в нём приходит уведомление о том, что контрагент инициировал аннулирование.

| # | Параметр | Тип | Обяз. | Описание |
|---|----------|-----|-------|----------|
| 0 | ID ссылки на электронный документ | `int` | ✓ | Идентификатор записи `EdocumentLink` документа, по которому контрагент прислал запрос аннулирования |
| 1 | ID сервиса | `int?` | — | Идентификатор настройки подключения к Диадок |

---

### Диадок — Сгенерировать пустой xml титул покупателя для документа

**Enum:** `GenerateXmlBuyerTitle = 131`
**Исполнение:** синхронный
**Возвращает:** `FileFromLibrary` (пара ID файла + ID версии)

**Что делает и зачем:**
Создаёт XML-файл ответного титула покупателя для УПД или акта — заготовку для подписи со стороны клиента. Параметры JSON позволяют подставить реквизиты организации. Используется в двустороннем документообороте, когда клиент должен сформировать и подписать свою часть.

| # | Параметр | Тип | Обяз. | Описание |
|---|----------|-----|-------|----------|
| 0 | ID файла | `FileFromLibrary` | ✓ | Ссылка на исходный документ контрагента (УПД или акт), для которого генерируется ответный титул. На основании его структуры Диадок формирует схему титула |
| 1 | ID сервиса | `int?` | — | Идентификатор настройки подключения к Диадок |
| 2 | Параметры для титула в формате JSON | `string` | — | JSON-объект с реквизитами клиента для заполнения полей титула (ИНН, наименование, ФИО и должность подписанта, дата принятия) |
| 3 | Параметры для титула в формате JSON (формат 970) | `string` | — | JSON-объект с реквизитами для титула по формату приказа ФНС № ЕД-7-26/970@ (действует с 2023 года). Используется когда документ контрагента создан в новом формате |

---

### Диадок — Сгенерировать xml титул для документа

**Enum:** `GenerateXmlTitle = 132`
**Исполнение:** синхронный
**Возвращает:** `FileFromLibrary` (пара ID файла + ID версии)

**Что делает и зачем:**
Аналог предыдущего, но принимает уже готовый XML-файл с данными вместо JSON-параметров. Используется когда XML-данные для титула формируются отдельным шагом автоматизации.

| # | Параметр | Тип | Обяз. | Описание |
|---|----------|-----|-------|----------|
| 0 | ID файла | `FileFromLibrary` | ✓ | Ссылка на исходный документ контрагента, для которого генерируется XML-титул |
| 1 | ID xml файла | `FileFromLibrary` | ✓ | Ссылка на XML-файл с данными для заполнения титула. Должен соответствовать схеме XSD ответного титула Диадок |
| 2 | ID сервиса | `int?` | — | Идентификатор настройки подключения к Диадок |

---

### Диадок — Ответить титулом на электронный документ

**Enum:** `AttachTitleSignature = 133`
**Исполнение:** через очередь

**Что делает и зачем:**
Подписывает сформированный XML-титул и отправляет его контрагенту в ответ на полученный документ. Завершающий шаг двустороннего документооборота — клиент подтверждает приёмку товара или услуги.

| # | Параметр | Тип | Обяз. | Описание |
|---|----------|-----|-------|----------|
| 0 | ID файла | `FileFromLibrary` | ✓ | Ссылка на исходный документ контрагента, на который отправляется ответный титул |
| 1 | ID xml файла титула | `FileFromLibrary` | ✓ | Ссылка на XML-файл ответного титула, сформированный действием «Сгенерировать xml титул» |
| 2 | ID сервиса | `int?` | — | Идентификатор настройки подключения к Диадок |
| 3 | Подпись | `string` | — | Электронная подпись XML-файла титула в формате Base64 (CMS/PKCS#7 detached) |
| 4 | МЧД | `string` | — | Машиночитаемая доверенность в формате JSON |

---

### Диадок — Создать файл отказа от подписи

**Enum:** `GenerateRejectionSignature`
**Исполнение:** синхронный
**Возвращает:** `FileFromLibrary`

**Что делает и зачем:**
Формирует XML-файл отказа от подписи документа — когда клиент не согласен подписывать документ контрагента. Результат передаётся в действие «Отправить подписанный отказ от подписи».

| # | Параметр | Тип | Обяз. | Описание |
|---|----------|-----|-------|----------|
| 0 | ID файла | `FileFromLibrary` | ✓ | Ссылка на документ контрагента, от подписи которого отказывается клиент |
| 1 | Причина отказа | `string` | ✓ | Текстовое обоснование отказа от подписания (например: «Не соответствует условиям договора», «Обнаружены ошибки в реквизитах»). Отображается контрагенту при получении отказа |
| 2 | ID сервиса | `int?` | — | Идентификатор настройки подключения к Диадок |

---

### Диадок — Отправить подписанный отказ от подписи

**Enum:** `AttachRejectionSignature`
**Исполнение:** через очередь
**Используется совместно с:** «Диадок — Создать файл отказа от подписи»

**Что делает и зачем:**
Подписывает XML-файл отказа и отправляет его контрагенту. Контрагент получает уведомление, что его документ не будет подписан.

| # | Параметр | Тип | Обяз. | Описание |
|---|----------|-----|-------|----------|
| 0 | ID файла | `FileFromLibrary` | ✓ | Ссылка на исходный документ контрагента, от подписи которого отказывается клиент |
| 1 | ID файла отказа | `FileFromLibrary` | ✓ | Ссылка на XML-файл отказа, сформированный действием «Создать файл отказа от подписи» |
| 2 | ID сервиса | `int?` | — | Идентификатор настройки подключения к Диадок |
| 3 | Подпись | `string` | — | Электронная подпись XML-файла отказа в формате Base64 |
| 4 | МЧД | `string` | — | Машиночитаемая доверенность в формате JSON |

---

### Диадок — Создать файл отказа от подписи (Universal)

**Enum:** `GenerateRejectionSignatureUniversal = 206`
**Исполнение:** синхронный
**Возвращает:** `FileFromLibrary`

**Что делает и зачем:**
Расширенная версия базового действия. Принимает явный отпечаток сертификата, что позволяет указать конкретный ключ подписи при наличии нескольких сертификатов.

| # | Параметр | Тип | Обяз. | Описание |
|---|----------|-----|-------|----------|
| 0 | ID файла | `FileFromLibrary` | ✓ | Ссылка на документ контрагента, от подписи которого отказывается клиент |
| 1 | Причина отказа | `string` | — | Текстовое обоснование отказа. Необязателен, но рекомендуется для информирования контрагента |
| 2 | Отпечаток сертификата | `string` | ✓ | Отпечаток (thumbprint) сертификата ЭП в формате HEX — указывает каким ключом формируется файл отказа |
| 3 | ID сервиса | `int?` | — | Идентификатор настройки подключения к Диадок |

---

### Диадок — Отправить подписанный отказ от подписи (Universal)

**Enum:** `AttachRejectionSignatureUniversal = 202`
**Исполнение:** через очередь
**Используется совместно с:** «Диадок — Создать файл отказа от подписи (Universal)»

**Что делает и зачем:**
Подписывает и отправляет контрагенту отказ от подписи. Расширенная версия — позволяет передать причину отказа напрямую в параметрах.

| # | Параметр | Тип | Обяз. | Описание |
|---|----------|-----|-------|----------|
| 0 | ID файла | `FileFromLibrary` | ✓ | Ссылка на исходный документ контрагента |
| 1 | ID файла отказа | `FileFromLibrary` | ✓ | Ссылка на XML-файл отказа, сформированный действием «Создать файл отказа от подписи (Universal)» |
| 2 | ID сервиса | `int?` | — | Идентификатор настройки подключения к Диадок |
| 3 | Подпись | `string` | — | Электронная подпись XML-файла отказа в формате Base64 |
| 4 | Причина отказа | `string` | — | Текстовая причина отказа, включаемая в уведомление контрагенту |
| 5 | МЧД | `string` | — | Машиночитаемая доверенность в формате JSON |

---

## Диадок — Аннулирование документов

Процедура аннулирования в Диадок двусторонняя и зависит от того, кто является инициатором.

### Сценарий A: Аннулирование инициируем МЫ

Порядок шагов:

```
1. Создать файл аннулирования подписи
2. Отправить подписанный файл соглашения об аннулировании
```

### Сценарий Б: Аннулирование инициирует КОНТРАГЕНТ

Порядок шагов:

```
1. Сохранить контент аннулирования  ← скачивает файл, присланный контрагентом
   ├─ Согласны → Отправить подписанный файл об аннулировании
   └─ Не согласны → Создать файл отклонения аннулирования
                  → Отправить подписанный отказ от аннулирования
```

---

### StatusMessage в журнале очередей при аннулировании (v2.267+)

При синхронизации событий аннулирования из Диадок (`SyncEdocumentsFromDiadocJob`) каждое событие записывается в журнал очередей. Поле `StatusMessage` содержит человекочитаемую причину, полученную из SDK Диадок.

| Событие | Что хранится в `StatusMessage` |
|---|---|
| Мы инициировали аннулирование — запрос ушёл | Наш текст причины аннулирования |
| Контрагент **согласился** с аннулированием | Пусто / нет текста |
| Контрагент **отказал** в аннулировании | Текст причины отказа контрагента |
| Контрагент аннулировал в одностороннем порядке (до подписания получателем) | Текст причины аннулирования, присланный контрагентом |

**До v2.267** при обработке отказа контрагента в аннулировании в `StatusMessage` ошибочно записывалась наша причина запроса вместо причины отказа контрагента, а записи в журнале очередей дублировались. Исправлено в v2.267.

> **Диагностика:** если в журнале по событию «Отказ в аннулировании» в поле `StatusMessage` записан текст, который явно написан от имени инициатора (нашей стороны) — это признак запуска на версии до v2.267 или некорректного состояния.

---

### Диадок — Создать файл аннулирования подписи

**Enum:** `GenerateRevocationSignature`
**Исполнение:** синхронный
**Возвращает:** `FileFromLibrary`
**Сценарий:** инициируем аннулирование МЫ

**Что делает и зачем:**
Формирует XML-файл запроса на аннулирование ранее подписанного документа. Первый шаг когда клиент сам инициирует аннулирование. Результат передаётся в действие «Отправить подписанный файл соглашения об аннулировании».

| # | Параметр | Тип | Обяз. | Описание |
|---|----------|-----|-------|----------|
| 0 | ID файла | `FileFromLibrary` | ✓ | Ссылка на аннулируемый документ |
| 1 | Причина аннулирования | `string` | ✓ | Текстовое пояснение причины аннулирования (например: «Ошибка в реквизитах», «Документ подписан ошибочно»). Отображается контрагенту при получении запроса |
| 2 | ID сервиса | `int?` | — | Идентификатор настройки подключения к Диадок |

---

### Диадок — Отправить подписанный файл соглашения об аннулировании

**Enum:** `AttachRevocationSignature`
**Исполнение:** через очередь
**Используется совместно с:** «Диадок — Создать файл аннулирования подписи»
**Сценарий:** инициируем аннулирование МЫ

**Что делает и зачем:**
Подписывает и отправляет контрагенту запрос на аннулирование. После отправки контрагент должен либо согласиться с аннулированием, либо отклонить.

| # | Параметр | Тип | Обяз. | Описание |
|---|----------|-----|-------|----------|
| 0 | ID файла | `FileFromLibrary` | ✓ | Ссылка на аннулируемый документ |
| 1 | ID файла аннулирования | `FileFromLibrary` | ✓ | Ссылка на XML-файл запроса аннулирования, сформированный действием «Создать файл аннулирования подписи» |
| 2 | ID сервиса | `int?` | — | Идентификатор настройки подключения к Диадок |
| 3 | Подпись | `string` | — | Электронная подпись XML-файла аннулирования в формате Base64 |
| 4 | МЧД | `string` | — | Машиночитаемая доверенность в формате JSON |

---

### Диадок — Отправить подписанный файл об аннулировании

**Enum:** `AttachRevocationRequestedSignature = 144`
**Исполнение:** через очередь
**Используется совместно с:** «Диадок — Сохранить контент аннулирования электронного документа»
**Сценарий:** аннулирование инициировал КОНТРАГЕНТ, мы СОГЛАШАЕМСЯ

**Что делает и зачем:**
Отправляет в Диадок подписанный файл аннулирования — ответ на запрос контрагента. Файл аннулирования предварительно скачивается действием «Сохранить контент аннулирования» и сохраняется в хранилище 1Ф. После отправки документ считается аннулированным с обеих сторон.

| # | Параметр | Тип | Обяз. | Описание |
|---|----------|-----|-------|----------|
| 0 | ID файла | `FileFromLibrary` | ✓ | Ссылка на аннулируемый документ |
| 1 | ID файла аннулирования | `FileFromLibrary` | ✓ | Ссылка на файл аннулирования, скачанный действием «Сохранить контент аннулирования электронного документа» |
| 2 | ID сервиса | `int?` | — | Идентификатор настройки подключения к Диадок |
| 3 | Подпись | `string` | — | Электронная подпись файла аннулирования в формате Base64 |
| 4 | МЧД | `string` | — | Машиночитаемая доверенность в формате JSON |

---

### Диадок — Создать файл отклонения аннулирования подписи

**Enum:** `GenerateRejectRevocationSignature = 145`
**Исполнение:** синхронный
**Возвращает:** `FileFromLibrary`
**Сценарий:** аннулирование инициировал КОНТРАГЕНТ, мы НЕ СОГЛАШАЕМСЯ

**Что делает и зачем:**
Формирует XML-файл отклонения аннулирования — когда контрагент прислал запрос на аннулирование, а клиент с ним не согласен. Документ остаётся юридически действующим.

| # | Параметр | Тип | Обяз. | Описание |
|---|----------|-----|-------|----------|
| 0 | ID файла | `FileFromLibrary` | ✓ | Ссылка на документ, по которому пришёл запрос аннулирования от контрагента |
| 1 | Причина отклонения | `string` | ✓ | Текстовое обоснование отказа от аннулирования (например: «Документ исполнен», «Аннулирование не согласовано»). Отображается контрагенту |
| 2 | ID сервиса | `int?` | — | Идентификатор настройки подключения к Диадок |

---

### Диадок — Отправить подписанный отказ от аннулирования

**Enum:** `AttachRevocationRejectionSignature`
**Исполнение:** через очередь
**Сценарий:** аннулирование инициировал КОНТРАГЕНТ, мы НЕ СОГЛАШАЕМСЯ

**Что делает и зачем:**
Отправляет подписанный отказ контрагенту. Документооборот остаётся в силе.

| # | Параметр | Тип | Обяз. | Описание |
|---|----------|-----|-------|----------|
| 0 | ID файла | `FileFromLibrary` | ✓ | Ссылка на исходный документ |
| 1 | ID файла отказа | `FileFromLibrary` | ✓ | Ссылка на XML-файл отклонения аннулирования, сформированный предыдущим действием |
| 2 | ID сервиса | `int?` | — | Идентификатор настройки подключения к Диадок |
| 3 | Подпись | `string` | — | Электронная подпись XML-файла отказа в формате Base64 |
| 4 | МЧД | `string` | — | Машиночитаемая доверенность в формате JSON |

---

### Диадок — Создать файл отклонения аннулирования подписи (Universal)

**Enum:** `GenerateRevocationRejectionSignatureUniversal = 205`
**Исполнение:** синхронный
**Возвращает:** `FileFromLibrary`

**Что делает и зачем:**
Расширенная версия: дополнительно принимает явный отпечаток сертификата.

| # | Параметр | Тип | Обяз. | Описание |
|---|----------|-----|-------|----------|
| 0 | ID файла | `FileFromLibrary` | ✓ | Ссылка на документ, по которому пришёл запрос аннулирования от контрагента |
| 1 | Причина отказа | `string` | — | Текстовое обоснование отклонения аннулирования |
| 2 | Отпечаток сертификата | `string` | ✓ | Отпечаток сертификата ЭП в формате HEX |
| 3 | ID сервиса | `int?` | — | Идентификатор настройки подключения к Диадок |

---

### Диадок — Отправить подписанный отказ от запроса аннулирования (Universal)

**Enum:** `AttachRevocationRejectionSignatureUniversal = 203`
**Исполнение:** через очередь

| # | Параметр | Тип | Обяз. | Описание |
|---|----------|-----|-------|----------|
| 0 | ID файла | `FileFromLibrary` | ✓ | Ссылка на исходный документ |
| 1 | ID файла отказа | `FileFromLibrary` | ✓ | Ссылка на XML-файл отклонения аннулирования |
| 2 | ID сервиса | `int?` | — | Идентификатор настройки подключения к Диадок |
| 3 | Подпись | `string` | — | Электронная подпись XML-файла отказа в формате Base64 |
| 4 | Причина отказа | `string` | — | Текстовая причина отклонения запроса на аннулирование |
| 5 | МЧД | `string` | — | Машиночитаемая доверенность в формате JSON |

---

### Диадок — Создать файл извещения о получении

**Enum:** `GenerateInvoiceReceiptXml = 148`
**Исполнение:** синхронный
**Возвращает:** `FileFromLibrary` (пара ID файла + ID версии)

**Что делает и зачем:**
Формирует служебный XML-файл «извещение о получении» для счёта-фактуры от контрагента. По законодательству (НК РФ) получатель СФ обязан отправить это извещение не позднее следующего рабочего дня. В большинстве случаев (около 90%) извещение подписывается автоматически самим Диадок при авторизации пользователя — данное действие используется только когда требуется явное серверное или ручное подписание.

| # | Параметр | Тип | Обяз. | Описание |
|---|----------|-----|-------|----------|
| 0 | ID файла | `FileFromLibrary` | ✓ | Ссылка на полученный от контрагента счёт-фактуру или корректировочный СФ, для которого формируется извещение |
| 1 | ID сервиса | `int?` | — | Идентификатор настройки подключения к Диадок |

---

### Диадок — Отправить подписанный файл извещения о получении (Universal)

**Enum:** `AttachInvoiceReceiptSignatureUniversal = 204`
**Исполнение:** через очередь
**Используется совместно с:** «Диадок — Создать файл извещения о получении»

**Что делает и зачем:**
Подписывает и отправляет контрагенту извещение о получении счёта-фактуры. Завершает обязательный технологический обмен по СФ.

| # | Параметр | Тип | Обяз. | Описание |
|---|----------|-----|-------|----------|
| 0 | ID файла | `FileFromLibrary` | ✓ | Ссылка на исходный счёт-фактуру от контрагента |
| 1 | ID файла извещения | `FileFromLibrary` | ✓ | Ссылка на XML-файл извещения, сформированный действием «Создать файл извещения о получении» |
| 2 | ID сервиса | `int?` | — | Идентификатор настройки подключения к Диадок |
| 3 | Подпись | `string` | — | Электронная подпись XML-файла извещения в формате Base64 |
| 4 | Комментарий | `string` | — | Произвольный текстовый комментарий к извещению (необязательный реквизит) |
| 5 | МЧД | `string` | — | Машиночитаемая доверенность в формате JSON |

---

### Диадок — Получить идентификатор МЧД

**Enum:** `GetUserMCHDDiadoc = 165`
**Исполнение:** синхронный
**Возвращает:** `string` (идентификатор МЧД)

**Что делает и зачем:**
По идентификатору пользователя в Диадок возвращает идентификатор его активной машиночитаемой доверенности. Нужен как подготовительный шаг: полученный идентификатор передаётся в операции подписания как параметр МЧД.

| # | Параметр | Тип | Обяз. | Описание |
|---|----------|-----|-------|----------|
| 0 | ID пользователя | `string` | ✓ | Строковый идентификатор пользователя в системе Диадок (не числовой ID пользователя в 1Ф). Можно получить из профиля пользователя в Диадок или через API |
| 1 | ID сервиса | `int?` | — | Идентификатор настройки подключения к Диадок |

---

### Диадок — Получить файлы МЧД

**Enum:** `GetMCHDFilesDiadoc = 166`
**Исполнение:** синхронный
**Возвращает:** сопоставление ID файлов

**Что делает и зачем:**
По идентификатору МЧД и ID сообщения возвращает сопоставление файлов доверенности контрагента, приложенных к сообщению в Диадок. Используется для получения и сохранения файлов МЧД контрагента, отправившего документ.

| # | Параметр | Тип | Обяз. | Описание |
|---|----------|-----|-------|----------|
| 0 | ID МЧД | `string` | ✓ | Идентификатор машиночитаемой доверенности контрагента в реестре ФНС |
| 1 | ID сообщения | `string` | ✓ | `MessageId` сообщения в Диадок, в контексте которого пришёл документ с МЧД контрагента |
| 2 | ID сервиса | `int?` | — | Идентификатор настройки подключения к Диадок |

---

### Диадок — Получить статус МЧД

**Enum:** `GetMCHDStatusDiadoc = 171`
**Исполнение:** синхронный
**Возвращает:** `string` (статус МЧД)

**Что делает и зачем:**
Проверяет актуальный статус МЧД контрагента, приложенной к входящему документу. Позволяет убедиться, что доверенность была действительна на момент подписания.

| # | Параметр | Тип | Обяз. | Описание |
|---|----------|-----|-------|----------|
| 0 | MessageId | `string` | — | Идентификатор сообщения Диадок, в рамках которого прикреплена МЧД контрагента |
| 1 | ContentId | `string` | — | Идентификатор сущности (Entity) внутри сообщения, содержащей файл МЧД контрагента |
| 2 | ID сервиса | `int?` | — | Идентификатор настройки подключения к Диадок |

---

### Диадок — Синхронизировать статусы документов в сообщении

**Enum:** `SyncMessageStatus`
**Исполнение:** синхронный
**Возвращает:** `string` (JSON со статусами документов)

**Что делает и зачем:**
Запрашивает актуальные статусы документов по списку `MessageId` из Диадок и возвращает сырой JSON. Используется для ручной или полуавтоматической актуализации состояния документооборота.

> **Ключевое отличие от аналогичного действия СБИС.** Синхронизация Диадок возвращает только данные — полученный JSON необходимо разобрать вручную, сверить статусы с тем, что хранится в 1Ф, и самостоятельно запустить автоматизацию в зависимости от результата. Синхронизация СБИС, напротив, делает всё это автоматически: сравнивает статусы с таблицей `EdocumentSbisLink` и сама ставит в очередь события `change` по документам, где статусы расходятся.

| # | Параметр | Тип | Обяз. | Описание |
|---|----------|-----|-------|----------|
| 0 | Список ID сообщений | `string[]` | ✓ | Массив `MessageId` сообщений Диадок, статусы документов в которых нужно запросить. Позволяет обновить сразу несколько сообщений одним вызовом |
| 1 | ID сервиса | `int?` | — | Идентификатор настройки подключения к Диадок |

---

### Диадок — Получить тэги документа

**Enum:** `GetTagsFromDocument = 142`
**Исполнение:** синхронный
**Возвращает:** теги документа (пары ключ-значение)

**Что делает и зачем:**
Возвращает теги документа из Диадок — произвольные пары ключ-значение. Используется для передачи дополнительных метаданных из Диадок в 1Ф при обработке входящих документов.

| # | Параметр | Тип | Обяз. | Описание |
|---|----------|-----|-------|----------|
| 0 | ID ссылки на электронный документ | `int` | ✓ | Идентификатор записи `EdocumentLink` — по нему определяется документ в Диадок, теги которого нужно получить |
| 1 | ID сервиса | `int?` | — | Идентификатор настройки подключения к Диадок |

---

## СБИС

MCP-группа: `EdiSbis = 17` («ЭДО СБИС»)
Тип сервиса: `ServiceType.Sbis = 14`
Таблица учётных данных: `SbisCredentials`
Таблица ссылок: `EdocumentSbisLink`
Фоновая синхронизация: `SyncEdocumentsFromSbisJob`

![Форма настройки сервиса СБИС в AdminSPA: подключение, ИНН, КПП, уникальный идентификатор](https://help.1forma.ru/help-images/integrations/sbis-service-settings.png)

**Важный нюанс по аннулированию в СБИС.** Файлы аннулирования, инициированного контрагентом, приходят в событии receive и скачиваются действием «СБИС — Сохранить контент электронного документа». Отказ контрагента от аннулирования, запрошенного клиентом, приходит как новый документ со статусом `finished`.

---

### СБИС — Отправить электронный документ

**Enum:** `SbisSendEdocument = 162`
**Исполнение:** через очередь

**Что делает и зачем:**
Отправляет файл контрагенту через СБИС. В отличие от Диадок, требует уникальный идентификатор контрагента в системе СБИС (помимо ИНН/КПП). Поддерживает запрос ответной подписи и указание типа документа.

| # | Параметр | Тип | Обяз. | Описание |
|---|----------|-----|-------|----------|
| 0 | ID файла | `FileFromLibrary` | ✓ | Ссылка на файл в хранилище 1Ф, который будет отправлен контрагенту |
| 1 | ИНН контрагента | `string` | ✓ | ИНН организации-получателя |
| 2 | КПП контрагента | `string` | ✓ | КПП организации-получателя |
| 3 | Уникальный идентификатор контрагента | `string` | ✓ | Внутренний идентификатор контрагента в системе СБИС. Необходим для точной адресации — по ИНН/КПП может быть зарегистрировано несколько ящиков. Берётся из справочника контрагентов СБИС |
| 4 | Нужна ли ответная подпись | `bool` | — | Если `true` — документ отправляется с запросом ответной подписи от контрагента |
| 5 | Тип документа | `string` | — | Тип документа по классификатору СБИС (например: `ДоговорВх`, `АктВыпуска`, `ФактураВх`). Определяет маршрутизацию и правила обработки |
| 6 | Сумма | `decimal` | — | Сумма документа. Используется в метаданных и для фильтрации в реестре СБИС |
| 7 | ID сервиса | `int?` | — | Идентификатор настройки подключения к СБИС из справочника сервисов 1Ф |

---

### СБИС — Создать файлы подтверждения подписи

**Enum:** `SbisGenerateConfirmSignature = 177`
**Исполнение:** синхронный
**Возвращает:** `List<SbisFileWithAttachment>` (JSON)

**Что делает и зачем:**
Формирует служебные файлы подтверждения подписи в форматах СБИС и возвращает их в виде JSON. Обязателен как предварительный шаг перед «Отправить подписание» — если исходный документ находится в формате XML. Без этого шага подписание не пройдёт.

| # | Параметр | Тип | Обяз. | Описание |
|---|----------|-----|-------|----------|
| 0 | ID файла | `FileFromLibrary` | ✓ | Ссылка на XML-документ, для которого необходимо сформировать файлы подтверждения |
| 1 | Причина | `string` | ✓ | Текстовый комментарий к подтверждению подписи |
| 2 | Отпечаток сертификата | `string` | ✓ | Отпечаток (thumbprint) сертификата ЭП в формате HEX |
| 3 | ID сервиса | `int?` | — | Идентификатор настройки подключения к СБИС |
| 4 | МЧД | `string` | — | Машиночитаемая доверенность в формате JSON |

---

### СБИС — Отправить подписание

**Enum:** `SbisAttachSignature = 154`
**Исполнение:** через очередь
**Используется совместно с:** «СБИС — Создать файлы подтверждения подписи» (если исходник в XML)

**Что делает и зачем:**
Отправляет подписание сразу по всем документам как пакет (передаётся массив, а не по каждому документу отдельно). Если исходный документ был в XML — предварительно должно быть выполнено действие «Создать файлы подтверждения подписи», результат которого передаётся в этот параметр. Если документ не в XML — JSON для отправки собирается самостоятельно.

| # | Параметр | Тип | Обяз. | Описание |
|---|----------|-----|-------|----------|
| 0 | Файлы (id, versionId, attachmentId) | `List<SbisFileWithAttachment>` | ✓ | Список файлов для подписания в формате СБИС. Каждый элемент содержит: `FileId` (ID файла в хранилище 1Ф), `VersionId` (версия), `AttachmentId` (ID вложения в СБИС), `DocumentId` (ID документа в СБИС). **Источник данных:** для XML-документов — результат действия «Создать файлы подтверждения подписи» (SbisGenerateConfirmSignature=177); для прочих форматов JSON собирается автоматически из метаданных документа в СБИС |
| 1 | ID сервиса | `int?` | — | Идентификатор настройки подключения к СБИС |
| 2 | Подпись | `string` | — | Электронная подпись в формате Base64 |
| 3 | МЧД | `string` | — | Машиночитаемая доверенность в формате JSON |

---

### СБИС — Создать файлы отказа от подписи

**Enum:** `GenerateRejectionSbisSignature = 168`
**Исполнение:** синхронный
**Возвращает:** `List<SbisFileWithAttachment>` (JSON)

**Что делает и зачем:**
Формирует JSON-файлы отказа от подписи документа. Результат передаётся в действие «Отправить подписанный отказ от подписи».

| # | Параметр | Тип | Обяз. | Описание |
|---|----------|-----|-------|----------|
| 0 | ID файла | `FileFromLibrary` | ✓ | Ссылка на документ контрагента, от подписи которого отказывается клиент |
| 1 | Причина отказа | `string` | ✓ | Текстовое обоснование отказа от подписания |
| 2 | Отпечаток сертификата | `string` | ✓ | Отпечаток сертификата ЭП в формате HEX |
| 3 | ID сервиса | `int?` | — | Идентификатор настройки подключения к СБИС |
| 4 | МЧД | `string` | — | Машиночитаемая доверенность в формате JSON |

---

### СБИС — Отправить подписанный отказ от подписи

**Enum:** `SbisAttachRejectSignature = 155`
**Исполнение:** через очередь
**Используется совместно с:** «СБИС — Создать файлы отказа от подписи»

**Что делает и зачем:**
Подписывает и отправляет контрагенту отказ от подписи документа. Контрагент получает уведомление, что его документ не будет подписан.

| # | Параметр | Тип | Обяз. | Описание |
|---|----------|-----|-------|----------|
| 0 | Файлы (id, versionId, attachmentId) | `List<SbisFileWithAttachment>` | ✓ | Список файлов отказа от подписи в формате СБИС, полученных действием «Создать файлы отказа от подписи» |
| 1 | ID сервиса | `int?` | — | Идентификатор настройки подключения к СБИС |
| 2 | Подпись | `string` | — | Электронная подпись в формате Base64 |
| 3 | Комментарий | `string` | — | Произвольный текстовый комментарий к отказу |
| 4 | МЧД | `string` | — | Машиночитаемая доверенность в формате JSON |

---

## СБИС — Аннулирование документов

### Сценарий A: Аннулирование инициируем МЫ

Порядок шагов:

```
1. Создать файл аннулирования подписи
2. Отправить подписанные соглашения об аннулировании
   ↓ контрагент соглашается → документ аннулирован
   ↓ контрагент отказывает → приходит новый документ со статусом finished
```

### Сценарий Б: Аннулирование инициирует КОНТРАГЕНТ

Порядок шагов:

```
Файлы аннулирования приходят в событии receive
→ скачиваются действием «СБИС — Сохранить контент электронного документа»
   ├─ Соглашаемся → Отправить соглашение об аннулировании
   └─ Не соглашаемся → Создать файлы отказа от аннулирования
                      → Отправить отказ от аннулирования
```

---

### СБИС — Создать файл аннулирования подписи

**Enum:** `SbisGenerateRevocationTitle = 169`
**Исполнение:** синхронный
**Возвращает:** `List<SbisFileWithAttachment>`
**Сценарий:** инициируем аннулирование МЫ

**Что делает и зачем:**
Формирует файл запроса на аннулирование ранее подписанного документа. Первый шаг когда клиент сам инициирует аннулирование. Результат передаётся в действие «Отправить подписанные соглашения об аннулировании».

| # | Параметр | Тип | Обяз. | Описание |
|---|----------|-----|-------|----------|
| 0 | ID файла | `FileFromLibrary` | ✓ | Ссылка на аннулируемый документ |
| 1 | Причина аннулирования | `string` | ✓ | Текстовое пояснение причины аннулирования. Отображается контрагенту |
| 2 | Отпечаток сертификата | `string` | ✓ | Отпечаток сертификата ЭП инициатора аннулирования |
| 3 | ID сервиса | `int?` | — | Идентификатор настройки подключения к СБИС |
| 4 | МЧД | `string` | — | Машиночитаемая доверенность в формате JSON |

---

### СБИС — Отправить подписанные соглашения об аннулировании

**Enum:** `SbisAttachRevocationSignature = 159`
**Исполнение:** через очередь
**Используется совместно с:** «СБИС — Создать файл аннулирования подписи»
**Сценарий:** инициируем аннулирование МЫ

**Что делает и зачем:**
Подписывает и отправляет контрагенту запрос на аннулирование. После отправки контрагент должен либо согласиться, либо отклонить.

| # | Параметр | Тип | Обяз. | Описание |
|---|----------|-----|-------|----------|
| 0 | Файлы | `List<SbisFileWithAttachment>` | ✓ | Список файлов аннулирования в формате СБИС, полученный из действия «Создать файл аннулирования подписи» |
| 1 | ID сервиса | `int?` | — | Идентификатор настройки подключения к СБИС |
| 2 | Подпись | `string` | — | Электронная подпись в формате Base64 |
| 3 | Комментарий | `string` | — | Произвольный текстовый комментарий к запросу аннулирования |
| 4 | МЧД | `string` | — | Машиночитаемая доверенность в формате JSON |

---

### СБИС — Отправить соглашение об аннулировании

**Enum:** `SbisAttachRevocationRequestedSignature = 167`
**Исполнение:** через очередь
**Сценарий:** аннулирование инициировал КОНТРАГЕНТ, мы СОГЛАШАЕМСЯ

**Что делает и зачем:**
Подтверждает аннулирование, запрошенное контрагентом. Файлы аннулирования приходят от контрагента в событии receive и предварительно скачиваются действием «СБИС — Сохранить контент электронного документа».

| # | Параметр | Тип | Обяз. | Описание |
|---|----------|-----|-------|----------|
| 0 | Файлы (id, versionId, attachmentId) | `List<SbisFileWithAttachment>` | ✓ | Список файлов аннулирования, пришедших от контрагента в событии receive и скачанных действием «СБИС — Сохранить контент электронного документа» |
| 1 | ID сервиса | `int?` | — | Идентификатор настройки подключения к СБИС |
| 2 | Подпись | `string` | — | Электронная подпись в формате Base64 |
| 3 | Комментарий | `string` | — | Произвольный текстовый комментарий |
| 4 | МЧД | `string` | — | Машиночитаемая доверенность в формате JSON |

---

### СБИС — Создать файлы отказа от аннулирования

**Enum:** `GenerateRevocationRejectionSbisSignature = 170`
**Исполнение:** синхронный
**Возвращает:** `List<SbisFileWithAttachment>`
**Сценарий:** аннулирование инициировал КОНТРАГЕНТ, мы НЕ СОГЛАШАЕМСЯ

**Что делает и зачем:**
Формирует файл для отказа от аннулирования, запрошенного контрагентом. Документ остаётся юридически действующим.

| # | Параметр | Тип | Обяз. | Описание |
|---|----------|-----|-------|----------|
| 0 | ID файла | `FileFromLibrary` | ✓ | Ссылка на документ, по которому контрагент прислал запрос аннулирования |
| 1 | Причина отказа | `string` | ✓ | Текстовое обоснование отказа от аннулирования |
| 2 | Отпечаток сертификата | `string` | ✓ | Отпечаток сертификата ЭП в формате HEX |
| 3 | ID сервиса | `int?` | — | Идентификатор настройки подключения к СБИС |
| 4 | МЧД | `string` | — | Машиночитаемая доверенность в формате JSON |

---

### СБИС — Отправить отказ от аннулирования

**Enum:** `SbisAttachRevocationRejectionSignature = 160`
**Исполнение:** через очередь
**Сценарий:** аннулирование инициировал КОНТРАГЕНТ, мы НЕ СОГЛАШАЕМСЯ

**Что делает и зачем:**
Отправляет контрагенту подписанный отказ от аннулирования. Документ остаётся в силе.

| # | Параметр | Тип | Обяз. | Описание |
|---|----------|-----|-------|----------|
| 0 | Файлы (id, versionId, attachmentId) | `List<SbisFileWithAttachment>` | ✓ | Список файлов отказа от аннулирования, полученный из действия «Создать файлы отказа от аннулирования» |
| 1 | ID сервиса | `int?` | — | Идентификатор настройки подключения к СБИС |
| 2 | Подпись | `string` | — | Электронная подпись в формате Base64 |
| 3 | Комментарий | `string` | — | Произвольный текстовый комментарий к отказу |
| 4 | МЧД | `string` | — | Машиночитаемая доверенность в формате JSON |

---

### СБИС — Создать файл извещения о получении

**Enum:** `GenerateInvoiceSbis = 174`
**Исполнение:** синхронный
**Возвращает:** `List<SbisFileWithAttachment>`

**Что делает и зачем:**
Формирует XML-файл извещения о получении документа от контрагента в форматах СБИС.

| # | Параметр | Тип | Обяз. | Описание |
|---|----------|-----|-------|----------|
| 0 | ID файла | `FileFromLibrary` | ✓ | Ссылка на полученный от контрагента документ (счёт-фактура или КСФ), для которого формируется извещение |
| 1 | Отпечаток сертификата | `string` | ✓ | Отпечаток сертификата ЭП клиента, которым будет подписано извещение |
| 2 | ID сервиса | `int?` | — | Идентификатор настройки подключения к СБИС |
| 3 | МЧД | `string` | — | Машиночитаемая доверенность в формате JSON |

---

### СБИС — Отправить подписанное извещение о получении

**Enum:** `SbisAttachInvoiceSignature = 175`
**Исполнение:** через очередь
**Используется совместно с:** «СБИС — Создать файл извещения о получении»

**Что делает и зачем:**
Подписывает и отправляет извещение о получении контрагенту. Завершает обязательный технологический обмен.

| # | Параметр | Тип | Обяз. | Описание |
|---|----------|-----|-------|----------|
| 0 | Файлы | `List<SbisFileWithAttachment>` | ✓ | Список файлов извещения, полученный из действия «Создать файл извещения о получении» |
| 1 | ID сервиса | `int?` | — | Идентификатор настройки подключения к СБИС |
| 2 | Подпись | `string` | — | Электронная подпись в формате Base64 |
| 3 | Комментарий | `string` | — | Произвольный текстовый комментарий к извещению |
| 4 | МЧД | `string` | — | Машиночитаемая доверенность в формате JSON |

---

### СБИС — Сохранить контент электронного документа

**Enum:** `SbisSaveDocumentContent = 156`
**Исполнение:** синхронный, контекст `EdocumentSbisLink`
**Возвращает:** `FileFromLibrary`

**Что делает и зачем:**
Скачивает содержимое электронного документа из СБИС и сохраняет в хранилище 1Ф. Используется также для скачивания файлов аннулирования, присланных контрагентом в событии receive.

| # | Параметр | Тип | Обяз. | Описание |
|---|----------|-----|-------|----------|
| 0 | ID ссылки на электронный документ | `int` | ✓ | Идентификатор записи `EdocumentSbisLink` — внутренней ссылки, связывающей документ в СБИС с объектами системы 1Ф |
| 1 | ID сервиса | `int?` | — | Идентификатор настройки подключения к СБИС |

---

### СБИС — Сохранить печатную форму электронного документа

**Enum:** `SbisSavePrintFormByLink = 157`
**Исполнение:** синхронный, контекст `EdocumentSbisLink`
**Возвращает:** `string`

**Что делает и зачем:**
Скачивает PDF-печатную форму документа от контрагента из СБИС и сохраняет в хранилище 1Ф.

| # | Параметр | Тип | Обяз. | Описание |
|---|----------|-----|-------|----------|
| 0 | ID ссылки на электронный документ | `int` | ✓ | Идентификатор записи `EdocumentSbisLink` |
| 1 | ID сервиса | `int?` | — | Идентификатор настройки подключения к СБИС |

---

### СБИС — Сохранить архив документа

**Enum:** `SbisSaveArchiveByLink = 158`
**Исполнение:** синхронный, контекст `EdocumentSbisLink`
**Возвращает:** `string`

**Что делает и зачем:**
Скачивает ZIP-архив документа со всеми подписями из СБИС и сохраняет в хранилище 1Ф. Для долгосрочного архивного хранения.

| # | Параметр | Тип | Обяз. | Описание |
|---|----------|-----|-------|----------|
| 0 | ID ссылки на электронный документ | `int` | ✓ | Идентификатор записи `EdocumentSbisLink` |
| 1 | ID сервиса | `int?` | — | Идентификатор настройки подключения к СБИС |

---

### СБИС — Получить статус МЧД

**Enum:** `GetMCHDStatusSbis = 172`
**Исполнение:** синхронный
**Возвращает:** `string` (статус)

**Что делает и зачем:**
Проверяет статус машиночитаемой доверенности по её идентификатору. Используется перед подписанием чтобы убедиться что доверенность действительна и не отозвана.

| # | Параметр | Тип | Обяз. | Описание |
|---|----------|-----|-------|----------|
| 0 | Идентификатор МЧД | `string` | — | Идентификатор машиночитаемой доверенности в реестре ФНС |
| 1 | ID сервиса | `int?` | — | Идентификатор настройки подключения к СБИС |

---

### СБИС — Получить архив МЧД

**Enum:** `GetMCHDArchiveSbis = 173`
**Исполнение:** синхронный
**Возвращает:** `int?` (ID сохранённого файла)

**Что делает и зачем:**
Скачивает архив МЧД из СБИС и сохраняет в хранилище 1Ф. ИНН обеих сторон используются для однозначной идентификации доверенности, так как по одному номеру МЧД может быть несколько доверенностей для разных пар сторон.

| # | Параметр | Тип | Обяз. | Описание |
|---|----------|-----|-------|----------|
| 0 | Идентификатор МЧД | `string` | — | Идентификатор машиночитаемой доверенности в реестре ФНС |
| 1 | ИНН доверителя | `string` | — | ИНН организации, выдавшей доверенность (работодатель подписанта) |
| 2 | ИНН представителя | `string` | — | ИНН физического лица, которому выдана доверенность (подписант) |
| 3 | ID сервиса | `int?` | — | Идентификатор настройки подключения к СБИС |

---

### СБИС — Получить сертификаты

**Enum:** `SbisGetCertificates = 176`
**Исполнение:** синхронный
**Возвращает:** `string` (JSON)

**Что делает и зачем:**
Ищет сертификаты электронной подписи в реестре СБИС по реквизитам физлица. Используется для поиска актуального сертификата сотрудника перед подписанием, когда отпечаток сертификата неизвестен заранее.

| # | Параметр | Тип | Обяз. | Описание |
|---|----------|-----|-------|----------|
| 0 | ID сервиса | `int` | ✓ | Идентификатор настройки подключения к СБИС. Единственный обязательный параметр; остальные — критерии поиска, передаются в любой комбинации |
| 1 | Идентификатор | `string` | — | Идентификатор физлица в системе СБИС (внутренний UUID). Наиболее точный способ поиска |
| 2 | Идентификатор в ИС | `string` | — | Идентификатор физлица во внешней информационной системе, зарегистрированной в СБИС (например, идентификатор в кадровой системе клиента) |
| 3 | ИНН | `string` | — | ИНН физического лица |
| 4 | Телефон | `string` | — | Номер мобильного телефона физлица |
| 5 | Email | `string` | — | Адрес электронной почты физлица |
| 6 | СНИЛС | `string` | — | СНИЛС физического лица |
| 7 | Серия документа | `string` | — | Серия документа, удостоверяющего личность |
| 8 | Номер документа | `string` | — | Номер документа, удостоверяющего личность |

---

### СБИС — Получить тэги документа

**Enum:** `SbisGetDocumentTags = 161`
**Исполнение:** синхронный
**Возвращает:** теги документа (пары ключ-значение)

**Что делает и зачем:**
Возвращает теги документа из СБИС в виде пар ключ-значение. Используется для получения дополнительных метаданных входящего документа.

| # | Параметр | Тип | Обяз. | Описание |
|---|----------|-----|-------|----------|
| 0 | ID ссылки на электронный документ | `int` | ✓ | Идентификатор записи `EdocumentSbisLink` |
| 1 | ID сервиса | `int?` | — | Идентификатор настройки подключения к СБИС |

---

### СБИС — Синхронизировать статусы документов в сообщении

**Enum:** `SyncMessageStatusSbis = 188`
**Исполнение:** синхронный
**Возвращает:** `string`

**Что делает и зачем:**
Принудительно синхронизирует статусы документов по списку `MessageId` из СБИС. В отличие от аналогичного действия Диадок, работает полностью автоматически: сравнивает статусы, полученные из СБИС, со статусами в таблице `EdocumentSbisLink`, и по всем документам, где обнаружено расхождение, самостоятельно ставит в очередь событие `change`. Дальнейшая обработка запускается стандартным механизмом обработки событий — без ручного разбора результата.

Нужен когда автоматическая синхронизация через `SyncEdocumentsFromSbisJob` не сработала или требуется срочно актуализировать конкретные документы.

| # | Параметр | Тип | Обяз. | Описание |
|---|----------|-----|-------|----------|
| 0 | Список ID сообщений | `string[]` | ✓ | Массив `MessageId` сообщений СБИС, статусы документов в которых нужно синхронизировать. Для документов с расхождением статусов автоматически генерируется событие `change` |
| 1 | ID сервиса | `int?` | — | Идентификатор настройки подключения к СБИС |

---

## Сравнительная таблица покрытия функциональности

Какие операции поддерживает каждый провайдер:

| Функция | Диадок | СБИС |
|---------|--------|------|
| Отправка документа | ✓ (16 параметров) | ✓ (8 параметров) |
| Сохранить контент | ✓ | ✓ |
| Сохранить печатную форму | ✓ | ✓ |
| Сохранить архив | ✓ (+ флаг «весь документооборот») | ✓ |
| Сохранить контент аннулирования | ✓ | ✓ (через SaveDocumentContent) |
| Генерация XML-титула покупателя | ✓ (пустой + с готовым XML) | — |
| Ответить титулом | ✓ | — |
| Подтверждение подписи — создать файл | — | ✓ (для XML-документов) |
| Отказ от подписи — создать файл | ✓ + Universal | ✓ |
| Отказ от подписи — отправить | ✓ + Universal | ✓ |
| Аннулирование (мы инициируем) — создать | ✓ | ✓ |
| Аннулирование (мы инициируем) — отправить | ✓ | ✓ |
| Аннулирование (контрагент инициирует) — согласиться | ✓ | ✓ |
| Аннулирование (контрагент инициирует) — отклонить, создать файл | ✓ + Universal | ✓ |
| Аннулирование (контрагент инициирует) — отклонить, отправить | ✓ + Universal | ✓ |
| Извещение о получении — создать | ✓ | ✓ |
| Извещение о получении — отправить | ✓ Universal | ✓ |
| Получить статус МЧД | ✓ (по MessageId+ContentId) | ✓ (по ID МЧД) |
| Получить файлы МЧД контрагента | ✓ | — |
| Получить ID МЧД пользователя | ✓ | — |
| Получить архив МЧД | — | ✓ (с ИНН сторон) |
| Получить сертификаты | — | ✓ (поиск по 8 реквизитам) |
| Получить теги документа | ✓ | ✓ |
| Получить контрагентов | ✓ | — |
| Получить пропущенный документ | ✓ | — |
| Синхронизировать статусы пакетом | ✓ (возврат JSON, ручной разбор) | ✓ (авто, массив messageId) |

---

## Ключевые особенности интеграции

**1. Разные провайдеры — независимые реализации.** Диадок и СБИС работают через разные сервисы с раздельными очередями; реализации полностью независимы.

**2. Universal = новые версии Диадок-действий.** Суффикс `Universal` означает расширенный набор параметров — явный отпечаток сертификата и/или причина отказа. Базовые версии сохранены для обратной совместимости.

**3. SbisFileWithAttachment — специфика СБИС.** В СБИС один документ может иметь несколько вложений (`AttachmentId`). Структура `SbisFileWithAttachment` с полями `FileId`, `VersionId`, `AttachmentId`, `DocumentId` — требование API СБИС, которого нет в Диадок.

**4. Диадок богаче в отправке.** 16 параметров в `SendEdocument` против 8 в СБИС отражают более развитый API Диадок для формализованных документов.

**5. СБИС богаче в поиске и МЧД.** Поиск сертификатов по 8 реквизитам физлица, получение архива МЧД с ИНН сторон, пакетная синхронизация — функции без аналогов в Диадок.

**6. МЧД во всех операциях подписания.** Параметр `МЧД` (JSON) присутствует во всех действиях, связанных с подписью. Реализует поддержку подписания по машиночитаемой доверенности (63-ФЗ, действует с 2023).

**7. Пакетная отправка в СБИС.** Действие «Отправить подписание» передаёт массив файлов и отправляет подписание сразу по всем документам — в отличие от Диадок, где каждый документ обрабатывается отдельно.
