Блог разработчика 1С-Битрикс

Наполнение инфоблока данными через API DaData в 1С-Битрикс

В этой статье мы рассмотрим, как интегрировать API DaData для получения информации о банках и сохранения этих данных в инфоблок 1С-Битрикс. Это может быть полезно для создания базы данных с актуальной информацией о банках на вашем сайте. Мы разберем пример кода, который получает данные о банках по БИКам и сохраняет их в инфоблок, используя возможности Битрикс.

Наполнение инфоблока данными через API DaData в 1С-Битрикс
О том как подключиться к API DaData, подробно рассказали в статье - Как отправить AJAX запрос к API Dadata для получения и вывода информации на странице. Изучите прежде ее.

Задача

Мы хотим автоматизировать процесс получения информации о банках через API DaData и сохранения этой информации в инфоблок 1С-Битрикс. У нас есть файл, содержащий список БИКов банков, и нам необходимо для каждого БИКа получить информацию о соответствующем банке и создать элемент в инфоблоке.

Пример файла с кодами БИК банков bik.txt, который лежит в корне сайта:


044525710
044525709
044525706
044525703
044525701
044525700
044525699
044525697
044525696
044525695

Пример кода

Ниже приведен пример PHP-кода, который реализует эту задачу.


    <?php
    // Подключаем пролог Битрикса
    require($_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_before.php');

    use Bitrix\Main\Loader;
    use Bitrix\Iblock\PropertyTable;
    use Bitrix\Iblock\ElementPropertyTable;

    // Проверяем, что модуль iblock доступен
    if (!Loader::includeModule('iblock')) {
        die('Модуль iblock не установлен.');
    }

    $iblockId = 14; // ID инфоблока "banks"
    $bicFilePath = $_SERVER['DOCUMENT_ROOT'] . '/bik.txt';
    $bicList = file($bicFilePath, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);

    if (!$bicList) {
        die('Не удалось считать список БИК из bik.txt');
    }

    /**
     * Создаёт или возвращает ID существующего свойства
     *
     * @param int $iblockId
     * @param string $propertyCode
     * @param string $propertyName
     * @return int|false
     */
    function getOrCreateProperty($iblockId, $propertyCode, $propertyName)
    {
        // Ищем свойство по коду
        $existing = PropertyTable::getList([
            'filter' => [
                '=IBLOCK_ID' => $iblockId,
                '=CODE' => $propertyCode
            ],
            'select' => ['ID'],
            'limit' => 1,
        ])->fetch();

        // Если нашли, возвращаем
        if ($existing) {
            return $existing['ID'];
        }

        // Иначе создаём
        $addResult = PropertyTable::add([
            'IBLOCK_ID' => $iblockId,
            'NAME' => $propertyName,
            'CODE' => $propertyCode,
            'ACTIVE' => 'Y',
            'SORT' => 500,
            'PROPERTY_TYPE' => 'S',
        ]);

        if ($addResult->isSuccess()) {
            return $addResult->getId();
        } else {
            echo 'Ошибка при создании свойства: ' . implode(', ', $addResult->getErrorMessages());
            return false;
        }
    }

    /**
     * Устанавливает значение для свойства элемента
     *
     * @param int $elementId
     * @param int $propertyId
     * @param string $value
     */
    function setElementPropertyValue($elementId, $propertyId, $value)
    {
        if (!strlen($value)) {
            return;
        }

        $result = ElementPropertyTable::add([
            'IBLOCK_ELEMENT_ID' => $elementId,
            'IBLOCK_PROPERTY_ID' => $propertyId,
            'VALUE' => $value,
        ]);

        if (!$result->isSuccess()) {
            echo 'Ошибка при установке значения свойства: ' . implode(', ', $result->getErrorMessages());
        }
    }

    // Перебираем все БИКи из файла
    foreach ($bicList as $bic) {
        $bic = trim($bic);
        if (!$bic) {
            continue;
        }

        // Готовим POST-запрос к DaData
        $data = ['query' => $bic];
        $options = [
            'http' => [
                'method'  => 'POST',
                'header'  => [
                    'Content-Type: application/json',
                    'Accept: application/json',
                    // Замените токен на ваш реальный токен DaData
                    'Authorization: Token Ваш_Код_API'
                ],
                'content' => json_encode($data, JSON_UNESCAPED_UNICODE),
            ],
        ];

        $context = stream_context_create($options);
        $url = 'https://suggestions.dadata.ru/suggestions/api/4_1/rs/findById/bank';  // Правильное определение URL
        $responseJson = file_get_contents($url, false, $context);

        if (!$responseJson) {
            echo "Ошибка при получении данных от DaData для БИК: $bic\n";
            continue;
        }

        // Превращаем JSON-строку в массив
        $response = json_decode($responseJson, true);
        if (!isset($response['suggestions']) || !is_array($response['suggestions'])) {
            echo "Некорректный ответ от DaData для БИК: $bic\n";
            continue;
        }

        // Обрабатываем результаты из DaData
        foreach ($response['suggestions'] as $bankData) {
            $bankName = $bankData CIBlockElement
            $iblockElement = new CIBlockElement();

            // Создаём элемент инфоблока (указываем ACTIVE => 'Y', чтобы элемент был виден в админке)
            $arFields = [
                'IBLOCK_ID' => $iblockId,
                'NAME'      => $bankName,
                'ACTIVE'    => 'Y',
            ];

            $elementId = $iblockElement->Add($arFields);

            if (!$elementId) {
                echo 'Ошибка при создании элемента: ' . $iblockElement->LAST_ERROR;
                continue;
            }

            $dataBlock = $bankData['data'];
            if (!$dataBlock) {
                continue;
            }

            // Пример привязки основных полей (БИК, SWIFT, ИНН, КПП и т.д.)

            // БИК
            $propIdBic = getOrCreateProperty($iblockId, 'data_bic', 'БИК');
            if ($propIdBic) {
                setElementPropertyValue($elementId, $propIdBic, $dataBlock['bic']);
            }

            // SWIFT
            $propIdSwift = getOrCreateProperty($iblockId, 'data_swift', 'SWIFT');
            if ($propIdSwift) {
                setElementPropertyValue($elementId, $propIdSwift, $dataBlock['swift']);
            }

            // ИНН
            $propIdInn = getOrCreateProperty($iblockId, 'data_inn', 'ИНН');
            if ($propIdInn) {
                setElementPropertyValue($elementId, $propIdInn, $dataBlock['inn']);
            }

            // КПП
            $propIdKpp = getOrCreateProperty($iblockId, 'data_kpp', 'КПП');
            if ($propIdKpp) {
                setElementPropertyValue($elementId, $propIdKpp, $dataBlock['kpp']);
            }

            // Регистрационный номер в ЦБ РФ
            $propRegNum = getOrCreateProperty($iblockId, 'data_registration_number', 'Рег. номер в ЦБ РФ');
            if ($propRegNum) {
                setElementPropertyValue($elementId, $propRegNum, $dataBlock['registration_number']);
            }

            // Корреспондентский счёт
            $propCorr = getOrCreateProperty($iblockId, 'data_correspondent_account', 'Корреспондентский счёт');
            if ($propCorr) {
                setElementPropertyValue($elementId, $propCorr, $dataBlock['correspondent_account']);
            }

            // Город для платежей
            $propPaymentCity = getOrCreateProperty($iblockId, 'data_payment_city', 'Город для платежей');
            if ($propPaymentCity) {
                setElementPropertyValue($elementId, $propPaymentCity, $dataBlock['payment_city']);
            }

            // При необходимости добавляйте остальные поля по тому же принципу
        }
    }

    // Подключаем эпилог Битрикса
    require($_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/epilog_after.php');
    

Разбор кода

  1. Подключение пролога Битрикса: Этот код подключает необходимые модули Битрикса для работы с инфоблоками.
  2. Чтение списка БИКов: Читаем файл bik.txt, который содержит список БИКов, и сохраняем их в массив.
  3. Функции для работы с свойствами инфоблока:
    • getOrCreateProperty: Проверяет, существует ли уже свойство инфоблока с заданным кодом. Если нет, создаёт его.
    • setElementPropertyValue: Устанавливает значение для свойства элемента инфоблока.
  4. Обработка каждого БИКа: Для каждого БИКа из списка выполняем запрос к API DaData, получаем информацию о банке и сохраняем её в инфоблок, создавая элементы с нужными данными.
  5. Завершение работы с Битрикс: В конце подключения вызывается эпилог, который завершает выполнение.

В итоге мы получим

Свойства элементов инфоблока, сгенерированные автоматически


Элемент инфоблока с заполненными свойствами


Этот подход позволяет автоматизировать процесс пополнения базы данных банков и значительно упростить поддержку актуальной информации на сайте.

Если вам требуется проставить символьными коды, то измените предложенный код или воспользуйтесь информацией из статьи - Массовая простановка символьных кодов в Битриксе.
Теги: API, DaData, инфоблок, банки, интеграция, автоматизация, PHP


Валерий Макеев
06.09.2025 09:52
Этот код автоматически загружает список БИК банков из файла, обращается к API DaData за подробной информацией о каждом банке и сохраняет эти данные как элементы в указанный инфоблок 1С-Битрикс с автоматическим созданием необходимых свойств.
  • Замените 14 на реальный ID вашего инфоблока.
  • Замените ваш_токен_здесь на ваш API-ключ с dadata.ru
  • Убедитесь, что файл bik.txt лежит в корне сайта и содержит по одному БИКу в строке.
  • После выполнения — удалите или защитите файл import_banks.php от публичного доступа.
Код
<?php
// Подключаем пролог Битрикс для доступа к API
require($_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_before.php');

use Bitrix\Main\Loader;
use Bitrix\Iblock\PropertyTable;
use Bitrix\Iblock\ElementPropertyTable;

// Убедимся, что модуль инфоблоков загружен
if (!Loader::includeModule('iblock')) {
    die('Ошибка: модуль iblock не подключён.');
}

$iblockId = 14; // Замените на реальный ID вашего инфоблока "Банки"
$bicFilePath = $_SERVER['DOCUMENT_ROOT'] . '/bik.txt'; // Путь к файлу с БИКами

// Читаем БИКи из файла
$bicList = file($bicFilePath, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
if (!$bicList) {
    die('Файл bik.txt пуст или не найден.');
}

// Функция: создать или получить ID свойства инфоблока
function getOrCreateProperty($iblockId, $code, $name)
{
    $existing = PropertyTable::getList([
        'filter' => ['=IBLOCK_ID' => $iblockId, '=CODE' => $code],
        'select' => ['ID'],
    ])->fetch();

    if ($existing) return $existing['ID'];

    $result = PropertyTable::add([
        'IBLOCK_ID' => $iblockId,
        'NAME' => $name,
        'CODE' => $code,
        'ACTIVE' => 'Y',
        'SORT' => 500,
        'PROPERTY_TYPE' => 'S',
    ]);

    return $result->isSuccess() ? $result->getId() : false;
}

// Функция: установить значение свойства элемента
function setElementPropertyValue($elementId, $propertyId, $value)
{
    if (!strlen(trim($value))) return;

    $result = ElementPropertyTable::add([
        'IBLOCK_ELEMENT_ID' => $elementId,
        'IBLOCK_PROPERTY_ID' => $propertyId,
        'VALUE' => $value,
    ]);

    if (!$result->isSuccess()) {
        echo 'Ошибка записи свойства: ' . implode(', ', $result->getErrorMessages()) . '<br>';
    }
}

// Обработка каждого БИКа
foreach ($bicList as $bic) {
    $bic = trim($bic);
    if (empty($bic)) continue;

    // Запрос к DaData API
    $context = stream_context_create([
        'http' => [
            'method' => 'POST',
            'header' => [
                'Content-Type: application/json',
                'Accept: application/json',
                'Authorization: Token ваш_токен_здесь' // ← Замените на реальный API-ключ DaData
            ],
            'content' => json_encode(['query' => $bic], JSON_UNESCAPED_UNICODE)
        ]
    ]);

    $url = 'https://suggestions.dadata.ru/suggestions/api/4_1/rs/findById/bank';
    $response = file_get_contents($url, false, $context);

    if (!$response) {
        echo "Нет ответа от DaData для БИК: $bic<br>";
        continue;
    }

    $data = json_decode($response, true);
    if (empty($data['suggestions'])) {
        echo "Нет данных по БИК: $bic<br>";
        continue;
    }

    $bank = $data['suggestions'][0]['data'];
    $bankName = $bank['name']['payment'] ?? 'Банк без названия';

    // Создаём элемент инфоблока
    $element = new CIBlockElement();
    $elementId = $element->Add([
        'IBLOCK_ID' => $iblockId,
        'NAME' => $bankName,
        'ACTIVE' => 'Y'
    ]);

    if (!$elementId) {
        echo "Ошибка создания элемента: " . $element->LAST_ERROR . "<br>";
        continue;
    }

    // Автоматически создаём свойства и заполняем их
    $props = [
        'data_bic' => ['БИК', $bank['bic'] ?? ''],
        'data_swift' => ['SWIFT', $bank['swift'] ?? ''],
        'data_inn' => ['ИНН', $bank['inn'] ?? ''],
        'data_kpp' => ['КПП', $bank['kpp'] ?? ''],
        'data_registration_number' => ['Рег. номер', $bank['registration_number'] ?? ''],
        'data_correspondent_account' => ['Корсчёт', $bank['correspondent_account'] ?? ''],
        'data_payment_city' => ['Город', $bank['payment_city'] ?? '']
    ];

    foreach ($props as $code => [$name, $value]) {
        $propId = getOrCreateProperty($iblockId, $code, $name);
        if ($propId) {
            setElementPropertyValue($elementId, $propId, $value);
        }
    }

    echo "Добавлен банк: $bankName (БИК: $bic)<br>";
}

require($_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/epilog_after.php');
?>

Стоимость услуг по разработке и сопровождению сайтов на 1C-Битрикс

Интернет-магазин на готовом решении

от 7 дней

от 40 000 рублей
запуск сайта в максимально короткие сроки

* указана минимальная стоимость. Стоимость выбранной лицензии «1С-Битрикс» оплачивается отдельно.

Лечение сайтов от вирусов

восстановление сайта и подъем версии PHP

от 25 000 рублей
Лечение сайтов на решениях АСПРО и прочих.

* полный комплекс лечения проекта и закрытия дыр

Лендинг

от 3 дней

от 25 000 рублей

Разработка одностраничного сайта на платформе Битрикс

* стоимость зависит от наличия верстки, использования готового решения и т.д.