Ручная передача данных тормозит бизнес
Небольшой интернет-магазин продаёт через Битрикс, а бухгалтер ведёт учёт в Контур.Бухгалтерии. Каждый месяц бухгалтер вручную переносит данные о продажах, накладных и оплатах — это отнимает 2–4 часа монотонной работы. Ошибки при копировании приводят к расхождениям: одна лишняя цифра в ИНН — и налоговая требует уточнений. Мы сталкивались с кейсами, где из-за этого задерживалась сдача отчётности, а штрафы за неправильные данные достигали 20% от суммы операции. Решение — настроить автоматический обмен через REST API Контур.Бухгалтерии. Это исключает человеческий фактор, сокращает время обработки заказа до секунд и гарантирует, что документы попадают в бухгалтерию без опозданий. Наша команда имеет 5+ лет опыта в интеграции Битрикса с внешними сервисами и реализовала более 30 подобных проектов. Автоматизация позволяет экономить до $14k–20k в год на трудозатратах бухгалтерии, а также снижает риск штрафов. Мы предлагаем интеграцию под ключ: от аудита текущей схемы до запуска и мониторинга. Закажите консультацию — оценим ваш проект и предложим сроки.
API Контур.Бухгалтерии для автоматизации учёта
Контур.Бухгалтерия предоставляет REST API (документация). Авторизация через OAuth 2.0 или API-ключ (зависит от тарифа). Доступные сущности: контрагенты, договоры, документы (накладные, акты, счета), банковские операции, статьи расходов. Для интернет-магазина ключевые операции: создание и поиск контрагентов по ИНН, создание документов реализации (накладные, акты) и фиксация оплат. Автоматизация в 60 раз быстрее ручного ввода — 2–5 секунд против 2–5 минут на один заказ. API имеет ограничение 100 запросов в минуту, что достаточно даже для высоконагруженных магазинов. При сетевых ошибках мы используем retry с экспоненциальной задержкой, чтобы гарантировать доставку каждого документа.
Авторизация в API
class KonturBukhClient { private string $apiKey; private string $accountId; // ID организации в Контур.Бухгалтерии private string $baseUrl = 'https://api.kontur.ru/budget/v1'; public function __construct(string $apiKey, string $accountId) { $this->apiKey = $apiKey; $this->accountId = $accountId; } public function request(string $method, string $path, array $data = []): array { $url = "{$this->baseUrl}/accounts/{$this->accountId}{$path}"; $ch = curl_init($url); $options = [ CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ 'Content-Type: application/json', "X-Api-Key: {$this->apiKey}", ], ]; if ($method === 'POST' || $method === 'PUT') { $options[CURLOPT_CUSTOMREQUEST] = $method; $options[CURLOPT_POSTFIELDS] = json_encode($data); } elseif ($method === 'GET' && $data) { $url .= '?' . http_build_query($data); curl_setopt($ch, CURLOPT_URL, $url); } curl_setopt_array($ch, $options); $response = json_decode(curl_exec($ch), true); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); if ($httpCode >= 400) { throw new \RuntimeException("Kontur API error {$httpCode}: " . json_encode($response)); } return $response ?? []; } } Синхронизация контрагентов
Перед созданием документа нужно убедиться, что контрагент существует в Контур.Бухгалтерии. Типичная ошибка — попытка создать документ без предварительной синхронизации. Мы используем поиск по ИНН: если контрагент уже есть, используем его ID; если нет — создаём нового. Это предотвращает дублирование записей.
public function findOrCreateContragent(\Bitrix\Sale\Order $order): string { $props = $order->getPropertyCollection(); $inn = $props->getItemByOrderPropertyCode('INN')->getValue(); $name = $props->getItemByOrderPropertyCode('COMPANY')->getValue(); // Поиск по ИНН $found = $this->client->request('GET', '/counterparties', ['inn' => $inn]); if (!empty($found['items'])) { return $found['items'][0]['id']; } // Создание нового $contragent = $this->client->request('POST', '/counterparties', [ 'name' => $name, 'inn' => $inn, 'kpp' => $props->getItemByOrderPropertyCode('KPP')->getValue() ?? '', 'type' => 'LegalEntity', ]); return $contragent['id']; } Создание документа реализации
При смене статуса заказа на «Отгружен» создаём накладную в Контур.Бухгалтерии. Используем событие OnSaleStatusOrder.
AddEventHandler('sale', 'OnSaleStatusOrder', function(string $statusId, \Bitrix\Sale\Order $order) { if ($statusId !== 'D') return; // D = Доставляется/Отгружен $service = new KonturBukhSyncService(); $service->createInvoiceForOrder($order); }); public function createInvoiceForOrder(\Bitrix\Sale\Order $order): void { $contragentId = $this->findOrCreateContragent($order); $orderNumber = $order->getField('ACCOUNT_NUMBER'); $items = []; foreach ($order->getBasket() as $item) { $items[] = [ 'name' => $item->getField('NAME'), 'quantity' => $item->getQuantity(), 'price' => $item->getPrice(), 'vatRate' => $this->getVatRate($item), // 'none'|'vat0'|'vat10'|'vat20' 'unit' => 'шт.', ]; } $document = $this->client->request('POST', '/documents/saleinvoices', [ 'date' => date('Y-m-d'), 'number' => $orderNumber, 'counterpartyId' => $contragentId, 'items' => $items, 'totalAmount' => $order->getPrice(), 'comment' => 'Автоматически создан из заказа #' . $orderNumber, ]); // Сохраняем ID документа в свойствах заказа $order->setField('COMMENTS', $order->getField('COMMENTS') . "\nID документа КБ: " . $document['id'] ); $order->save(); } Фиксация оплаты
При изменении статуса оплаты заказа на «Оплачен»:
AddEventHandler('sale', 'OnSalePaymentPaid', function(\Bitrix\Sale\Payment $payment) { $order = $payment->getOrder(); $documentId = $this->getKonturDocumentId($order->getId()); // из хранилища if (!$documentId) return; $this->client->request('POST', "/documents/saleinvoices/{$documentId}/payments", [ 'date' => date('Y-m-d'), 'amount' => $payment->getSum(), 'paymentMethod' => $payment->getPaySystem()->getField('CODE') === 'cash' ? 'Cash' : 'BankTransfer', ]); }); Хранение связей
Таблица local_kontur_bukh_sync:
CREATE TABLE local_kontur_bukh_sync ( ORDER_ID INT PRIMARY KEY, KB_DOC_ID VARCHAR(100), SYNCED_AT DATETIME, STATUS ENUM('pending','synced','error') DEFAULT 'pending', ERROR_MSG TEXT ); Как настроить интеграцию за 5 шагов?
- Получить API-ключ в личном кабинете Контур.Бухгалтерии.
- Установить PHP-клиент (код выше) на сервер с Битриксом.
- Настроить соответствие полей пользовательских свойств заказа и сущностей API.
- Зарегистрировать обработчики событий
OnSaleStatusOrderиOnSalePaymentPaid. - Провести тестовую синхронизацию на staging-окружении и запустить мониторинг.
Дополнительно настраивается система уведомлений: при ошибках синхронизации отправляется алерт на почту или в Telegram. Это позволяет оперативно реагировать на сбои.
Что входит в работу по интеграции
Этапы и сроки
| Этап | Длительность | Результат |
|---|---|---|
| Аналитика и проектирование | 3–5 дней | Схема обмена, список полей, спецификация |
| Разработка клиента API | 5–7 дней | PHP-класс с обработкой ошибок и ретраями |
| Синхронизация контрагентов | 2–3 дня | Поиск/создание по ИНН, проверка дублей |
| Создание документов | 3–5 дней | Накладные, акты, счета на основе заказов |
| Фиксация оплат и возвратов | 2–3 дня | Обработка платежей |
| Тестирование и запуск | 3–5 дней | Тесты на staging, мониторинг ошибок |
Итого: от 18 до 28 рабочих дней (3–5 недель). Стоимость рассчитывается индивидуально — зависит от сложности бизнес-логики и количества статусов.
Сравнение: ручная обработка vs автоматизация
| Параметр | Ручная работа | Автоматизация с API |
|---|---|---|
| Время на передачу одного заказа | 2–5 минут | 2–5 секунд |
| Вероятность ошибки | 5–10% | <0.1% |
| Затраты времени бухгалтера в месяц | 8–16 часов | 0 минут |
| Задержка при передаче | От 1 дня | Мгновенно |
| Штрафы за ошибки в документах | Риск до 20% от суммы | Минимизирован |
Почему стоит доверить интеграцию нам
Мы не просто пишем код — мы проектируем архитектуру, которая будет работать годами. Гарантируем, что документы не потеряются: используем очередь с повторными попытками и логирование всех операций. Наш опыт — 30+ интеграций Битрикса с бухгалтерскими системами (1С, Контур, МойСклад). Хотите оценить, сколько сэкономит ваш бизнес? Свяжитесь с нами — мы бесплатно проанализируем текущую схему документооборота и предложим решение. Закажите интеграцию — и забудьте о ручной передаче данных.







