REST API 1С ЭЦП

REST API для интеграции с 1С

Полная документация по API для загрузки документов, подписания, отправки клиентам и проверки подписей из 1С:Предприятие

api REST API verified УКЭП + ПЭП integration_instructions 1С:Предприятие speed 60 запросов/мин

list Оглавление

vpn_key Аутентификация

Все запросы к API аутентифицируются ключом. Рекомендуется заголовок X-Api-Key: КЛЮЧ; также поддерживается Authorization: Bearer КЛЮЧ. Для совместимости работает и GET-параметр api_key, но он попадает в логи и историю — в рабочей интеграции передавайте ключ заголовком. Ключ создаётся в личном кабинете: Настройки → API-ключи.

ПараметрЗначение
Базовый URLhttps://cert4u.ru/api.php (метод задаётся параметром action)
АутентификацияЗаголовок X-Api-Key (рекомендуется) / Authorization: Bearer / GET-параметр api_key (legacy)
Тело POSTJSON (Content-Type: application/json), форма или multipart/form-data (для методов с файлами)
Формат ответаJSON (UTF-8)
Лимит запросов60 запросов в минуту (с одного IP и на один ключ), плюс дневные лимиты тарифа — см. лимиты
# Рекомендуемый способ — ключ в заголовке curl "https://cert4u.ru/api.php?action=api_1c_documents" \ -H "X-Api-Key: ВАШ_КЛЮЧ" # То же через Authorization: Bearer curl "https://cert4u.ru/api.php?action=api_1c_documents" \ -H "Authorization: Bearer ВАШ_КЛЮЧ" # Legacy: ключ в URL (не рекомендуется) GET https://cert4u.ru/api.php?action=api_1c_documents&api_key=ВАШ_КЛЮЧ

Изоляция аккаунтов. Каждый API-ключ принадлежит одному аккаунту Cert4U. Все методы видят и меняют только документы и клиентов этого аккаунта; чужой документ для API «не существует» (ответ 404).

Примечание: в примерах ниже ключ для краткости иногда показан в URL (&api_key=ВАШ_КЛЮЧ) — его всегда можно заменить заголовком X-Api-Key. Если API выключен на сервисе, все запросы вернут 403 «API для 1С отключен».

account_tree Типовой сценарий подписания

Полный (пошаговый) цикл работы с документом через API. Если нужно просто отправить документ контрагенту на подпись — есть отправка одним запросом (без создания клиента), см. ниже.

1
Подпись УКЭП вашей организации
в 1С (МенеджерКриптографии), КриптоАРМ или cryptcp — прикреплённая или открепленная, как выбрать
2
Загрузка подписанного документа
api_1c_upload_signed — документ + .sig, статус signed_admin
3
Отправка клиенту
api_1c_send — отправить ссылку на подписание (SMS/email)
4
Клиент подписывает
УКЭП (КриптоПро в браузере) или ПЭП (код из SMS/email)
5
Проверка и скачивание
api_1c_verify + api_1c_download_zip — проверить подписи, получить архив
1С:Предприятие Cert4U Клиент | | | | УКЭП в 1С (МенеджерКриптографии) | | |--- api_1c_upload_signed -------->| | | (документ + .sig) | | |<-- { id, status: signed_admin }--| | | | | |--- api_1c_send ----------------->|--- SMS/Email (ссылка) ------>| |<-- { sign_url, pep_code } ------| | | | | | |<-- Подпись (УКЭП/ПЭП) ------| | | | |--- api_1c_verify --------------->| | |<-- { valid: true, cert_info } --| | | | | |--- api_1c_download_zip --------->| | |<-- (ZIP: документ + подписи) ---| |

Серверная подпись (api_1c_sign_admin) отключена — она не являлась УКЭП. Подпись вашей организации ставится только вашей УКЭП: подпишите файл в 1С/КриптоАРМ и загрузите вместе с .sig через api_1c_upload_signed, дальше api_1c_send. Если подпись вашей организации не нужна (подписывает только контрагент) — используйте api_1c_send_document (УКЭП или ПЭП контрагента) или api_1c_pep_send.

bolt Отправка одним запросом рекомендуется

Самый простой способ: один запрос загружает документ и сразу отправляет его на подписание указанному лицу. Клиента создавать не нужно — передайте ФИО и телефон и/или email получателя. В ответ сразу приходят document_id и sign_url.

Получатель ищется среди контактов вашего аккаунта по телефону или email (форматы 8 900…, +7 (900)… и 900… из 10 цифр считаются одним номером). Если не найден — создаётся скрытый контакт: в списке «Клиенты» и в api_1c_clients он не показывается, дубликаты не плодятся. Ваша 1С ведёт контрагентов у себя — хранить наши client_id не требуется.

POST api.php?action=api_1c_send_document

Запрос — POST, тип multipart/form-data. Файл передаётся полем document (если в запросе ровно один файл, имя поля не важно). Документ создаётся сразу в статусе sent, без подписи отправителя — метод предназначен для подписи контрагентом.

Параметры

ПараметрТипОписание
documentfileобяз.Файл документа (pdf, doc, docx, txt, rtf, odt, xls, xlsx, png, jpg, jpeg)
client_namestringобяз.ФИО / наименование получателя
client_phonestringтел. или emailТелефон получателя (на него уходит SMS со ссылкой)
client_emailstringтел. или emailEmail получателя (на него уходит письмо со ссылкой)
sign_typestringопц.pep_only (ПЭП по коду), ukep_only (только УКЭП) или пусто — на выбор получателя
doc_namestringопц.Название документа (по умолчанию — имя файла)
descriptionstringопц.Описание документа
company, innstringопц.Организация и ИНН получателя (сохраняются только при создании нового контакта)
signer_innstringопц.ИНН того, кто должен подписать (УКЭП): 12 цифр — личный ИНН физлица/ИП/руководителя, 10 цифр — ИНН организации в сертификате. См. проверку подписанта
signer_snilsstringопц.СНИЛС того, кто должен подписать (11 цифр, можно с дефисами/пробелами)

Проверка подписанта по ИНН/СНИЛС (защита от однофамильцев). Если передать signer_inn и/или signer_snils, то при подписании документа контрагентом через УКЭП сервер сверит их с сертификатом из файла подписи:

• signer_inn из 12 цифр сравнивается с личным ИНН владельца сертификата (физлицо, ИП, руководитель/сотрудник организации); из 10 цифр — с ИНН организации в сертификате;
• signer_snils сравнивается со СНИЛС владельца сертификата.

При несовпадении подпись не принимается (независимо от режима проверки), клиенту показывается «Документ должен подписать другой человек», в журнал пишется signer_mismatch. Значения проверяются при вызове: ИНН/СНИЛС с неверной контрольной суммой → HTTP 400. Поля возвращаются в api_1c_document и api_1c_verify (signer_inn, signer_snils, signer_check = {"result":"ok"} после успешной сверки). Для ПЭП (код по SMS/email) поля не применяются — подписанта подтверждает телефон/почта. В api_1c_send поля можно передать или уточнить перед отправкой.

Поддерживает заголовок Idempotency-Key и песочницу. Списывает одну отправку по тарифу (кроме песочницы).

Пример запроса (cURL)

curl -X POST "https://cert4u.ru/api.php?action=api_1c_send_document" \ -H "X-Api-Key: ВАШ_КЛЮЧ" \ -H "Idempotency-Key: 1c-doc-000123" \ -F "document=@/path/to/dogovor.pdf" \ -F "client_name=Петров Пётр Петрович" \ -F "client_phone=+79001234567" \ -F "client_email=petrov@example.ru" \ -F "sign_type=pep_only"

Пример ответа

{ "success": true, "document_id": "3f9615873bf58c77", "document": { ... }, "sign_url": "https://cert4u.ru/client.html?token=a2ca29edd846909bf...", "sign_token": "a2ca29edd846909bf7895b56a6426a45", "pep_code": "533441", "client": { "id": "9c1d0e7a52b4f613", "name": "Петров Пётр Петрович", "phone": "+79001234567", "email": "petrov@example.ru" }, "sandbox": false, "message": "Документ отправлен на подписание", "notifications": { ... } }

Повторно получить ссылку на уже отправленный документ можно через api_1c_pep_status&doc_id=... — вернёт тот же sign_url без повторной отправки SMS/письма. Повтор запроса с тем же Idempotency-Key (в течение 24 ч) вернёт document_id, document и "idempotent": true без новой отправки.

Если с вашей стороны нужна УКЭП конкретного лица (например, директора), используйте раздельный путь: api_1c_upload_signed (документ вместе с вашей подписью) → затем api_1c_send.


folder Список документов

GET api.php?action=api_1c_documents

Возвращает документы вашего аккаунта (постранично).

Параметры

ПараметрТипОписание
api_keystringобяз.API ключ (или заголовок X-Api-Key)
limitintопц.Размер страницы, по умолчанию 50, максимум 200
offsetintопц.Смещение, по умолчанию 0

Пример запроса

curl "https://cert4u.ru/api.php?action=api_1c_documents&limit=50&offset=0" \ -H "X-Api-Key: ВАШ_КЛЮЧ"

Пример ответа

{ "success": true, "documents": [ { "id": "abc123def4567890", "name": "Договор ипотеки", "original_name": "ИПОТЕКА.pdf", "status": "completed", "client_name": "Иванов Иван Иванович", "created_at": "2026-03-12 17:10:01", "admin_signed_at": "2026-03-12 17:10:14", "client_signed_at": "2026-03-12 17:46:46", "client_sign_type": "ukep", "legal_status": "UKEP_OK", "has_manual_review": false } ], "total": 128, "limit": 50, "offset": 0 }

legal_status (UKEP_OK | UKEP_SUSPECT | UNEP | null) и has_manual_review — краткий итог 63-ФЗ-валидации подписи клиента; полный cert_validation — в api_1c_document.

Статусы документа

СтатусОписание
newЗагружен, не подписан
signed_adminПодписан отправителем (загружена УКЭП через api_1c_upload_signed)
sentОтправлен клиенту на подписание
completedПодписан обеими сторонами
rejectedКлиент отклонил подписание
revokedОтозван отправителем

description Получить документ

GET api.php?action=api_1c_document

Возвращает подробную информацию об одном документе.

Параметры

ПараметрТипОписание
api_keystringобяз.API ключ (или заголовок X-Api-Key)
idstringобяз.ID документа

Пример запроса

curl "https://cert4u.ru/api.php?action=api_1c_document&id=abc123def4567890" \ -H "X-Api-Key: ВАШ_КЛЮЧ"

Пример ответа

{ "success": true, "document": { "id": "abc123def4567890", "name": "Договор ипотеки", "original_name": "ИПОТЕКА.pdf", "status": "completed", "description": "", "client_id": "client001abc2345", "client_name": "Иванов Иван Иванович", "created_at": "2026-03-12 17:10:01", "admin_signed_at": "2026-03-12 17:10:14", "client_signed_at": "2026-03-12 17:46:46", "client_sign_type": "ukep", "cert_validation": { "legal_status": "UKEP_OK", ... } } }

cert_validation — полный результат 63-ФЗ-валидации подписи клиента (см. раздел проверки); null, пока клиент не подписал.

upload_file Загрузить документ

POST api.php?action=api_1c_upload

Загружает новый документ в систему (статус new). Используйте multipart/form-data. Поддерживает заголовок Idempotency-Key — повтор с тем же ключом вернёт уже созданный документ ("idempotent": true), а не создаст дубль.

Параметры

ПараметрТипОписание
api_keystringобяз.API ключ (или заголовок X-Api-Key)
documentfileобяз.Файл документа (pdf, doc, docx, txt, rtf, odt, xls, xlsx, png, jpg, jpeg)
doc_namestringопц.Название документа (по умолчанию «Без названия»)
descriptionstringопц.Описание документа
client_idstringопц.ID клиента (привязка; можно указать позже в api_1c_send)
signer_innstringопц.ИНН того, кто должен подписать (УКЭП): 12 цифр — личный ИНН физлица/ИП/руководителя, 10 цифр — ИНН организации в сертификате. См. проверку подписанта
signer_snilsstringопц.СНИЛС того, кто должен подписать (11 цифр, можно с дефисами/пробелами)

Пример запроса (cURL)

curl -X POST "https://cert4u.ru/api.php?action=api_1c_upload" \ -H "X-Api-Key: ВАШ_КЛЮЧ" \ -H "Idempotency-Key: 1c-upload-000123" \ -F "document=@/path/to/contract.pdf" \ -F "doc_name=Договор поставки №123" \ -F "description=Договор от 01.03.2026" \ -F "client_id=client001abc2345"

Пример ответа

{ "success": true, "document": { "id": "a1b2c3d4e5f67890", "name": "Договор поставки №123", "original_name": "contract.pdf", "status": "new", "client_id": "client001abc2345", "created_at": "2026-03-27 14:30:00" }, "message": "Документ загружен через API 1С" }

Максимальный размер файла: определяется настройками PHP на сервере (обычно 20 МБ). Допустимые расширения: pdf, doc, docx, txt, rtf, odt, xls, xlsx, png, jpg, jpeg. Каждый файл проверяется антивирусом; заражённый файл отклоняется с ошибкой 400.

block Серверная подпись отключена

POST api.php?action=api_1c_sign_admin

Метод отключён и всегда отвечает HTTP 410: серверная подпись (OpenSSL) не является УКЭП и не подтверждает, что документ подписала ваша организация.

Вместо него:

• нужна подпись вашей организации — подпишите документ УКЭП в 1С и загрузите через api_1c_upload_signed (формат: прикреплённая или открепленная), затем api_1c_send;

• подписывает только контрагент — api_1c_send_document или api_1c_pep_send.

Ответ

HTTP/1.1 410 Gone { "success": false, "message": "Серверная подпись отключена: она не является УКЭП. Подпишите документ УКЭП в 1С и загрузите его методом api_1c_upload_signed (документ + .sig)." }

send Отправить клиенту

POST api.php?action=api_1c_send

Отправляет клиенту ссылку для подписания по SMS и/или email для уже загруженного документа (например, после api_1c_upload_signed — повторно файл слать не нужно). Документ должен быть в статусе signed_admin. Получателя можно указать по client_id (клиент вашего аккаунта) или напрямую — ФИО + телефон/почта: тогда контакт ищется среди ваших клиентов по телефону/email, а если не найден, создаётся скрытый (как в api_1c_send_document).

Параметры

ПараметрТипОписание
api_keystringобяз.API ключ (или заголовок X-Api-Key)
doc_idstringобяз.ID документа
client_idstringclient_id ИЛИ inlineID клиента вашего аккаунта (назначает/переопределяет получателя). Можно не указывать, если клиент уже привязан к документу
client_namestringinlineФИО получателя (используется, если нет client_id)
client_phone / client_emailstringinlineТелефон и/или почта получателя (нужен хотя бы один вместе с client_name)
sign_typestringопц.ukep_only, pep_only или пусто (оба варианта)
signer_innstringопц.ИНН того, кто должен подписать (УКЭП): 12 цифр — личный ИНН физлица/ИП/руководителя, 10 цифр — ИНН организации в сертификате. См. проверку подписанта
signer_snilsstringопц.СНИЛС того, кто должен подписать (11 цифр, можно с дефисами/пробелами)

Поддерживает песочницу; вне песочницы списывает одну отправку по тарифу.

Пример запроса (клиент по ID)

curl -X POST "https://cert4u.ru/api.php?action=api_1c_send" \ -H "X-Api-Key: ВАШ_КЛЮЧ" \ -H "Content-Type: application/json" \ -d '{"doc_id": "a1b2c3d4e5f67890", "client_id": "client002def6789", "sign_type": "ukep_only"}'

Пример запроса (получатель inline, без создания клиента)

curl -X POST "https://cert4u.ru/api.php?action=api_1c_send" \ -H "X-Api-Key: ВАШ_КЛЮЧ" \ -H "Content-Type: application/json" \ -d '{"doc_id": "a1b2c3d4e5f67890", "client_name": "Петров Пётр Петрович", "client_phone": "89001234567", "sign_type": "pep_only"}'

Пример ответа

{ "success": true, "document": { ... }, "sign_url": "https://cert4u.ru/client.html?token=a1b2c3d4...", "pep_code": "384729", "sandbox": false, "message": "Документ отправлен клиенту", "notifications": { "sms": true, "email": true } }
ukep_only
Клиент сможет подписать только УКЭП (КриптоПро)
pep_only
Только ПЭП (код из SMS/email)

verified_user Проверить подписи

GET api.php?action=api_1c_verify

Полная криптографическая проверка подписей документа. Для УКЭП используется КриптоПро CSP (ГОСТ Р 34.10-2012). Возвращает данные сертификата: ИНН, СНИЛС, ОГРН и другие реквизиты.

Параметры

ПараметрТипОписание
api_keystringобяз.API ключ (или заголовок X-Api-Key)
idstringобяз.ID документа (синоним — doc_id)

Пример запроса

curl "https://cert4u.ru/api.php?action=api_1c_verify&id=abc123def4567890" \ -H "X-Api-Key: ВАШ_КЛЮЧ"

Пример ответа (УКЭП)

{ "success": true, "document_id": "abc123def4567890", "document_name": "ИПОТЕКА.pdf", "status": "completed", "admin_signature": { "type": "CAdES-BES (УКЭП)", "signed_at": "2026-03-12 17:10:14", "valid": true, "crypto_verify": true, "crypto_method": "CryptoPro CSP 5.0 (cryptcp)", "sig_format": "attached", "stored_cert_info": { "subject_cn": "ООО Ваша Компания", "subject_inn": "771234567890", "subject_snils": "98765432100", "subject_ogrn": "1027700000001", "subject_org": "ООО Ваша Компания", "subject_title": "ГЕНЕРАЛЬНЫЙ ДИРЕКТОР", "issuer_cn": "Центральный банк РФ", "serial": "0123456789ABCDEF0123456789ABCDEF", "valid_from": "2025-12-17 09:23:22", "valid_to": "2039-06-26 12:10:31" } }, "client_signature": { "type": "CAdES-BES (УКЭП)", "signed_at": "2026-03-12 17:46:46", "client_name": "Иванов Иван Иванович", "valid": true, "crypto_verify": true, "sig_format": "detached", "stored_cert_info": { "subject_cn": "Иванов Иван Иванович", "subject_inn": "770312345678", "subject_snils": "12345678901", "subject_email": "ivanov@example.ru", "issuer_cn": "ООО Удостоверяющий Центр", "serial": "FEDCBA9876543210AB...", "thumbprint": "AABB0011CCDD2233..." }, "cert_validation": { "legal_status": "UKEP_OK", ... } }, "cosigned_signature": { "type": "CAdES-BES, совместная (одна прикреплённая подпись: документ + все подписи сторон)", "file": "abc123def4567890_cosigned.sig", "sig_format": "attached", "signers": 2, "crypto_verify": true, "crypto_chain_warning": false, "content_mismatch": false, "created_at": "2026-03-12 17:46:50" }, "download_zip_url": "https://cert4u.ru/api.php?action=api_1c_download_zip&api_key=...&id=abc123def4567890" }

sig_format — формат подписи: detached (открепленная, .sig без документа) или attached (прикреплённая, документ внутри .sig). Формат определяется по самой подписи. Для прикреплённой сервер дополнительно сверяет вложенный документ с документом в системе; при расхождении — crypto_verify=false и content_mismatch=true. Если подпись математически верна, но цепочку сертификатов проверить полностью не удалось, добавляется crypto_chain_warning.

cosigned_signature — есть, только если документ подписан совместной подписью: один файл, внутри документ и подписи всех сторон (отправитель + клиент). signers — сколько подписей в файле, crypto_verify — КриптоПро подтвердил все подписи, content_mismatch — документ внутри не совпадает с документом в системе. В ZIP-архиве этот файл отдаётся как Документ.pdf.sig (см. ZIP-архив).

download_zip_url содержит API-ключ в параметре api_key — не передавайте эту ссылку третьим лицам и не пишите её в общие логи.

Поля stored_cert_info

ПолеОписание
subject_cnФИО / наименование организации
subject_innИНН подписанта
subject_snilsСНИЛС подписанта
subject_ogrnОГРН организации
subject_orgОрганизация
subject_titleДолжность
subject_emailEmail
issuer_cnУдостоверяющий центр
serialСерийный номер сертификата
thumbprintОтпечаток (SHA1)
valid_from / valid_toСрок действия сертификата

Валидация подписи (63-ФЗ)

Для каждой УКЭП-подписи в ответе api_1c_verify и в поле cert_validation документа возвращается юридический статус:

ПолеОписание
legal_statusUKEP_OK — соответствует УКЭП по 63-ФЗ
UKEP_SUSPECT — УКЭП, но есть поведенческие маркеры
UNEP — не соответствует УКЭП (УНЭП)
problems[]Критические проблемы (влияют на legal_status)
warnings[]Предупреждения (не влияют на статус)
manual_review[]Маркеры, требующие ручной проверки
codes[]Коды всех сработавших проверок
aucИнформация об аккредитации УЦ (реестр Минцифры)
revocationСтатус отзыва сертификата (CRL)

Проверки при подписании (блокировка)

Настраиваются в кабинете оператора → Настройки → Валидация подписей. При включении — клиент получит отказ при попытке подписать:

Параметр (validation_checks)Описание
REQUIRE_INN_MATCHЭЦП должна совпадать со стороной договора. Блокирует если ИНН в сертификате ≠ ИНН контрагента в системе
REQUIRE_TRUSTED_CAУКЭП только из доверенного УЦ. Блокирует если УЦ не в реестре аккредитованных УЦ Минцифры РФ
KEY_USAGE_NON_REPUDIATIONТребовать атрибут nonRepudiation в сертификате
REQUIRE_KC2_PLUSТребовать аппаратное СКЗИ (класс KC2+)
require_ukep_strictГлобально блокировать все УНЭП-подписи

people Клиенты: список и создание

GET api.php?action=api_1c_clients

Возвращает клиентов (контрагентов) вашего аккаунта. Скрытые контакты, созданные автоматически при отправке с получателем «inline» (api_1c_send_document, api_1c_send без client_id), в список не попадают.

Пример ответа

{ "success": true, "clients": [ { "id": "client002def6789", "name": "Петров Пётр Петрович", "email": "petrov@example.ru", "phone": "+79001234567", "company": "ИП Петров Пётр Петрович", "inn": "770000000001", "ogrn": "3050000000001" } ] }

Создать клиента (контрагента)

POST api.php?action=api_1c_clients

Создаёт клиента в вашем аккаунте и возвращает его id для последующей отправки (api_1c_send, api_1c_pep_send, api_1c_pep_bulk). Тело — JSON или форма. Если у вашего аккаунта уже есть клиент с таким email или phone — возвращается существующий ("existed": true), дубль не создаётся. Телефоны сравниваются по цифрам: 8 900 123-45-67, +7 (900) 123-45-67 и 9001234567 — один и тот же номер. Клиенты других аккаунтов при поиске не учитываются.

Параметры

ПараметрТипОписание
namestringобяз.ФИО или наименование контрагента
emailstringemail или phoneEmail (на него уходит ссылка на подписание)
phonestringemail или phoneТелефон (на него уходит SMS)
company, innstringопц.Организация, ИНН
ogrn, kpp, address, contact_person, positionstringопц.Доп. реквизиты

Пример запроса (cURL)

curl -X POST "https://cert4u.ru/api.php?action=api_1c_clients" \ -H "X-Api-Key: ВАШ_КЛЮЧ" \ -H "Content-Type: application/json" \ -d '{"name":"Петров Пётр Петрович","email":"petrov@example.ru","phone":"+79001234567","inn":"770000000001"}'

Пример ответа

{ "success": true, "client": { "id": "757f1b1cf22fe8d5", "name": "Петров Пётр Петрович", "email": "petrov@example.ru", "phone": "+79001234567", "inn": "770000000001", ... }, "existed": false, "message": "Клиент создан" }

При "existed": true возвращается ранее сохранённая карточка без изменений (переданные реквизиты её не перезаписывают), message = «Клиент уже существует, возвращён существующий».

archive Скачать ZIP-архив

GET api.php?action=api_1c_download_zip

Скачивает комплект документов в ZIP-архиве (Content-Type: application/zip, имя файла — <имя документа>_signed.zip).

Параметры

ПараметрТипОписание
api_keystringобяз.API ключ (или заголовок X-Api-Key)
idstringобяз.ID документа

Содержимое архива

Имена файлов строятся от исходного имени документа; ниже для примера — Документ.pdf.

ФайлКогда естьОписание
Документ.pdfвсегдаОригинал документа (как был загружен)
protocol.pdfвсегдаPDF-протокол подписания со штампом «Подписано ЭП» (реквизиты сертификатов, результаты проверки, SHA-256 документа)
Документ.pdf.sigесть совместная подписьСовместная подпись: один файл CAdES-BES (прикреплённая) — внутри документ и подписи всех сторон. В этом случае отдельных _server.sig и _client.sig в архиве нет
Документ_server.sigнет совместной подписиПодпись отправителя: УКЭП CAdES-BES (открепленная или прикреплённая) либо техническая серверная подпись OpenSSL (api_1c_sign_admin)
Документ_client.sigклиент подписал УКЭП, нет совместнойПодпись клиента CAdES-BES
Документ_client.pep.txtклиент подписал ПЭППодтверждение ПЭП (клиент, документ, дата, код подтверждения)

Сертификат сервера (server.crt) и текстовый протокол в архив не входят. Совместную подпись Документ.pdf.sig достаточно открыть в Контур.Крипто или КриптоПро — будут видны документ и все подписи. Подробнее — в разделе «Формат подписи».

Пример запроса

curl -o signed.zip "https://cert4u.ru/api.php?action=api_1c_download_zip&id=abc123def4567890" \ -H "X-Api-Key: ВАШ_КЛЮЧ"

block Отозвать документ

POST api.php?action=api_1c_revoke

Отзывает документ — ссылка для подписания деактивируется, клиент видит сообщение об отзыве с причиной. Нельзя отозвать уже подписанный (completed) документ.

Параметры

ПараметрТипОписание
api_keystringобяз.API ключ (или заголовок X-Api-Key)
doc_idstringобяз.ID документа
reasonstringопц.Причина отзыва (видна клиенту)

Пример запроса

curl -X POST "https://cert4u.ru/api.php?action=api_1c_revoke" \ -H "X-Api-Key: ВАШ_КЛЮЧ" \ -H "Content-Type: application/json" \ -d '{"doc_id": "a1b2c3d4e5f67890", "reason": "Ошибка в документе, будет загружена новая версия"}'

Пример ответа

{ "success": true, "message": "Документ отозван", "document": { "id": "a1b2c3d4e5f67890", "status": "revoked", "revoked_at": "2026-04-27 10:30:00", "revoke_reason": "Ошибка в документе" } }

Статусы документа

СтатусМожно отозвать?Описание
newДаНовый, не подписан сервером
signed_adminДаПодписан отправителем (УКЭП), не отправлен
sentДаОтправлен клиенту, ожидает подписи
completedНетПодписан обеими сторонами
rejectedДаОтклонён клиентом
revoked—Уже отозван

key УКЭП отправителя из 1С и контейнеры

Основной способ поставить УКЭП вашей организации из 1С — подписать файл на стороне 1С (штатный МенеджерКриптографии, КриптоАРМ) и загрузить документ вместе с подписью методом api_1c_upload_signed. Формат подписи (открепленная/прикреплённая) берите из api_1c_settings.

Методы api_1c_upload_container / api_1c_delete_container позволяют хранить на сервере зашифрованный вашим PIN-кодом контейнер закрытого ключа (AES-256-CBC, сервер PIN не хранит). Работают только с ключами, привязанными к аккаунту.

upload Загрузить контейнер УКЭП

POST api.php?action=api_1c_upload_container

Загружает контейнер закрытого ключа КриптоПро для серверной подписи. Контейнер шифруется вашим PIN и хранится в зашифрованном виде. Только для тенантных ключей (не admin).

Параметры

ПараметрТипОписание
api_keystringобяз.API ключ (или заголовок X-Api-Key)
pinstringобяз.PIN-код (мин. 4 символа) для шифрования контейнера
containerfileопц.*Файл контейнера (multipart upload)
container_base64stringопц.*Контейнер в base64 (JSON body)

* Укажите container или container_base64

Пример запроса

curl -X POST "https://cert4u.ru/api.php?action=api_1c_upload_container" \ -H "X-Api-Key: ВАШ_КЛЮЧ" \ -F "pin=MySecretPin123" \ -F "container=@/path/to/container.000"

Пример ответа

{ "success": true, "message": "Контейнер загружен и зашифрован вашим PIN. Сервер НЕ хранит PIN.", "has_container": true }

Безопасность: контейнер шифруется AES-256-CBC с ключом = SHA-256(PIN + user_id). Сервер не хранит PIN. Важно: метод api_1c_sign_admin отключён — для УКЭП организации используйте api_1c_upload_signed.

delete Удалить контейнер УКЭП

POST api.php?action=api_1c_delete_container

Удаляет загруженный контейнер закрытого ключа с сервера. Только для тенантных ключей.

Параметры

ПараметрТипОписание
api_keystringобяз.API ключ (или заголовок X-Api-Key)

Пример запроса

curl -X POST "https://cert4u.ru/api.php?action=api_1c_delete_container" \ -H "X-Api-Key: ВАШ_КЛЮЧ"

Пример ответа

{ "success": true, "message": "Контейнер удалён" }

verified Загрузить подписанный документ

POST api.php?action=api_1c_upload_signed

Загружает документ вместе с готовой подписью (.sig) отправителя — открепленной (detached) или прикреплённой (attached, документ внутри .sig), например УКЭП вашей организации (директора), сформированной в 1С штатным МенеджерКриптографии или в КриптоАРМ. Документ сохраняется со статусом signed_admin, дальше его можно отправить контрагенту через api_1c_send (повторно загружать файл не нужно).

Сервер проверяет подпись через КриптоПро CSP (ГОСТ Р 34.10-2012) и извлекает реквизиты подписанта (ФИО, ИНН, СНИЛС, ОГРН, УЦ, срок действия) из самой подписи. Файл signature принимается как сырой DER, так и как base64 (в том числе с переносами строк); формат (открепленная/прикреплённая) сервер определяет сам. Для прикреплённой подписи документ внутри .sig должен побайтно совпадать с document, иначе crypto_verify=false и content_mismatch=true. Поддерживает заголовок Idempotency-Key.

Как сделать прикреплённую или открепленную подпись

Формат задаётся в момент подписания на вашей стороне (в 1С, КриптоАРМ, cryptcp). Отдельного параметра в запросе нет: сервер сам определяет формат по файлу .sig и возвращает его в поле sig_format.

ФорматЧто внутри .sigЧто получит контрагент
Прикреплённая (attached)
sig_format: "attached"
Документ + подпись организацииЕсли контрагент подпишет УКЭП — один файл Документ.pdf.sig, в нём документ и подписи обеих сторон (совместная подпись)
Открепленная (detached)
sig_format: "detached"
Только подпись, документа внутри нетДокумент и подписи сторон отдельными файлами (_server.sig, _client.sig)

Юридически оба формата равноценны (CAdES-BES, 63-ФЗ); сервер принимает оба независимо от настройки сервиса. Чтобы формат совпадал с настройкой администратора, перед подписанием вызовите GET api_1c_settings и возьмите sig_attached.

1С (МенеджерКриптографии, платформа 8.3.21+) — последний параметр НачатьПодписаниеДанныхCAdES («Отсоединенная»):

// sig_attached из api_1c_settings: Истина = прикреплённая, Ложь = открепленная МенеджерКриптографии.НачатьПодписаниеДанныхCAdES( ОписаниеОповещения, ДанныеДокумента, // ДвоичныеДанные файла — те же байты, что уйдут в document Сертификат, ТипПодписиCAdES.BES, Не sig_attached); // Ложь → ПРИКРЕПЛЁННАЯ (документ внутри .sig) // Истина → ОТКРЕПЛЕННАЯ (.sig отдельно)

КриптоПро cryptcp (командная строка):

# прикреплённая (без -detached) cryptcp -sign -thumbprint ОТПЕЧАТОК_СЕРТИФИКАТА -cadesbes -der contract.pdf contract.pdf.sig # открепленная cryptcp -sign -thumbprint ОТПЕЧАТОК_СЕРТИФИКАТА -cadesbes -der -detached contract.pdf contract.pdf.sig

КриптоПро ЭЦП Browser plug-in (JavaScript): oSignedData.SignCades(oSigner, CADESCOM_CADES_BES, bDetached) — bDetached = false → прикреплённая, true → открепленная.

КриптоАРМ: в мастере подписи снимите флажок «Сохранить подпись в отдельном файле» (отделённая подпись) — получится прикреплённая; установленный флажок — открепленная.

Важно для прикреплённой: в document отправляйте ровно тот же файл, что подписывали (байт в байт). Если документ внутри .sig отличается, ответ будет crypto_verify=false, content_mismatch=true. Совместная подпись (один файл на обе стороны) собирается, только если подпись организации прикреплённая и контрагент подписывает УКЭП; при ПЭП контрагента подпись организации остаётся как есть.

Параметры

ПараметрТипОписание
api_keystringобяз.API ключ (или заголовок X-Api-Key)
documentfileобяз.Файл документа (pdf, doc, docx, txt, rtf, odt, xls, xlsx, png, jpg, jpeg)
signaturefileобяз.Файл подписи CAdES-BES (.sig): открепленная или прикреплённая, DER или base64
doc_namestringобяз.Название документа
descriptionstringопц.Описание
client_idstringопц.ID клиента (можно указать позже в api_1c_send)
cert_infoJSON stringопц.Подсказка для полей, которых может не быть в сертификате: subject_title, subject_email. Идентифицирующие реквизиты (ФИО, ИНН, СНИЛС и т.д.) всегда берутся только из .sig
signer_innstringопц.ИНН того, кто должен подписать (УКЭП): 12 цифр — личный ИНН физлица/ИП/руководителя, 10 цифр — ИНН организации в сертификате. См. проверку подписанта
signer_snilsstringопц.СНИЛС того, кто должен подписать (11 цифр, можно с дефисами/пробелами)

Пример запроса

curl -X POST "https://cert4u.ru/api.php?action=api_1c_upload_signed" \ -H "X-Api-Key: ВАШ_КЛЮЧ" \ -F "document=@/path/to/contract.pdf" \ -F "signature=@/path/to/contract.pdf.sig" \ -F "doc_name=Договор поручительства №123"

Пример ответа

{ "success": true, "document": { "id": "f1e2d3c4b5a69870", "name": "Договор поручительства №123", "status": "signed_admin", "admin_signed_at": "2026-04-22 10:30:00", "admin_cert_info": { "subject_cn": "Иванов Иван Иванович", "subject_inn": "7701234567", "issuer_cn": "Сертум-Про", "valid_to": "2027-03-15" } }, "message": "Документ загружен с подписью УКЭП", "crypto_verify": true, "crypto_method": "CryptoPro CSP 5.0 (cryptcp)", "sig_format": "attached" }

При неуспешной проверке добавляется crypto_error (текст ошибки КриптоПро), а для прикреплённой подписи с другим документом внутри — content_mismatch: true. Документ при этом всё равно сохраняется — проверяйте crypto_verify в ответе.

tune Настройки для 1С: формат подписи

GET api.php?action=api_1c_settings

Возвращает формат УКЭП, выбранный в вашем аккаунте: Настройки → «Формат подписи УКЭП». Если в аккаунте формат не выбран, действует общая настройка сервиса. Вызывайте метод перед формированием подписи в 1С: для НачатьПодписаниеДанныхCAdES параметр «Отсоединенная» = Не sig_attached.

Параметры

ПараметрТипОписание
api_keystringобяз.API ключ (или заголовок X-Api-Key)

Пример ответа

{ "success": true, "sig_attached": true, "sig_format": "attached" }

Открепленная, прикреплённая и совместная подпись

ФорматЧто это
detached — открепленнаяФайл .sig содержит только подпись; документ лежит отдельно. Проверка требует оба файла.
attached — прикреплённаяДокумент находится внутри .sig. Один файл можно открыть и проверить в любом сервисе проверки ЭП.
Совместная (CoSign)Один прикреплённый .sig, в котором документ и подписи всех сторон (отправитель + клиент). Проверяется целиком, например, в Контур.Крипто. Формируется, когда подпись отправителя прикреплённая и клиент подписывает УКЭП; в ZIP отдаётся как Документ.pdf.sig, в api_1c_verify — блок cosigned_signature.

Проверка подписей (api_1c_verify, api_1c_upload_signed) принимает оба формата независимо от этой настройки — она определяет только, какую подпись формировать. Чтобы получать совместную подпись, выберите в аккаунте прикреплённый формат и подписывайте документы прикреплённой подписью.


sms API для ПЭП (простая электронная подпись)

Упрощённый набор методов для работы с простой электронной подписью. Позволяет отправить документ на подписание ПЭП в один запрос.

sms ПЭП: отправить документ

POST api.php?action=api_1c_pep_send

Комбинированный метод: загружает документ (или берёт существующий в статусе new) и сразу отправляет его клиенту на подписание ПЭП — SMS с кодом и уведомление со ссылкой. Подпись отправителя не ставится: документ переходит из new сразу в sent с sign_type = pep_only. Поддерживает Idempotency-Key (повтор не шлёт новую SMS) и песочницу.

Параметры

ПараметрТипОписание
api_keystringобяз.API ключ (или заголовок X-Api-Key)
client_idstringобяз.ID клиента вашего аккаунта (создать — POST api_1c_clients). Получатель inline здесь не поддерживается — для этого есть api_1c_send_document с sign_type=pep_only
doc_idstringdoc_id ИЛИ documentСуществующий документ в статусе new
documentfiledoc_id ИЛИ documentЗагрузить новый файл (multipart)
doc_namestringопц.Название (при загрузке нового)
descriptionstringопц.Описание

Пример запроса (новый документ)

curl -X POST "https://cert4u.ru/api.php?action=api_1c_pep_send" \ -H "X-Api-Key: ВАШ_КЛЮЧ" \ -H "Idempotency-Key: 1c-pep-000123" \ -F "client_id=client002def6789" \ -F "document=@/path/to/agreement.pdf" \ -F "doc_name=Согласие на обработку ПД"

Пример запроса (существующий документ)

curl -X POST "https://cert4u.ru/api.php?action=api_1c_pep_send" \ -H "X-Api-Key: ВАШ_КЛЮЧ" \ -H "Content-Type: application/json" \ -d '{"client_id": "client002def6789", "doc_id": "a1b2c3d4e5f67890"}'

Пример ответа

{ "success": true, "document": { ... }, "sign_url": "https://cert4u.ru/client.html?token=...", "pep_code": "482917", "sandbox": false, "message": "ПЭП-документ отправлен через API 1С", "pep_send_results": { ... }, "notifications": { ... } }

refresh ПЭП: переотправить код

POST api.php?action=api_1c_pep_send_code

Генерирует новый 6-значный код (прежний перестаёт действовать) и отправляет его клиенту. Документ должен быть в статусе sent. Песочница на этот метод не распространяется — код отправляется реально.

Параметры

ПараметрТипОписание
api_keystringобяз.API ключ (или заголовок X-Api-Key)
doc_idstringобяз.ID документа
methodstringопц.sms, email или both (по умолч. sms)

Пример ответа

{ "success": true, "pep_code": "739284", "message": "Новый ПЭП-код отправлен", "send_results": { ... } }

info ПЭП: проверить статус

GET api.php?action=api_1c_pep_status

Возвращает текущий статус документа, данные клиента и — пока документ ожидает подписи (статус sent) — ссылку на подписание sign_url. Так можно повторно получить ссылку без повторной отправки SMS/письма. Работает для любого документа аккаунта, не только ПЭП.

Параметры

ПараметрТипОписание
api_keystringобяз.API ключ (или заголовок X-Api-Key)
doc_idstringобяз.ID документа (синоним — id)

Пример ответа

{ "success": true, "document_id": "a1b2c3d4e5f67890", "document_name": "Согласие на обработку ПД", "status": "completed", "sign_type": "pep_only", "pep_code": "482917", "client": { "id": "client002def6789", "name": "Петров Пётр Петрович", "email": "petrov@example.ru", "phone": "+79001234567" }, "created_at": "2026-03-27 14:30:00", "sent_at": "2026-03-27 14:31:00", "signed_at": "2026-03-27 15:12:00", "client_sign_type": "pep", "sign_url": null }

sign_url заполнен только в статусе sent (например, "https://cert4u.ru/client.html?token=..."); после подписания, отзыва или отклонения — null.

group_add ПЭП: массовая отправка

POST api.php?action=api_1c_pep_bulk

Отправляет один документ на ПЭП-подписание сразу нескольким клиентам. Для каждого клиента создаётся отдельная копия документа (свой doc_id, ссылка и код) в статусе sent. Каждая копия — одна отправка по тарифу. Поддерживает Idempotency-Key (повтор возвращает "results": [], "idempotent": true и ничего не рассылает) и песочницу.

Параметры

ПараметрТипОписание
api_keystringобяз.API ключ (или заголовок X-Api-Key)
doc_idstringобяз.ID исходного документа вашего аккаунта
client_idsarray/stringобяз.Массив ID клиентов или строка через запятую

Пример запроса

curl -X POST "https://cert4u.ru/api.php?action=api_1c_pep_bulk" \ -H "X-Api-Key: ВАШ_КЛЮЧ" \ -H "Content-Type: application/json" \ -d '{ "doc_id": "a1b2c3d4e5f67890", "client_ids": ["client002def6789", "client003ghi0123", "client001abc2345"] }'

Пример ответа

{ "success": true, "results": [ { "client_id": "client002def6789", "client_name": "Петров Пётр Петрович", "doc_id": "f1e2d3c4b5a69870", "sign_url": "https://cert4u.ru/client.html?token=...", "pep_code": "194738", "sandbox": false }, { "client_id": "client003ghi0123", "client_name": "Сидоров Алексей Сергеевич", "doc_id": "e2d3c4b5a6987012", "sign_url": "https://cert4u.ru/client.html?token=...", "pep_code": "582641", "sandbox": false }, { "client_id": "client001abc2345", "error": "Клиент не найден" } ], "message": "ПЭП-документы отправлены через API 1С" }

webhook Вебхуки

Вместо периодического опроса статусов настройте вебхук — Cert4U сам пришлёт POST на ваш URL при событиях с документами вашего аккаунта. Методы доступны только ключам, привязанным к аккаунту (иначе 403). Формат доставки и список событий подробно — на странице REST API → Вебхуки.

actionHTTPПараметрыНазначение
api_1c_webhook_setPOSTurl (только https, обяз.), events (массив или через запятую; по умолчанию — все события)Установить/обновить вебхук. В ответе — secret для проверки подписи (генерируется при первой установке и сохраняется при обновлении; показывается полностью только здесь)
api_1c_webhook_getGET—Текущая настройка: configured, url, events, active, created_at, secret_last6 (маскированный секрет)
api_1c_webhook_deletePOST—Удалить вебхук
curl -X POST "https://cert4u.ru/api.php?action=api_1c_webhook_set" \ -H "X-Api-Key: ВАШ_КЛЮЧ" \ -H "Content-Type: application/json" \ -d '{"url": "https://erp.example.ru/cert4u-hook", "events": ["document.signed", "document.completed"]}'

Проверка подлинности: каждая доставка содержит заголовок X-Cert4U-Signature: sha256=<hex> — HMAC-SHA256 от тела запроса с вашим secret. Сверяйте подпись перед обработкой. В режиме песочницы события отправки вебхуки не генерируют.

science Песочница, идемпотентность, лимиты

Песочница (sandbox)

Тестовый режим без реальной отправки SMS/email и без списания лимитов. Включается любым способом: флаг песочницы на API-ключе, заголовок X-Cert4U-Sandbox: 1 или параметр sandbox=1. Действует в методах api_1c_send, api_1c_send_document, api_1c_pep_send, api_1c_pep_bulk: код ПЭП всегда 000000, документ помечается "sandbox": true, в ответе — "sandbox": true, вебхуки не отправляются. На api_1c_pep_send_code песочница не распространяется. Подробнее — REST API → Песочница.

Идемпотентность

Методы api_1c_upload, api_1c_upload_signed, api_1c_send_document, api_1c_pep_send, api_1c_pep_bulk принимают заголовок Idempotency-Key: <уникальная строка> (или параметр idempotency_key). Повтор запроса с тем же ключом в течение 24 часов не создаёт дубль документа и не шлёт повторную SMS — возвращается ранее созданный документ и "idempotent": true. Ключи действуют в пределах вашего аккаунта. Используйте, например, GUID документа 1С — это защищает от дублей при обрыве связи.

Лимиты

error Коды ошибок

HTTP кодСообщениеПричина
400Не указан id документа / Не указан doc_idПропущен обязательный параметр или неверный формат
400Документ уже подписан или имеет некорректный статусОперация недопустима в текущем статусе документа
400Файл заблокирован: обнаружена угроза безопасностиЗагруженный файл не прошёл антивирусную проверку
401Не указан API ключ / Неверный API ключНет ключа в X-Api-Key / Authorization: Bearer / api_key, либо ключ неверный
402API 1С доступен с тарифа Бизнес / Лимит отправок исчерпан / Тестовый период истёкТариф не включает API или закончились отправки
403API для 1С отключен / API ключ деактивирован / API ключ истёкAPI выключен на сервисе, ключ отключён или истёк; также — метод недоступен этому ключу (вебхуки/контейнеры без привязки к аккаунту), неподтверждённый email на тестовом тарифе
404Документ не найденНеправильный doc_id/id или документ принадлежит другому аккаунту
429Превышен лимит запросов / Дневной лимит API исчерпанБолее 60 запросов в минуту (IP или ключ) либо исчерпан дневной лимит тарифа

Формат ошибки

{ "success": false, "message": "Описание ошибки" }

code Примеры кода для 1С:Предприятие

Функция HTTP-запроса (базовая)

// Общая функция для GET-запросов к API Функция ВыполнитьЗапросAPI(Действие, Параметры = "") АдресСервера = "cert4u.ru"; КлючAPI = "ВАШ_API_КЛЮЧ"; // Из настроек URL = "/api.php?action=" + Действие; // путь без префикса, ключ — в заголовке Если ЗначениеЗаполнено(Параметры) Тогда URL = URL + "&" + Параметры; КонецЕсли; SSL = Новый ЗащищенноеСоединениеOpenSSL(); Соединение = Новый HTTPСоединение(АдресСервера, 443, , , , 60, SSL); Запрос = Новый HTTPЗапрос(URL); Запрос.Заголовки.Вставить("X-Api-Key", КлючAPI); Ответ = Соединение.Получить(Запрос); Если Ответ.КодСостояния = 200 Тогда ЧтениеJSON = Новый ЧтениеJSON; ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку("UTF-8")); Результат = ПрочитатьJSON(ЧтениеJSON); ЧтениеJSON.Закрыть(); Возврат Результат; Иначе ВызватьИсключение "Ошибка API: " + Ответ.КодСостояния; КонецЕсли; КонецФункции

Функция POST-запроса (JSON)

// POST-запрос с JSON-телом Функция ВыполнитьPOSTЗапросAPI(Действие, ДанныеJSON) АдресСервера = "cert4u.ru"; КлючAPI = "ВАШ_API_КЛЮЧ"; URL = "/api.php?action=" + Действие; SSL = Новый ЗащищенноеСоединениеOpenSSL(); Соединение = Новый HTTPСоединение(АдресСервера, 443, , , , 60, SSL); Запрос = Новый HTTPЗапрос(URL); Запрос.Заголовки.Вставить("X-Api-Key", КлючAPI); Запрос.Заголовки.Вставить("Content-Type", "application/json"); // Формируем JSON ЗаписьJSON = Новый ЗаписьJSON; ЗаписьJSON.УстановитьСтроку(); ЗаписатьJSON(ЗаписьJSON, ДанныеJSON); ТелоJSON = ЗаписьJSON.Закрыть(); Запрос.УстановитьТелоИзСтроки(ТелоJSON, "UTF-8"); Ответ = Соединение.ОтправитьДляОбработки(Запрос); ЧтениеJSON = Новый ЧтениеJSON; ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку("UTF-8")); Результат = ПрочитатьJSON(ЧтениеJSON); ЧтениеJSON.Закрыть(); Возврат Результат; КонецФункции

Загрузка файла (multipart/form-data)

// Загрузка документа через multipart/form-data Функция ЗагрузитьДокумент(ПутьКФайлу, НазваниеДокумента, IDКлиента = "", ПутьКПодписи = "") АдресСервера = "cert4u.ru"; КлючAPI = "ВАШ_API_КЛЮЧ"; // с подписью (.sig) — api_1c_upload_signed, без — api_1c_upload Метод = ?(ЗначениеЗаполнено(ПутьКПодписи), "api_1c_upload_signed", "api_1c_upload"); URL = "/api.php?action=" + Метод; SSL = Новый ЗащищенноеСоединениеOpenSSL(); Соединение = Новый HTTPСоединение(АдресСервера, 443, , , , 60, SSL); Запрос = Новый HTTPЗапрос(URL); Запрос.Заголовки.Вставить("X-Api-Key", КлючAPI); // Защита от дублей при обрыве связи: один и тот же ключ для одного документа Запрос.Заголовки.Вставить("Idempotency-Key", "upload-" + НазваниеДокумента); Граница = "----Boundary" + Строка(Новый УникальныйИдентификатор); Запрос.Заголовки.Вставить("Content-Type", "multipart/form-data; boundary=" + Граница); // Читаем файл ДД = Новый ДвоичныеДанные(ПутьКФайлу); ИмяФайла = Сред(ПутьКФайлу, СтрДлина(ПутьКФайлу) - СтрНайти(ПутьКФайлу, "\") + 2); // Собираем multipart body Тело = "--" + Граница + Символы.ПС; Тело = Тело + "Content-Disposition: form-data; name=""doc_name""" + Символы.ПС + Символы.ПС; Тело = Тело + НазваниеДокумента + Символы.ПС; Если ЗначениеЗаполнено(IDКлиента) Тогда Тело = Тело + "--" + Граница + Символы.ПС; Тело = Тело + "Content-Disposition: form-data; name=""client_id""" + Символы.ПС + Символы.ПС; Тело = Тело + IDКлиента + Символы.ПС; КонецЕсли; Тело = Тело + "--" + Граница + Символы.ПС; Тело = Тело + "Content-Disposition: form-data; name=""document""; filename=""" + ИмяФайла + """" + Символы.ПС; Тело = Тело + "Content-Type: application/pdf" + Символы.ПС + Символы.ПС; // Записываем через поток Поток = Новый ПотокВПамяти; ЗаписьТекста = Новый ЗаписьДанных(Поток); ЗаписьТекста.ЗаписатьСтроку(Тело, "UTF-8"); ЗаписьТекста.Записать(ДД); Если ЗначениеЗаполнено(ПутьКПодписи) Тогда // Подпись: прикреплённая или открепленная CAdES-BES (см. «Как сделать прикреплённую или открепленную подпись») ЧастьПодписи = Символы.ПС + "--" + Граница + Символы.ПС + "Content-Disposition: form-data; name=""signature""; filename=""" + ИмяФайла + ".sig""" + Символы.ПС + "Content-Type: application/octet-stream" + Символы.ПС + Символы.ПС; ЗаписьТекста.ЗаписатьСтроку(ЧастьПодписи, "UTF-8"); ЗаписьТекста.Записать(Новый ДвоичныеДанные(ПутьКПодписи)); КонецЕсли; ЗаписьТекста.ЗаписатьСтроку(Символы.ПС + "--" + Граница + "--" + Символы.ПС, "UTF-8"); ЗаписьТекста.Закрыть(); Запрос.УстановитьТелоИзДвоичныхДанных(Поток.ЗакрытьИПолучитьДвоичныеДанные()); Ответ = Соединение.ОтправитьДляОбработки(Запрос); ЧтениеJSON = Новый ЧтениеJSON; ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку("UTF-8")); Результат = ПрочитатьJSON(ЧтениеJSON); ЧтениеJSON.Закрыть(); Возврат Результат; КонецФункции

Полный цикл: подпись УКЭП → загрузка → отправка

// Полный цикл подписания документа Процедура ОтправитьДокументНаПодпись(ПутьКФайлу, ПутьКПодписи, НазваниеДокумента, IDКлиента) // 1. ПутьКПодписи — .sig вашей УКЭП, сделанный заранее в 1С (МенеджерКриптографии) // или КриптоАРМ. Загружаем документ вместе с подписью (api_1c_upload_signed). РезультатЗагрузки = ЗагрузитьДокумент(ПутьКФайлу, НазваниеДокумента, IDКлиента, ПутьКПодписи); Если НЕ РезультатЗагрузки.success Тогда Сообщить("Ошибка загрузки: " + РезультатЗагрузки.message); Возврат; КонецЕсли; IDДокумента = РезультатЗагрузки.document.id; Сообщить("Документ загружен: " + IDДокумента); // 2. Серверная подпись (api_1c_sign_admin) отключена — документ уже подписан // вашей УКЭП (статус signed_admin). Формат подписи: см. sig_format в ответе. Сообщить("Подпись: " + РезультатЗагрузки.sig_format + ", проверка: " + Формат(РезультатЗагрузки.crypto_verify, "БЛ=нет; БИ=да")); // 3. Отправить клиенту ДанныеОтправки = Новый Структура; ДанныеОтправки.Вставить("doc_id", IDДокумента); ДанныеОтправки.Вставить("sign_type", "ukep_only"); // или "pep_only" РезультатОтправки = ВыполнитьPOSTЗапросAPI("api_1c_send", ДанныеОтправки); Если РезультатОтправки.success Тогда Сообщить("Отправлено! Ссылка: " + РезультатОтправки.sign_url); КонецЕсли; КонецПроцедуры

Проверка подписи и получение ИНН/СНИЛС

// Проверить подписи и получить данные сертификата Функция ПроверитьПодпись(IDДокумента) Результат = ВыполнитьЗапросAPI("api_1c_verify", "id=" + IDДокумента); Если Результат.success Тогда // Данные подписи клиента ПодписьКлиента = Результат.client_signature; Если ПодписьКлиента.valid Тогда Сообщить("Подпись клиента: ВЕРНА"); Сообщить("Тип: " + ПодписьКлиента.type); // Данные из сертификата УКЭП Если ПодписьКлиента.Свойство("stored_cert_info") Тогда Серт = ПодписьКлиента.stored_cert_info; Сообщить("ФИО: " + Серт.subject_cn); Сообщить("ИНН: " + Серт.subject_inn); Сообщить("СНИЛС: " + Серт.subject_snils); Сообщить("ОГРН: " + Серт.subject_ogrn); Сообщить("Орг.: " + Серт.subject_org); Сообщить("УЦ: " + Серт.issuer_cn); КонецЕсли; Иначе Сообщить("Подпись клиента: НЕ ВЕРНА"); КонецЕсли; КонецЕсли; Возврат Результат; КонецФункции

Скачать ZIP-архив

// Скачать подписанный комплект документов Процедура СкачатьАрхив(IDДокумента, ПутьСохранения) АдресСервера = "cert4u.ru"; КлючAPI = "ВАШ_API_КЛЮЧ"; URL = "/api.php?action=api_1c_download_zip&id=" + IDДокумента; SSL = Новый ЗащищенноеСоединениеOpenSSL(); Соединение = Новый HTTPСоединение(АдресСервера, 443, , , , 60, SSL); Запрос = Новый HTTPЗапрос(URL); Запрос.Заголовки.Вставить("X-Api-Key", КлючAPI); Ответ = Соединение.Получить(Запрос); Если Ответ.КодСостояния = 200 Тогда Ответ.ПолучитьТелоКакДвоичныеДанные().Записать(ПутьСохранения); Сообщить("Архив сохранён: " + ПутьСохранения); Иначе Сообщить("Ошибка скачивания: HTTP " + Ответ.КодСостояния); КонецЕсли; КонецПроцедуры

Быстрая ПЭП-отправка (один запрос)

// ПЭП за один запрос: загрузка + подпись + отправка Функция БыстраяОтправкаПЭП(ПутьКФайлу, НазваниеДокумента, IDКлиента) АдресСервера = "cert4u.ru"; КлючAPI = "ВАШ_API_КЛЮЧ"; URL = "/api.php?action=api_1c_pep_send"; // Аналогично ЗагрузитьДокумент(), но с action=api_1c_pep_send // Заголовки: X-Api-Key, Idempotency-Key (повтор не отправит вторую SMS) // Добавляем client_id в multipart form // ... (код multipart как в ЗагрузитьДокумент) // Результат содержит sign_url и pep_code Возврат Результат; КонецФункции

Отправка одним запросом без создания клиента

// api_1c_send_document: файл + ФИО/телефон/email получателя // Multipart собирается так же, как в ЗагрузитьДокумент(), но с полями: // client_name, client_phone и/или client_email, sign_type (pep_only / ukep_only / пусто) // и action=api_1c_send_document в URL URL = "/api.php?action=api_1c_send_document"; // ... ответ: Если Результат.success Тогда IDДокумента = Результат.document_id; // сохраните у себя Сообщить("Ссылка на подписание: " + Результат.sign_url); КонецЕсли;

Массовая отправка ПЭП

// Отправить один документ нескольким клиентам Процедура МассоваяОтправкаПЭП(IDДокумента, МассивIDКлиентов) Данные = Новый Структура; Данные.Вставить("doc_id", IDДокумента); Данные.Вставить("client_ids", МассивIDКлиентов); Результат = ВыполнитьPOSTЗапросAPI("api_1c_pep_bulk", Данные); Если Результат.success Тогда Для Каждого Элемент Из Результат.results Цикл Сообщить(Элемент.client_name + ": " + Элемент.sign_url); КонецЦикла; КонецЕсли; КонецПроцедуры

download Готовая обработка для 1С:Предприятие

Скачайте готовые файлы для сборки внешней обработки (.epf). Внутри — полный исходный код модулей и пошаговая инструкция по сборке в Конфигураторе 1С.

code Модуль объекта

Регистрация обработки, сведения для справочника дополнительных обработок

download Module_ObjectModule.bsl
integration_instructions Модуль формы

Вся бизнес-логика: загрузка, подпись, отправка, проверка, скачивание ZIP

download Form_MainForm_Module.bsl
menu_book Инструкция

Пошаговая сборка .epf в Конфигураторе: реквизиты, формы, команды

download Инструкция по сборке

Также в комплекте: CAdES_signing_module.bsl (УКЭП-подписание в 1С, вставляется в модуль формы), FORM_SPEC.md (структура формы) и 1C_API_INSTRUCTION.md (краткая инструкция по API для 1С-разработчика). В настройках обработки укажите адрес cert4u.ru и путь к API /api.php.

checklist Что умеет обработка

check_circle Просмотр документов и клиентов
check_circle Загрузка документов (PDF, DOCX, XLSX)
check_circle Подписание администратором
check_circle Отправка клиенту (УКЭП / ПЭП)
check_circle Полный цикл за 1 клик
check_circle Проверка подписей (КриптоПро)
check_circle ИНН, СНИЛС, ОГРН из сертификата
check_circle Скачивание ZIP-архива
check_circle Валидация сертификата (срок, УЦ)
check_circle Массовая ПЭП-отправка

Совместимость: 1С:Бухгалтерия, 1С:УНФ, 1С:Управление торговлей, 1С:ERP, 1С:ЗУП и любая конфигурация на управляемых формах (платформа 8.3.14+).