Интеграция 1С-Битрикс с системой ЭДО Диадок (Контур)
Диадок от СКБ Контур — крупнейший российский оператор ЭДО. Юридически значимые счёт-фактуры, накладные, акты, УПД — всё это подписывается КЭП и передаётся через Диадок без дублирования бумажных копий. Когда интернет-магазин или B2B-платформа отправляет сотни документов в месяц, ручная работа в веб-интерфейсе Диадока становится нетерпимой — нужна интеграция с 1С-Битрикс, которая автоматически создаёт и отправляет документы по событиям в системе.
Архитектура интеграции
Диадок предоставляет REST API (https://diadoc-api.kontur.ru/). Авторизация — через токен, выдаваемый по логину/паролю учётной записи Диадока или через сертификат КЭП. Для серверной интеграции используется токен-авторизация.
Схема интеграции:
Битрикс (событие: заказ оплачен)
→ PHP-обработчик
→ Генерация XML-документа (УПД/Акт)
→ POST /v1/organizations/{orgId}/messages (Диадок API)
→ Диадок доставляет контрагенту
→ Webhook от Диадока: статус подписания
→ Обновление статуса в Битрикс
Авторизация в Диадок 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 запрос
}
}
Генерация XML-документов
Диадок принимает документы в формате XML по стандарту ФНС. Для УПД (универсальный передаточный документ) — формат согласно Приказу ФНС ММВ-7-15/820.
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);
return $dom->saveXML();
}
}
Валидация XML перед отправкой — обязательна. ФНС публикует XSD-схемы, которые нужно использовать для проверки структуры документа.
Отправка документа через 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() с сертификатом, установленным на сервере.
Обработка статусов
Диадок уведомляет о смене статуса документа двумя способами: polling (GET /V3/GetNewEvents) и webhooks (push-уведомления).
Polling для небольшого объёма документов:
// Запускается cron каждые 5 минут
public function syncDocumentStatuses(): void
{
$events = $this->client->request('GET',
"/V3/GetNewEvents?boxId={$this->boxId}&afterEventId={$this->lastEventId}"
);
foreach ($events['Events'] as $event) {
$docId = $event['DocumentInfo']['DocumentId'];
$status = $event['DocumentInfo']['DocflowStatus']['PrimaryStatus']['StatusText'];
$orderId = $this->getOrderIdByDocumentId($docId);
if ($orderId) {
$this->updateOrderStatus($orderId, $status);
}
$this->lastEventId = $event['EventId'];
}
}
Кейс: автоматический ЭДО для оптового поставщика
Дистрибьютор косметики, ~800 B2B-заказов в месяц. Каждый заказ требовал УПД. Сотрудник вручную создавал документ в Диадоке, 20–30 минут на заказ суммарно в день.
Что автоматизировали:
-
При смене статуса заказа на «Отгружен» (
OnSaleStatusOrder) — автоматическая генерация и отправка УПД в Диадок. Реквизиты контрагента берутся из свойств заказа Битрикс (ИНН, КПП, BoxId Диадока). -
Справочник контрагентов: при первом заказе от нового юрлица — автоматический поиск BoxId контрагента через
GET /V3/GetOrganizationsByInnKpp. Если найден — сохраняется в пользовательское поле покупателя Битрикс. -
При подписании УПД контрагентом — webhook от Диадока меняет статус заказа на «Документы подписаны». Менеджер видит изменение в Битрикс без захода в Диадок.
-
Нотификация: если контрагент отклоняет документ с комментарием — менеджер получает уведомление в Битрикс (
CEventLog::Add()) с текстом причины отказа.
| Показатель | До | После |
|---|---|---|
| Время на оформление ЭДО | 20–30 мин/день | < 2 мин/день (только исключения) |
| Ошибки в реквизитах | ~5% документов | < 0.5% |
| Срок подписания контрагентами | Не отслеживался | Мониторинг, среднее 1.8 дня |
Хранение истории документов в Битрикс
Для отслеживания всех документов создаём таблицу через D7:
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-ключей
- Установка КриптоПро CSP на сервере, загрузка сертификата КЭП
- Разработка PHP-клиента Диадок API
- Генератор XML-документов (УПД, Акты) с валидацией по XSD
- Обработчики событий Битрикс (смена статуса заказа)
- Синхронизация статусов: polling или вебхуки
- Хранение истории документов, отображение в заказе в Битрикс
Сроки: базовая интеграция (отправка УПД, статусы) — 3–5 недель. Полная интеграция с несколькими типами документов, справочником контрагентов и уведомлениями — 6–10 недель.







