Интеграция 1С-Битрикс с Контур.Бухгалтерия

Наша компания занимается разработкой, поддержкой и обслуживанием решений на Битрикс и Битрикс24 любой сложности. От простых одностраничных сайтов до сложных интернет магазинов, CRM систем с интеграцией 1С и телефонии. Опыт разработчиков подтвержден сертификатами от вендора.
Предлагаемые услуги
Показано 1 из 1 услугВсе 1626 услуг
Интеграция 1С-Битрикс с Контур.Бухгалтерия
Средняя
~1-2 недели
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1175
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    811
  • 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С-Битрикс с Контур.Бухгалтерия

Небольшой интернет-магазин работает без 1С: продажи идут через Битрикс, а бухгалтер ведёт учёт в Контур.Бухгалтерии. Ежемесячно бухгалтер вручную переносит данные о продажах, накладных и оплатах из Битрикс в Бухгалтерию. Это 2–4 часа монотонной работы с ошибками. Контур.Бухгалтерия предоставляет REST API — интеграцию можно автоматизировать.

Что предоставляет API Контур.Бухгалтерии

API документация: https://api.kontur.ru/budget/v1/. Авторизация через OAuth 2.0 или API-ключ (зависит от тарифа). Доступные сущности: контрагенты, договоры, документы (накладные, акты, счета), банковские операции, статьи расходов.

Для интеграции с интернет-магазином используем: создание/поиск контрагентов, создание документов реализации (накладная или акт), фиксация оплаты.

Авторизация

class KonturBukhClient
{
    private string $apiKey;
    private string $accountId; // ID организации в Контур.Бухгалтерии
    private string $baseUrl = 'https://api.kontur.ru/budget/v1';

    public function __construct(string $apiKey, string $accountId)
    {
        $this->apiKey    = $apiKey;
        $this->accountId = $accountId;
    }

    public function request(string $method, string $path, array $data = []): array
    {
        $url = "{$this->baseUrl}/accounts/{$this->accountId}{$path}";
        $ch  = curl_init($url);

        $options = [
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_HTTPHEADER     => [
                'Content-Type: application/json',
                "X-Api-Key: {$this->apiKey}",
            ],
        ];

        if ($method === 'POST' || $method === 'PUT') {
            $options[CURLOPT_CUSTOMREQUEST] = $method;
            $options[CURLOPT_POSTFIELDS]    = json_encode($data);
        } elseif ($method === 'GET' && $data) {
            $url .= '?' . http_build_query($data);
            curl_setopt($ch, CURLOPT_URL, $url);
        }

        curl_setopt_array($ch, $options);
        $response = json_decode(curl_exec($ch), true);
        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);

        if ($httpCode >= 400) {
            throw new \RuntimeException("Kontur API error {$httpCode}: " . json_encode($response));
        }

        return $response ?? [];
    }
}

Синхронизация контрагентов

Перед созданием документа нужен контрагент в Бухгалтерии. Ищем по ИНН — если не найден, создаём:

public function findOrCreateContragent(\Bitrix\Sale\Order $order): string
{
    $props = $order->getPropertyCollection();
    $inn   = $props->getItemByOrderPropertyCode('INN')->getValue();
    $name  = $props->getItemByOrderPropertyCode('COMPANY')->getValue();

    // Поиск по ИНН
    $found = $this->client->request('GET', '/counterparties', ['inn' => $inn]);
    if (!empty($found['items'])) {
        return $found['items'][0]['id'];
    }

    // Создание нового
    $contragent = $this->client->request('POST', '/counterparties', [
        'name'  => $name,
        'inn'   => $inn,
        'kpp'   => $props->getItemByOrderPropertyCode('KPP')->getValue() ?? '',
        'type'  => 'LegalEntity',
    ]);

    return $contragent['id'];
}

Создание документа реализации

При смене статуса заказа на «Отгружен» создаём накладную:

AddEventHandler('sale', 'OnSaleStatusOrder', function(string $statusId, \Bitrix\Sale\Order $order) {
    if ($statusId !== 'D') return; // D = Доставляется/Отгружен

    $service = new KonturBukhSyncService();
    $service->createInvoiceForOrder($order);
});

public function createInvoiceForOrder(\Bitrix\Sale\Order $order): void
{
    $contragentId = $this->findOrCreateContragent($order);
    $orderNumber  = $order->getField('ACCOUNT_NUMBER');
    $items        = [];

    foreach ($order->getBasket() as $item) {
        $items[] = [
            'name'     => $item->getField('NAME'),
            'quantity' => $item->getQuantity(),
            'price'    => $item->getPrice(),
            'vatRate'  => $this->getVatRate($item), // 'none'|'vat0'|'vat10'|'vat20'
            'unit'     => 'шт.',
        ];
    }

    $document = $this->client->request('POST', '/documents/saleinvoices', [
        'date'           => date('Y-m-d'),
        'number'         => $orderNumber,
        'counterpartyId' => $contragentId,
        'items'          => $items,
        'totalAmount'    => $order->getPrice(),
        'comment'        => 'Автоматически создан из заказа #' . $orderNumber,
    ]);

    // Сохраняем ID документа в свойствах заказа
    $order->setField('COMMENTS',
        $order->getField('COMMENTS') . "\nID документа КБ: " . $document['id']
    );
    $order->save();
}

Фиксация оплаты

При изменении статуса оплаты заказа на «Оплачен»:

AddEventHandler('sale', 'OnSalePaymentPaid', function(\Bitrix\Sale\Payment $payment) {
    $order        = $payment->getOrder();
    $documentId   = $this->getKonturDocumentId($order->getId()); // из хранилища

    if (!$documentId) return;

    $this->client->request('POST', "/documents/saleinvoices/{$documentId}/payments", [
        'date'           => date('Y-m-d'),
        'amount'         => $payment->getSum(),
        'paymentMethod'  => $payment->getPaySystem()->getField('CODE') === 'cash'
            ? 'Cash' : 'BankTransfer',
    ]);
});

Хранение связей

Таблица local_kontur_bukh_sync:

CREATE TABLE local_kontur_bukh_sync (
    ORDER_ID     INT PRIMARY KEY,
    KB_DOC_ID    VARCHAR(100),
    SYNCED_AT    DATETIME,
    STATUS       ENUM('pending','synced','error') DEFAULT 'pending',
    ERROR_MSG    TEXT
);

Состав работ

  • PHP-клиент Kontour API с обработкой ошибок
  • Поиск и создание контрагентов по ИНН
  • Создание документов реализации по событию заказа
  • Фиксация оплат, обработка возвратов
  • Таблица синхронизации, повторная отправка при ошибках

Сроки: 3–5 недель при полном цикле (реализация + оплаты + возвраты + мониторинг).