Интеграция 1С-Битрикс с Контур.Бухгалтерия
Небольшой интернет-магазин работает без 1С: продажи идут через Битрикс, а бухгалтер ведёт учёт в Контур.Бухгалтерии. Ежемесячно бухгалтер вручную переносит данные о продажах, накладных и оплатах из Битрикс в Бухгалтерию. Это 2–4 часа монотонной работы с ошибками. Контур.Бухгалтерия предоставляет REST API — интеграцию можно автоматизировать.
Что предоставляет API Контур.Бухгалтерии
API документация: https://api.kontur.ru/budget/v1/. Авторизация через OAuth 2.0 или 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 ?? [];
}
}
Синхронизация контрагентов
Перед созданием документа нужен контрагент в Бухгалтерии. Ищем по ИНН — если не найден, создаём:
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'];
}
Создание документа реализации
При смене статуса заказа на «Отгружен» создаём накладную:
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
);
Состав работ
- PHP-клиент Kontour API с обработкой ошибок
- Поиск и создание контрагентов по ИНН
- Создание документов реализации по событию заказа
- Фиксация оплат, обработка возвратов
- Таблица синхронизации, повторная отправка при ошибках
Сроки: 3–5 недель при полном цикле (реализация + оплаты + возвраты + мониторинг).







