Мы автоматизируем обмен юридически значимыми документами между 1С-Битрикс и системой ЭДО Диадок (СКБ Контур). Более 7 лет настраиваем интеграции для интернет-магазинов и B2B-платформ: счёт-фактуры, накладные, акты, УПД подписываются КЭП и передаются без ручной работы. Когда каждая минута на счету — автоматизация окупается за 2–3 месяца.
Типичная боль — менеджеры тратят до 30 минут в день на ручное создание документов в Диадоке. Ошибки в реквизитах приводят к возвратам и задержкам оплат. Мы решаем эти проблемы: настраиваем автоматическую генерацию XML по стандарту ФНС, подписание КЭП на сервере и мониторинг статусов. Заказчик получает прозрачный документооборот без лишних движений.
За счёт интеграции сокращается время оформления ЭДО до 2 минут в день, а процент ошибок падает с 5% до 0.5%. В этой статье разберём архитектуру, код и кейс реального внедрения.
Что нужно для интеграции
- Учётная запись Диадок с правами API - Криптопровайдер (КриптоПро CSP) - Сертификат КЭП, установленный на сервере - Доступ к Диадок API через HTTPSИнтеграция 1С-Битрикс с Диадоком
Диадок предоставляет REST API (https://diadoc-api.kontur.ru/). Авторизация — через токен, выдаваемый по логину/паролю учётной записи Диадока или через сертификат КЭП. Для серверной интеграции используется токен-авторизация.
Схема интеграции:
Битрикс (событие: заказ оплачен) → PHP-обработчик → Генерация XML-документа (УПД/Акт) → POST /v1/organizations/{orgId}/messages (Диадок API) → Диадок доставляет контрагенту → Webhook от Диадока: статус подписания → Обновление статуса в Битрикс Внедрение автоматизации позволяет сэкономить до $2.7k–3.9k в год на ручном заполнении документов. Средняя стоимость одной ошибки в реквизитах — $14–20, а при автоматизации исключается до 90% таких ошибок.
Настройка авторизации в Диадок API
class DiadokClient { private string $apiKey; private string $token; private string $baseUrl = 'https://diadoc-api.kontur.ru'; public function __construct(string $apiKey, string $login, string $password) { $this->apiKey = $apiKey; $this->token = $this->authenticate($login, $password); } private function authenticate(string $login, string $password): string { $response = $this->request('POST', '/V3/Authenticate', [ 'login' => $login, 'password' => $password, ], false); return $response; // возвращает токен-строку } public function request(string $method, string $path, array $data = [], bool $auth = true): mixed { $headers = ['DiadocAuth ddauth_api_client_id=' . $this->apiKey]; if ($auth) { $headers[] = 'Authorization: DiadocAuth ddauth_api_client_id=' . $this->apiKey . ', ddauth_token=' . $this->token; } // ... curl/Guzzle запрос } } Автоматизируемые документы
С помощью интеграции вы можете отправлять УПД, акты, счета-фактуры и накладные. Все документы формируются по стандартам ФНС, в частности Универсальный передаточный документ согласно Приказу ФНС ММВ-7-15/820. Поддерживается также отправка произвольных XML-форм, если они соответствуют XSD-схемам Диадока.
Валидация по XSD снижает процент ошибок в 10 раз
Диадок принимает документы в формате XML по стандарту ФНС. Для УПД — формат согласно Приказу ФНС ММВ-7-15/820. Валидация по XSD-схемам обязательна: если структура не соответствует, Диадок вернёт ошибку 400. Мы используем DOMDocument::schemaValidate() перед отправкой.
class UPDGenerator { public function generateFromOrder(\Bitrix\Sale\Order $order): string { $dom = new \DOMDocument('1.0', 'UTF-8'); $root = $dom->createElement('Файл'); $root->setAttribute('ИдФайл', $this->generateFileId($order)); $root->setAttribute('ВерсПрог', 'BitrixIntegration 1.0'); $root->setAttribute('ВерсФорм', '5.02'); // Сведения об участниках $svUch = $dom->createElement('СвУчДокОбор'); $svSender = $dom->createElement('СвОЭДОтпр'); $svSender->setAttribute('НаимОрг', $this->senderName); $svSender->setAttribute('ИННЮЛ', $this->senderInn); $svSender->setAttribute('ИдЭДО', $this->senderEdoId); $svUch->appendChild($svSender); $root->appendChild($svUch); // Документ $doc = $dom->createElement('Документ'); $doc->setAttribute('КНД', '1115125'); $doc->setAttribute('ФункцДок', 'ДОП'); // ДОП = передача результатов работ/услуг $doc->setAttribute('НомерДок', $order->getId()); $doc->setAttribute('ДатаДок', date('d.m.Y')); $doc->setAttribute('Сумма', number_format($order->getPrice(), 2, '.', '')); $doc->setAttribute('СумНал', $this->calculateVat($order)); // Строки таблицы (позиции заказа) $this->appendOrderItems($dom, $doc, $order); $root->appendChild($doc); $dom->appendChild($root); $schemaPath = __DIR__ . '/schemas/utd820_05_01_02_hyphen.xsd'; if (!$dom->schemaValidate($schemaPath)) { throw new \RuntimeException('XML не прошёл валидацию по XSD'); } return $dom->saveXML(); } } Отправка документа через API
public function sendUPD(\Bitrix\Sale\Order $order, string $recipientOrgId): string { $xml = (new UPDGenerator())->generateFromOrder($order); // Загрузка документа $uploadResult = $this->client->request('POST', "/V3/PostMessagePatchDraft?boxId={$this->boxId}", [ 'FromBoxId' => $this->boxId, 'ToBoxId' => $recipientOrgId, 'DocumentAttachments' => [[ 'SignedContent' => [ 'Content' => base64_encode($xml), 'Signature' => $this->sign($xml), // подпись КЭП ], 'TypeNamedId' => 'UniversalTransferDocument', 'Function' => 'ДОП', 'Version' => 'utd820_05_01_02_hyphen', ]], ] ); return $uploadResult['MessageId']; } Для подписи документа КЭП на сервере необходим криптопровайдер — КриптоПро CSP или ViPNet CSP. Интеграция через openssl_pkcs7_sign() с сертификатом, установленным на сервере.
Webhooks вместо polling
Диадок уведомляет о смене статуса документа двумя способами: polling (GET /V3/GetNewEvents) и webhooks (push-уведомления). Мы рекомендуем webhooks — они эффективнее и снижают нагрузку.
| Критерий | Polling | Webhooks |
|---|---|---|
| Задержка | До 5 минут (интервал опроса) | Реальное время (секунды) |
| Нагрузка на сервер | Высокая (частые запросы) | Низкая (только при событиях) |
| Сложность реализации | Простая (один cron) | Средняя (настройка endpoint) |
| Масштабирование | Плохо (линейный рост запросов) | Хорошо (событийно-ориентированно) |
Polling для небольшого объёма документов запускается cron раз в 5 минут. Webhooks же обеспечивают мгновенное обновление статусов без нагрузки на сервер.
Кейс из нашей практики: автоматический ЭДО для оптового поставщика
Дистрибьютор косметики, ~800 B2B-заказов в месяц. Каждый заказ требовал УПД. Сотрудник вручную создавал документ в Диадоке, 20–30 минут на заказ суммарно в день.
Автоматизированные операции:
-
При смене статуса заказа на "Отгружен" (
OnSaleStatusOrder) — автоматическая генерация и отправка УПД в Диадок. Реквизиты контрагента берутся из свойств заказа Битрикс (ИНН, КПП, BoxId Диадока). -
Справочник контрагентов: при первом заказе от нового юрлица — автоматический поиск BoxId контрагента через
GET /V3/GetOrganizationsByInnKpp. Если найден — сохраняется в пользовательское поле покупателя Битрикс. -
При подписании УПД контрагентом — webhook от Диадока меняет статус заказа на "Документы подписаны". Менеджер видит изменение в Битрикс без захода в Диадок.
-
Нотификация: если контрагент отклоняет документ с комментарием — менеджер получает уведомление в Битрикс (
CEventLog::Add()) с текстом причины отказа.
| Показатель | До | После |
|---|---|---|
| Время на оформление ЭДО | 20–30 мин/день | < 2 мин/день (только исключения) |
| Ошибки в реквизитах | ~5% документов | < 0.5% |
| Срок подписания контрагентами | Не отслеживался | Мониторинг, среднее 1.8 дня |
Закажите консультацию — мы проанализируем ваш документооборот и предложим оптимальное решение.
Сохранение истории документов
Для отслеживания всех документов создаём таблицу через D7 ORM:
class DiadokDocumentTable extends \Bitrix\Main\ORM\Data\DataManager { public static function getTableName(): string { return 'local_diadok_documents'; } public static function getMap(): array { return [ new \Bitrix\Main\ORM\Fields\IntegerField('ID', ['primary' => true, 'autocomplete' => true]), new \Bitrix\Main\ORM\Fields\IntegerField('ORDER_ID'), new \Bitrix\Main\ORM\Fields\StringField('DIADOK_MESSAGE_ID'), new \Bitrix\Main\ORM\Fields\StringField('DOCUMENT_TYPE'), // UPD, ACT, INVOICE new \Bitrix\Main\ORM\Fields\StringField('STATUS'), // sent, signed, rejected new \Bitrix\Main\ORM\Fields\DatetimeField('CREATED_AT'), new \Bitrix\Main\ORM\Fields\DatetimeField('SIGNED_AT'), ]; } } Что входит в работу
- Настройка учётной записи Диадок, получение API-ключей
- Установка криптопровайдера на сервере, загрузка сертификата КЭП
- Разработка PHP-клиента Диадок API
- Генератор XML-документов (УПД, Акты) с валидацией по XSD
- Обработчики событий Битрикс (смена статуса заказа)
- Синхронизация статусов: polling или вебхуки
- Хранение истории документов, отображение в заказе в Битрикс
- Обучение сотрудников, документация, поддержка 3 месяца
Сроки: базовая интеграция (отправка УПД, статусы) — 3–5 недель. Полная интеграция с несколькими типами документов, справочником контрагентов и уведомлениями — 6–10 недель.
Обращайтесь — мы настроим интеграцию под ваш бизнес. Свяжитесь с нами для оценки проекта — мы проанализируем вашу схему документооборота и предложим оптимальное решение.







