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







