Інтеграція 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.moedelo.org/. Авторизація через API-ключ (Header: X-DM-Auth-Token). Основні ресурси: counteragents (контрагенти), documents/sale (документи реалізації), invoices (рахунки), payments/income (вхідні платежі).

class MoeDeloClient
{
    private string $apiKey;
    private string $baseUrl = 'https://api.moedelo.org';

    public function request(string $method, string $endpoint, array $body = [], array $query = []): array
    {
        $url = $this->baseUrl . $endpoint;
        if ($query) {
            $url .= '?' . http_build_query($query);
        }

        $ch = curl_init($url);
        curl_setopt_array($ch, [
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_CUSTOMREQUEST  => $method,
            CURLOPT_HTTPHEADER     => [
                'Content-Type: application/json',
                "X-DM-Auth-Token: {$this->apiKey}",
            ],
            CURLOPT_POSTFIELDS => in_array($method, ['POST', 'PUT', 'PATCH'])
                ? json_encode($body) : null,
        ]);

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

        if ($httpCode >= 400) {
            throw new \RuntimeException("МоєДіло API {$httpCode}: {$json}");
        }

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

Контрагенти

При фізичній особі (B2C-замовлення без реквізитів) створюємо контрагента з типом individual:

public function findOrCreateContragent(\Bitrix\Sale\Order $order): int
{
    $props  = $order->getPropertyCollection();
    $email  = $props->getUserEmail();
    $name   = $props->getBuyerName();
    $phone  = $props->getPhone();
    $inn    = $props->getItemByOrderPropertyCode('INN')?->getValue();

    // Пошук за email
    $search = $this->client->request('GET', '/api/v1/counteragents', [], ['search' => $email]);
    foreach ($search['data'] ?? [] as $ca) {
        if ($ca['email'] === $email) {
            return $ca['id'];
        }
    }

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

    $result = $this->client->request('POST', '/api/v1/counteragents', $payload);
    return $result['id'];
}

Документ реалізації (рахунок-фактура / накладна)

public function createSaleDocument(\Bitrix\Sale\Order $order, int $contragentId): int
{
    $items = [];
    foreach ($order->getBasket() as $basketItem) {
        // ПДВ із властивостей товару
        $vatRate  = $this->resolveVatRate($basketItem->getProductId());
        $vatValue = round($basketItem->getPrice() * $basketItem->getQuantity()
            * ($vatRate / (100 + $vatRate)), 2);

        $items[] = [
            'name'      => $basketItem->getField('NAME'),
            'quantity'  => $basketItem->getQuantity(),
            'unit'      => 'шт.',
            'price'     => $basketItem->getPrice(),
            'total'     => round($basketItem->getPrice() * $basketItem->getQuantity(), 2),
            'vat_rate'  => $vatRate,  // 0, 10, 20
            'vat_value' => $vatValue,
        ];
    }

    // Знижка на рівні замовлення
    $discount = $order->getField('PRICE_DELIVERY') > 0 ? [
        'name'   => 'Доставка',
        'amount' => $order->getField('PRICE_DELIVERY'),
    ] : null;

    $doc = $this->client->request('POST', '/api/v1/documents/sale', [
        'date'           => date('Y-m-d'),
        'number'         => $order->getField('ACCOUNT_NUMBER'),
        'counteragent_id' => $contragentId,
        'items'          => $items,
        'shipping'       => $discount,
        'comment'        => 'Замовлення з сайту #' . $order->getField('ACCOUNT_NUMBER'),
    ]);

    return $doc['id'];
}

Рахунок на оплату

Для B2B-замовлень після створення документа реалізації формуємо рахунок:

public function createInvoice(int $documentId, \Bitrix\Sale\Order $order): string
{
    $invoice = $this->client->request('POST', '/api/v1/invoices', [
        'document_id' => $documentId,
        'due_date'    => date('Y-m-d', strtotime('+5 days')),
    ]);

    // Отримуємо PDF рахунку і прикріплюємо до замовлення в Бітрікс
    $pdfUrl = $invoice['pdf_url'] ?? '';
    if ($pdfUrl) {
        $this->attachInvoicePdfToOrder($order->getId(), $pdfUrl);
    }

    return $invoice['number'] ?? '';
}

Вхідні платежі

AddEventHandler('sale', 'OnSalePaymentPaid', function(\Bitrix\Sale\Payment $payment) {
    $order      = $payment->getOrder();
    $docId      = MoeDeloSyncTable::getDocumentId($order->getId());
    if (!$docId) return;

    (new MoeDeloSyncService())->registerPayment($docId, $payment);
});

public function registerPayment(int $docId, \Bitrix\Sale\Payment $payment): void
{
    $this->client->request('POST', '/api/v1/payments/income', [
        'date'        => date('Y-m-d'),
        'amount'      => $payment->getSum(),
        'document_id' => $docId,
        'type'        => $payment->getPaySystem()->getField('CODE') === 'cash'
            ? 'cash' : 'bank',
        'comment'     => 'Оплата замовлення #' . $payment->getOrder()->getField('ACCOUNT_NUMBER'),
    ]);
}

Автоматизація через події

Подія Бітрікс Дія в МоєДілі
Замовлення створено (статус «Новий») Створити контрагента + документ реалізації
Замовлення оплачено Зафіксувати вхідний платіж
Замовлення скасовано Створити документ повернення
Замовлення «Очікує оплату» Виставити рахунок (для B2B)

Склад робіт

  • PHP-клієнт МоєДіло API
  • Пошук і створення контрагентів (фізичні та юридичні особи)
  • Створення документів реалізації та рахунків
  • Реєстрація платежів і повернень
  • Таблиця синхронізації, обробка помилок і повторні спроби

Терміни: 3–5 тижнів базова інтеграція. 6–8 тижнів із поверненнями, прикріпленням PDF-рахунків і моніторингом.