Інтеграція 1С-Бітрікс з Ельба (СКБ Контур)

Наша компанія займається розробкою, підтримкою та обслуговуванням рішень на Бітрікс та Бітрікс24 будь-якої складності. Від простих односторінкових сайтів до складних інтернет-магазинів, CRM систем з інтеграцією 1С та телефонії. Досвід розробників підтверджено сертифікатами від вендора.
Пропоновані послуги
Показано 1 з 1 послугУсі 1626 послуг
Інтеграція 1С-Бітрікс з Ельба (СКБ Контур)
Середня
~1-2 тижні
Часті питання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851
  • 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
    585
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Розробка на базі 1С Підприємство для компанії МИРСАНБЕЛ
    751
  • image_crm_dolbimby_434_0.webp
    Розробка сайту на CRM Бітрікс24 для компанії DOLBIMBY
    657
  • image_crm_technotorgcomplex_453_0.webp
    Розробка на базі Бітрікс24 для компанії ТЕХНОТОРГКОМПЛЕКС
    989

Інтеграція 1С-Бітрікс з Ельба (СКБ Контур)

Ельба — хмарний сервіс податкового обліку для ФОП на спрощеній системі та патенті. На відміну від МоєДіло та Контур.Бухгалтерії, Ельба орієнтована на зовсім малий бізнес зі спрощеними операціями. API Ельби обмежений: він надає доступ до документів (рахунки, акти) і контрагентів, але не до повного управління операціями. Це визначає можливості та обмеження інтеграції з Бітрікс.

Що доступно через API Ельби

API Ельби (https://api.e-kontur.ru/api/v1/): авторизація через OAuth 2.0 (Authorization Code або Client Credentials). Доступні ресурси: counterparties (контрагенти), invoices (рахунки на оплату), acts (акти виконаних робіт). Створення проводок за витратами та доходами безпосередньо через API — недоступне (лише через UI Ельби).

OAuth 2.0 авторизація

class ElbaOAuthService
{
    private string $clientId;
    private string $clientSecret;
    private string $redirectUri;
    private string $tokenUrl = 'https://auth.kontur.ru/connect/token';

    public function getClientCredentialsToken(): string
    {
        // Для серверної інтеграції — Client Credentials flow
        $ch = curl_init($this->tokenUrl);
        curl_setopt_array($ch, [
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_POST           => true,
            CURLOPT_POSTFIELDS     => http_build_query([
                'grant_type'    => 'client_credentials',
                'client_id'     => $this->clientId,
                'client_secret' => $this->clientSecret,
                'scope'         => 'elba.api',
            ]),
            CURLOPT_HTTPHEADER => ['Content-Type: application/x-www-form-urlencoded'],
        ]);

        $response = json_decode(curl_exec($ch), true);
        curl_close($ch);

        // Кешуємо токен на (expires_in - 60) секунд
        $this->cacheToken($response['access_token'], $response['expires_in'] - 60);

        return $response['access_token'];
    }
}

Клієнт API

class ElbaApiClient
{
    private ElbaOAuthService $auth;
    private string $baseUrl = 'https://api.e-kontur.ru/api/v1';

    public function request(string $method, string $path, array $data = []): array
    {
        $token = $this->auth->getCachedToken();
        $ch    = curl_init($this->baseUrl . $path);

        curl_setopt_array($ch, [
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_CUSTOMREQUEST  => $method,
            CURLOPT_HTTPHEADER     => [
                'Content-Type: application/json',
                "Authorization: Bearer {$token}",
            ],
            CURLOPT_POSTFIELDS => in_array($method, ['POST', 'PUT'])
                ? json_encode($data) : null,
        ]);

        $json     = curl_exec($ch);
        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);

        if ($httpCode >= 400) {
            throw new \RuntimeException("Elba API error {$httpCode}: {$json}");
        }

        return json_decode($json, true) ?? [];
    }
}

Створення та пошук контрагентів

public function findOrCreateCounterparty(\Bitrix\Sale\Order $order): string
{
    $props = $order->getPropertyCollection();
    $inn   = $props->getItemByOrderPropertyCode('INN')?->getValue();
    $email = $props->getUserEmail();

    if ($inn) {
        // Пошук за ІПН
        $list = $this->client->request('GET', '/counterparties?inn=' . urlencode($inn));
        if (!empty($list)) {
            return $list[0]['id'];
        }
    }

    // Створення контрагента
    $isLegal = !empty($inn);
    $payload = $isLegal ? [
        'fullName' => $props->getItemByOrderPropertyCode('COMPANY')?->getValue() ?? '',
        'inn'      => $inn,
        'kpp'      => $props->getItemByOrderPropertyCode('KPP')?->getValue() ?? '',
        'email'    => $email,
    ] : [
        'fullName' => $props->getBuyerName(),
        'email'    => $email,
        'type'     => 'individual',
    ];

    $created = $this->client->request('POST', '/counterparties', $payload);
    return $created['id'];
}

Виставлення рахунку

Основний сценарій інтеграції для ФОП на спрощеній системі: при створенні замовлення автоматично формуємо рахунок в Ельбі і надсилаємо його покупцю на email.

public function createInvoiceForOrder(\Bitrix\Sale\Order $order): array
{
    $counterpartyId = $this->findOrCreateCounterparty($order);
    $items = [];

    foreach ($order->getBasket() as $item) {
        $items[] = [
            'name'     => $item->getField('NAME'),
            'count'    => $item->getQuantity(),
            'price'    => $item->getPrice(),
            'unit'     => 'шт.',
            'ndsRate'  => 'NoNds', // Спрощена система — без ПДВ. Варіанти: Nds0, Nds10, Nds20
        ];
    }

    // Доставка як окрема позиція
    $deliveryPrice = $order->getField('PRICE_DELIVERY');
    if ($deliveryPrice > 0) {
        $items[] = [
            'name'    => 'Доставка',
            'count'   => 1,
            'price'   => $deliveryPrice,
            'unit'    => 'посл.',
            'ndsRate' => 'NoNds',
        ];
    }

    $invoice = $this->client->request('POST', '/invoices', [
        'number'          => $order->getField('ACCOUNT_NUMBER'),
        'date'            => date('Y-m-d'),
        'counterpartyId'  => $counterpartyId,
        'items'           => $items,
        'comment'         => 'Замовлення з сайту #' . $order->getField('ACCOUNT_NUMBER'),
        'paymentDueDate'  => date('Y-m-d', strtotime('+3 days')),
    ]);

    return $invoice;
}

Обмеження Ельби та обхідні шляхи

Немає API для реєстрації платежів. Коли замовлення оплачено в Бітрікс, автоматично відмітити рахунок оплаченим в Ельбі через API неможливо. Обхід: webhook від платіжних систем → сповіщення на email бухгалтеру з номером рахунку. Або використовувати банківську інтеграцію Ельби — при надходженні грошей на розрахунковий рахунок Ельба сама зіставляє платіж з виставленим рахунком.

Ліміти API. У API Ельби є обмеження на кількість запитів. Для магазину з великою кількістю замовлень — черга відправки через \Bitrix\Main\Agent або окремий воркер.

Лише рахунки та акти, не накладні. Для відвантаження товарів документ акта не зовсім коректний юридично. Для ФОП на спрощеній системі це зазвичай несуттєво, але для ТОВ — розгляньте Контур.Бухгалтерію.

Акт виконаних робіт

Для послуг (не товарів) формуємо акт замість рахунку:

public function createActForOrder(\Bitrix\Sale\Order $order, string $counterpartyId): array
{
    // Аналогічна структура items
    return $this->client->request('POST', '/acts', [
        'date'           => date('Y-m-d'),
        'counterpartyId' => $counterpartyId,
        'items'          => $this->buildItems($order),
        'comment'        => 'Послуги за замовленням #' . $order->getField('ACCOUNT_NUMBER'),
    ]);
}

Склад робіт

  • OAuth 2.0 Client Credentials, кеш токена
  • PHP-клієнт Elba API
  • Пошук та створення контрагентів
  • Автоматичне виставлення рахунків за подією створення замовлення
  • Сповіщення при оплаті (workaround для відсутності API платежів)
  • Обробка помилок, логування, повторні спроби

Терміни: 2–4 тижні з урахуванням OAuth, обмежень API та тестування повного циклу.