Интеграция 1С-Битрикс с системой ЭДО Диадок (Контур)

Наша компания занимается разработкой, поддержкой и обслуживанием решений на Битрикс и Битрикс24 любой сложности. От простых одностраничных сайтов до сложных интернет магазинов, CRM систем с интеграцией 1С и телефонии. Опыт разработчиков подтвержден сертификатами от вендора.
Предлагаемые услуги
Показано 1 из 1 услугВсе 1626 услуг
Интеграция 1С-Битрикс с системой ЭДО Диадок (Контур)
Средняя
~1-2 недели
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1181
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    813
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    Разработка на базе Битрикс, Битрикс24, 1С для компании Development of an Online Appointment Booking Widget for a Medical Center
    564
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Разработка на базе 1С Предприятие для компании МИРСАНБЕЛ
    747
  • image_crm_dolbimby_434_0.webp
    Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    655
  • image_crm_technotorgcomplex_453_0.webp
    Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    976

Интеграция 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 минут на заказ суммарно в день.

Что автоматизировали:

  1. При смене статуса заказа на «Отгружен» (OnSaleStatusOrder) — автоматическая генерация и отправка УПД в Диадок. Реквизиты контрагента берутся из свойств заказа Битрикс (ИНН, КПП, BoxId Диадока).

  2. Справочник контрагентов: при первом заказе от нового юрлица — автоматический поиск BoxId контрагента через GET /V3/GetOrganizationsByInnKpp. Если найден — сохраняется в пользовательское поле покупателя Битрикс.

  3. При подписании УПД контрагентом — webhook от Диадока меняет статус заказа на «Документы подписаны». Менеджер видит изменение в Битрикс без захода в Диадок.

  4. Нотификация: если контрагент отклоняет документ с комментарием — менеджер получает уведомление в Битрикс (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 недель.