Наполнение инфоблока данными через 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

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

Перенос сайтов на «1С-Битрикс»

сайты на платформе «1С-Битрикс» — это удобство, надежность и высокая посещаемость

от 12 000 рублей
Перенос сайтов с любых CMS и статичных страниц на платформу «1С-Битрикс», с учетом дизайна, верстки и урл-адресов. С сохранением всей информации и структуры сайта.

* зависит от объема выполняемых работ.

Модули и компоненты для «1С-Битрикс»

оценка производится на основе предоставленного Технического Задания

от 20 000 рублей
Разработка дополнительных модулей для 1С-Битрикс, расширение функционала, внедрение любых решений, требующихся для выполнения ваших бизнес-задач.

* стоимость зависит от конкретной задачи, ее объема и сложности выполняемых работ.

Лендинг

от 3 дней

от 25 000 рублей

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

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