Интеграция Битрикс с МоёДело: обмен заказами

Ручной перенос заказов из Битрикс в МоёДело отнимает часы и приводит к ошибкам в документах. Мы автоматизируем этот обмен, настраивая синхронизацию заказов, контрагентов и платежей. Наша команда реализует интеграцию под ключ — от аудита до поддержки, чтобы вы работали без рутины и с надёжным учётом.
Услуги, которые мы предлагаем
Показано 1 из 1Все 1626 услуг
Интеграция Битрикс с МоёДело: обмен заказами
Средний
~1-2 недели

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

Часто задаваемые вопросы

Последние работы

  • Разработка сайта компании B2B ADVANCE
    Разработка сайта компании B2B ADVANCE
    1532
  • Разработка веб-сайта для компании ФИКСПЕР
    Разработка веб-сайта для компании ФИКСПЕР
    1045
  • Разработка виджета онлайн-записи на прием для медицинского центра
    Разработка виджета онлайн-записи на прием для медицинского центра
    820
  • Разработка на базе 1С Предприятие для компании МИРСАНБЕЛ
    Разработка на базе 1С Предприятие для компании МИРСАНБЕЛ
    915
  • Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    853
  • Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    1208

Представьте: каждый заказ из интернет-магазина на Битрикс нужно вручную завести в МоёДело — как реализацию, создать контрагента, выставить счёт. На это уходит 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 месяца гарантийной поддержки

Что синхронизируется автоматически?

Помимо заказов, мы синхронизируем контрагентов (с поиском дублей), номенклатуру товаров (опционально), акты сверки (по запросу), возвраты и корректировки. Все данные проходят валидацию перед отправкой в МоёДело — это исключает ошибки формата.

Процесс работы

  1. Аудит — анализируем текущую конфигурацию Битрикс, схему заказов, требования к документам.
  2. Проектирование — согласовываем маппинг полей, сценарии ошибок.
  3. Реализация — пишем код, настраиваем события, тестируем на тестовом полигоне.
  4. Тестирование — прогоняем 100+ заказов, проверяем все сценарии (оплата, отмена, возврат).
  5. Деплой — выкатываем на бой, мониторим 2 недели, обучаем сотрудников.

Типичные ошибки при самостоятельной интеграции

Неверный формат даты (API принимает только YYYY-MM-DD), отсутствие повторных попыток при тайм-аутах (заказы теряются), игнорирование лимитов API (30 запросов в минуту — нужна очередь). Мы учитываем все эти нюансы, поэтому интеграция работает стабильно.

Сроки: базовая интеграция — от 3 недель, расширенная — до 8 недель. Оцениваем проект по вашему ТЗ. Свяжитесь с нами, чтобы обсудить детали. Получите консультацию — поможем выбрать оптимальный объём работ.