Інтеграція 1С-Бітрікс з сервісами перевірки контрагентів
B2B-магазин або корпоративний портал на Бітриксі отримує заявку від компанії — і менеджер витрачає 15 хвилин на ручну перевірку ІНН через сторонні сайти. Автоматична перевірка контрагента вбудовується в момент реєстрації організації, оформлення замовлення або створення угоди в CRM, і дані з Єдиного державного реєстру / реєстру дискваліфікованих осіб з'являються прямо в картці.
Джерела даних та API
Основні сервіси, з якими інтегрується Бітрикс:
| Сервіс | Що надає | Тип запиту |
|---|---|---|
| ФНС ЕГРЮЛ (API) | Статус компанії, адреса, керівник | REST за ІНН/ОГРН |
| Контур.Фокус | Реєстри банкрутства, арбітраж, фінансова звітність | REST + OAuth |
| СПАРК | Скоринг надійності, афіліованість | REST + API-ключ |
| Dadata.ru | Збагачення реквізитів за ІНН, автодовипадання | REST, простий ключ |
| Прозорий бізнес (ФНС) | Дискваліфіковані особи, податкові борги | Публічний API |
Dadata — найбільш поширений вибір для автодовипадання реквізитів при введенні: за ІНН повертає повне найменування, КПП, ОГРН, юридичну адресу, статус. Контур.Фокус або СПАРК підключають при необхідності глибокого фінансового аналізу.
Архітектура інтеграції
Інтеграція працює в двох режимах:
Режим 1 — онлайн-перевірка при введенні ІНН. Клієнт вводить ІНН у форму реєстрації або профілю організації. AJAX-запит йде на проміжний PHP-контролер, той запитує API Dadata, повертає реквізити на фронт. Користувач бачить автоматично заповнену форму.
Режим 2 — фонова перевірка існуючих контрагентів. Агент Бітрікса (CAgent) запускається вночі, перебирає компанії з b_highload_block_entity (HL-блок «Організації») або з таблиці користувачів, відправляє ІНН в API, зберігає результат.
Зберігання даних контрагентів
Для зберігання реквізитів організацій — HL-блок CompanyRequisites:
-
UF_INN— ІНН (рядок, унікальний індекс) -
UF_OGRN— ОГРН -
UF_KPP— КПП -
UF_FULL_NAME— повне найменування -
UF_ADDRESS_LEGAL— юридична адреса -
UF_DIRECTOR— керівник -
UF_STATUS— статус (active,liquidated,reorganizing) -
UF_RISK_SCORE— скоринговий бал (якщо використовується СПАРК/Фокус) -
UF_LAST_CHECK— дата останньої перевірки -
UF_RAW_DATA— сирий JSON-ответ API
Привязка до користувача Бітрікса — поле UF_USER_ID на користувачі або зв'язок через властивість COMPANY_ID у профілі.
Запит до Dadata: реалізація
class DadataContragentChecker
{
private string $apiKey;
private string $secretKey;
public function __construct(string $apiKey, string $secretKey)
{
$this->apiKey = $apiKey;
$this->secretKey = $secretKey;
}
public function getByInn(string $inn): ?array
{
$cacheKey = 'dadata_inn_' . md5($inn);
$cache = \Bitrix\Main\Data\Cache::createInstance();
if ($cache->initCache(86400, $cacheKey, '/dadata/inn/')) {
return $cache->getVars();
}
$response = (new \Bitrix\Main\Web\HttpClient())->post(
'https://suggestions.dadata.ru/suggestions/api/4_1/rs/findById/party',
json_encode(['query' => $inn, 'count' => 1]),
[
'Content-Type' => 'application/json',
'Authorization' => 'Token ' . $this->apiKey,
'X-Secret' => $this->secretKey,
]
);
$data = json_decode($response, true);
if (empty($data['suggestions'][0])) {
return null;
}
$result = $this->normalizeResponse($data['suggestions'][0]);
$cache->startDataCache(86400, $cacheKey, '/dadata/inn/');
$cache->endDataCache($result);
return $result;
}
private function normalizeResponse(array $suggestion): array
{
$data = $suggestion['data'];
return [
'full_name' => $data['name']['full_with_opf'] ?? '',
'inn' => $data['inn'] ?? '',
'kpp' => $data['kpp'] ?? '',
'ogrn' => $data['ogrn'] ?? '',
'address' => $suggestion['unrestricted_value'] ?? '',
'director' => $data['management']['name'] ?? '',
'status' => strtolower($data['state']['status'] ?? 'unknown'),
];
}
}
Кешування на 24 години — обов'язково. Без нього при масовій перевірці швидко упираємось в ліміти API (Dadata: 10 000 запитів/добу на безплатному тарифі).
Вбудова у форму реєстрації
Компонент bitrix:system.auth.registration переоцінюється в шаблоні. До форми додається поле ІНН з JavaScript-автодовиванням:
document.getElementById('inn-field').addEventListener('blur', async function() {
const inn = this.value.replace(/\D/g, '');
if (inn.length !== 10 && inn.length !== 12) return;
const resp = await fetch('/local/ajax/check-inn.php?inn=' + inn);
const data = await resp.json();
if (data.success) {
document.getElementById('company-name').value = data.full_name;
document.getElementById('kpp-field').value = data.kpp;
document.getElementById('ogrn-field').value = data.ogrn;
document.getElementById('address-field').value = data.address;
if (data.status !== 'active') {
showWarning('Компанія не є діючою');
}
}
});
Поле /local/ajax/check-inn.php — тонкий контролер, який викликає DadataContragentChecker і повертає JSON.
Інтеграція з CRM Бітрікс24
Якщо використовується CRM, перевірка вбудовується в момент створення контакту або компанії через події:
-
OnAfterCrmContactAdd/OnAfterCrmCompanyAdd— запускає фонову перевірку через обробник - Результат пишеться в поле UF компанії CRM
- При низькому скорингу або статусі «ліквідована» — автоматично створюється задача менеджеру на ручну перевірку
AddEventHandler('crm', 'OnAfterCrmCompanyAdd', function(&$fields) {
$inn = $fields['fields']['UF_INN'] ?? '';
if (!$inn) return;
// Запускаємо асинхронно через агент
\CAgent::AddAgent(
"checkContragentAgent({$fields['id']}, '{$inn}');",
'my_module',
'N',
60
);
});
Періодична перепровірка
Компанії змінюють статус — ліквідуються, реорганізуються. Агент перепроверяет записи старше 30 днів:
function reCheckContragentsAgent(): string
{
$connection = \Bitrix\Main\Application::getConnection();
$rows = $connection->query(
"SELECT ID, UF_INN FROM b_hl17_company_requisites
WHERE UF_LAST_CHECK < DATE_SUB(NOW(), INTERVAL 30 DAY)
LIMIT 50"
);
$checker = new DadataContragentChecker(DADATA_API_KEY, DADATA_SECRET);
while ($row = $rows->fetch()) {
$data = $checker->getByInn($row['UF_INN']);
if ($data) {
updateHlBlockRecord($row['ID'], $data);
}
}
return __FUNCTION__ . '();';
}
Ліміт 50 записів за запуск — щоб агент не перевищував час виконання PHP.
Терміни реалізації
| Обсяг завдання | Склад | Термін |
|---|---|---|
| Автодовипадання реквізитів за ІНН (Dadata) | AJAX + кеш + форма реєстрації | 2–4 дні |
| HL-блок контрагентів + фоновий агент | Зберігання + періодична перевірка | 1 тиждень |
| Повна інтеграція (CRM + скоринг + сповіщення) | Контур.Фокус або СПАРК + інтеграція з CRM | 2–3 тижні |







