Інтеграція 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-клієнт Kontur API з обробкою помилок
- Пошук і створення контрагентів за ІПН
- Створення документів реалізації за подією замовлення
- Фіксація оплат, обробка повернень
- Таблиця синхронізації, повторна відправка при помилках
Терміни: 3–5 тижнів при повному циклі (реалізація + оплати + повернення + моніторинг).







