Уявіть: кожне замовлення з інтернет-магазину на Бітрікс потрібно вручну ввести в МоєДіло — як реалізацію, створити контрагента, виставити рахунок. На це йде 10–15 хвилин на замовлення. При 50 замовленнях на день — до 12 годин рутини на місяць. Помилки в реквізитах, невірний ПДВ, забуті платежі — типові наслідки. Ми автоматизуємо цей процес під ключ, скорочуючи час обробки на 80% і зводячи помилки до мінімуму. Наш досвід інтеграцій з МоєДіло — понад 15 проектів, гарантуємо стабільну синхронізацію 24/7. Оцінимо ваш проект безкоштовно — напишіть нам.
Які проблеми вирішуємо
Ручне введення контрагентів
Кожен новий клієнт — створення картки в МоєДіло: ІПН, назва, адреса. При повторних замовленнях легко створити дублікат. Наш алгоритм автоматично шукає контрагента за email або ІПН і створює тільки при відсутності.
Помилки в розрахунку ПДВ
Ставки ПДВ різняться: 0%, 10%, 20%. При ручному перенесенні легко помилитися, що веде до розбіжностей з податковою. Інтеграція бере ставку з властивостей товару в Бітрікс — виключаючи людський фактор.
Втрата платежів
Оплачене замовлення не завжди відображається в МоєДіло як надходження. Ми вішаємо обробник на подію OnSalePaymentPaid — оплата автоматично фіксується як вхідний платіж. Це особливо важливо для 54-ФЗ та закриття змін.
Як інтегрувати Бітрікс з МоєДіло?
Ми використовуємо публічний API МоєДіло з авторизацією по токену. На стороні Бітрікс пишемо PHP-клієнт на 8.1+, використовуємо інфоблоки v2.0 та ORM. Кожне замовлення проходить ланцюжок: контрагент → документ реалізації → рахунок (опціонально) → платіж. Для повернень створюємо документ повернення.
Ось приклад створення контрагента (фрагмент коду):
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) |
Чому автоматизація краща за ручне введення?
Автоматизація краща за ручне введення: кожне замовлення обробляється за 5 секунд замість 10-15 хвилин — у 180 разів швидше. Помилки при ручному введенні досягають 5%, а при автоматизації — менше 0.1%. Виключено дублі контрагентів, документи завжди відповідають вимогам ФНС. Інтеграція окупається за 2–3 місяці за рахунок скорочення ручної праці — ви отримуєте реальну економію.
| Параметр | Ручне введення | Наша інтеграція |
|---|---|---|
| Час на замовлення | 10–15 хвилин | 3–5 секунд |
| Помилки | до 5% | < 0.1% |
| Дублі контрагентів | часті | виключені |
| Робота 24/7 | ні | так |
Що входить в роботу
Ми готуємо повний пакет:
- PHP-клієнт МоєДіло API
- Пошук та створення контрагентів (фізособи та юрособи)
- Створення документів реалізації та рахунків
- Реєстрація платежів та повернень
- Таблиця синхронізації, обробка помилок та повторні спроби
- Документація з інтеграції та навчання вашого персоналу
- 3 місяці гарантійної підтримки
Що синхронізується автоматично?
Окрім замовлень, ми синхронізуємо контрагентів (з пошуком дублів), номенклатуру товарів (опціонально), акти звірки (за запитом), повернення та коригування. Всі дані проходять валідацію перед відправкою в МоєДіло — це виключає помилки формату.
Процес роботи
- Аудит — аналізуємо поточну конфігурацію Бітрікс, схему замовлень, вимоги до документів.
- Проектування — погоджуємо маппінг полів, сценарії помилок.
- Реалізація — пишемо код, налаштовуємо події, тестуємо на тестовому полігоні.
- Тестування — прогоняємо 100+ замовлень, перевіряємо всі сценарії (оплата, скасування, повернення).
- Деплой — викочуємо на бій, моніторимо 2 тижні, навчаємо співробітників.
Типові помилки при самостійній інтеграції
Невірний формат дати (API приймає лише YYYY-MM-DD), відсутність повторних спроб при тайм-аутах (замовлення губляться), ігнорування лімітів API (30 запитів на хвилину — потрібна черга). Ми враховуємо всі ці нюанси, тому інтеграція працює стабільно.
Терміни: базова інтеграція — від 3 тижнів, розширена — до 8 тижнів. Оцінюємо проект безкоштовно за вашим ТЗ. Зв'яжіться з нами, щоб обговорити деталі. Отримайте консультацію — допоможемо обрати оптимальний обсяг робіт.







