Мы автоматизируем обмен юридически значимыми документами между 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 от Диадока: статус подписания
→ Обновление статуса в Битрикс
Внедрение автоматизации позволяет сэкономить до 300 000 ₽ в год на ручном заполнении документов. Средняя стоимость одной ошибки в реквизитах — 1 500 ₽, а при автоматизации исключается до 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 недель.
Обращайтесь — мы настроим интеграцию под ваш бизнес. Свяжитесь с нами для оценки проекта — мы проанализируем вашу схему документооборота и предложим оптимальное решение.







