Ручная передача данных тормозит бизнес
Небольшой интернет-магазин продаёт через Битрикс, а бухгалтер ведёт учёт в Контур.Бухгалтерии. Каждый месяц бухгалтер вручную переносит данные о продажах, накладных и оплатах — это отнимает 2–4 часа монотонной работы. Ошибки при копировании приводят к расхождениям: одна лишняя цифра в ИНН — и налоговая требует уточнений. Мы сталкивались с кейсами, где из-за этого задерживалась сдача отчётности, а штрафы за неправильные данные достигали 20% от суммы операции. Решение — настроить автоматический обмен через REST API Контур.Бухгалтерии. Это исключает человеческий фактор, сокращает время обработки заказа до секунд и гарантирует, что документы попадают в бухгалтерию без опозданий. Наша команда имеет 5+ лет опыта в интеграции Битрикса с внешними сервисами и реализовала более 30 подобных проектов. Автоматизация позволяет экономить до 1,5 млн рублей в год на трудозатратах бухгалтерии, а также снижает риск штрафов. Мы предлагаем интеграцию под ключ: от аудита текущей схемы до запуска и мониторинга. Закажите консультацию — оценим ваш проект и предложим сроки.
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С, Контур, МойСклад). Хотите оценить, сколько сэкономит ваш бизнес? Свяжитесь с нами — мы бесплатно проанализируем текущую схему документооборота и предложим решение. Закажите интеграцию — и забудьте о ручной передаче данных.







