Highload-блоки в Битрикс24

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!

Привет, Хабр!

Сегодня мы поговорим о том, как highload-блоки в Битрикс24 могут помочь справиться с большими объемами данных и обеспечить стабильную работу систем при высоких нагрузках.

Highload-блоки в Битрикс24 — это специальный инструмент для работы с большими наборами данных в условиях высоких нагрузок. В отличие от стандартных инфоблоков, highload-блоки ориентированы на обработку большого объема данных с высокой производительностью.

Highload-блоков позволяют:

  • Уменьшить время отклика системы.

  • Снизить нагрузку на БД.

  • Оптимизировать процесс обработки данных.

Основные возможности

Поддержка NoSQL и ORM

Highload-блоки используют NoSQL подход для хранения и обработки данных. Так можно эффективно работать с неструктурированными и полуструктурированными данными.

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

Настройка и интеграция с другими модулями

Сущестсует возможность использования highload-блоков для хранения доп. данных, связанных с CRM-сущностями, такими как контакты, сделки и компании.

Также есть поддержка кастомных полей (например, TagSelector), которые могут быть использованы в фильтрах и отчетах CRM.

Highload-блоки могут быть использованы для хранения данных, которые нецелесообразно хранить в стандартных инфоблоках из-за их объема или специфики.

Процесс настройки highload-блоков

Все стартует с создания highload-блока:

Переходим в административную часть Битрикс24. В меню выбераем раздел "Контент" и затем "Highload-блоки". Нажимаем кнопку "Добавить highload-блок". Указываем имя блока и его таблицы в Бд, а также код, который будет использоваться в коде. Там же можно указать группы пользователей.

Далее необходимо перейти к настройке блока. Добавляем необходимые поля, указав их тип (строка, целое число, дата и т.д.), название и доп. параметры, такие как обязательность заполнения и уникальность. Например, для справочника товаров можно создать поля "ID", "Название товара", "Цена", "Описание" и т.д.

Чтобы добавить элементы в highload-блок, переходим к административной части, выбираем созданный highload-блок и добавляемновые записи, заполнив соответствующие поля. Этот процесс аналогичен добавлению элементов в инфоблоки, но с учетом оптимизаций для высоких нагрузок.

Рассмотрим примеры настройки полей для различных кейсов:

  • Справочник товаров:

    • Поля: ID (автоинкремент), Название (строка), Цена (целое число), Описание (текст), Дата добавления (дата/время).

    • Для поля "Цена" можно задать валидацию на положительное значение.

  • Кастомные поля (TagSelector):

    • Поля: ID (автоинкремент), Тег (строка).

    • В настройках можно включить возможность выбора нескольких тегов и указать их отображение в виде списка или дерева.

Пример кода для создания и настройки полей highload-блоков:

use Bitrix\Highloadblock as HL;
use Bitrix\Main\Entity;

$hlblock = HL\HighloadBlockTable::add(array(
    'NAME' => 'ProductCatalog',
    'TABLE_NAME' => 'b_product_catalog'
));
$entity = HL\HighloadBlockTable::compileEntity($hlblock);

$fields = array(
    array(
        'ENTITY_ID' => 'HLBLOCK_' . $hlblock['ID'],
        'FIELD_NAME' => 'UF_NAME',
        'USER_TYPE_ID' => 'string',
        'MANDATORY' => 'Y'
    ),
    array(
        'ENTITY_ID' => 'HLBLOCK_' . $hlblock['ID'],
        'FIELD_NAME' => 'UF_PRICE',
        'USER_TYPE_ID' => 'double',
        'MANDATORY' => 'Y'
    ),
    array(
        'ENTITY_ID' => 'HLBLOCK_' . $hlblock['ID'],
        'FIELD_NAME' => 'UF_DESCRIPTION',
        'USER_TYPE_ID' => 'string'
    ),
    array(
        'ENTITY_ID' => 'HLBLOCK_' . $hlblock['ID'],
        'FIELD_NAME' => 'UF_DATE_ADDED',
        'USER_TYPE_ID' => 'datetime'
    )
);

foreach ($fields as $field) {
    $result = $entity::addField($field);
    if (!$result->isSuccess()) {
        echo implode(', ', $result->getErrorMessages());
    }
}

Импорт данных в highload-блоки можно выполнить через административную часть или с помощью API. Поддерживаются форматы CSV и XML. В случае CSV файла необходимо подготовить файл с заголовками, соответствующими полям highload-блока.

Пример для импорта данных из CSV:

$csvFile = '/path/to/file.csv';
$handle = fopen($csvFile, 'r');
while (($data = fgetcsv($handle, 1000, ',')) !== FALSE) {
    $result = $entity::add(array(
        'UF_NAME' => $data[0],
        'UF_PRICE' => $data[1],
        'UF_DESCRIPTION' => $data[2],
        'UF_DATE_ADDED' => $data[3]
    ));
    if (!$result->isSuccess()) {
        echo implode(', ', $result->getErrorMessages());
    }
}
fclose($handle);

Экспорт данных из highload-блоков также поддерживает форматы CSV и XML. Можно использовать стандартные методы выборки данных и записи их в файл.

Пример:

$csvFile = '/path/to/export.csv';
$handle = fopen($csvFile, 'w');
fputcsv($handle, array('ID', 'Name', 'Price', 'Description', 'Date Added'));

$result = $entity::getList();
while ($item = $result->fetch()) {
    fputcsv($handle, array(
        $item['ID'],
        $item['UF_NAME'],
        $item['UF_PRICE'],
        $item['UF_DESCRIPTION'],
        $item['UF_DATE_ADDED']
    ));
}
fclose($handle);

Экспорт данных в формат RSS может быть выполнен с использованием стандартных библиотек PHP для генерации RSS-каналов.Так можно постить обновления и новости, связанные с данными highload-блоков.

Пример кода:

use Bitrix\Highloadblock as HL;
use Bitrix\Main\Entity;

// подключаем необходимые модули и файлы
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
CModule::IncludeModule('highloadblock');

// указываем ID highload-блока и получаем информацию о нём
$hlblockId = 1; // Замените на ID вашего highload-блока
$hlblock = HL\HighloadBlockTable::getById($hlblockId)->fetch();
$entity = HL\HighloadBlockTable::compileEntity($hlblock);
$entityDataClass = $entity->getDataClass();

// получаем данные из highload-блока
$rsData = $entityDataClass::getList(array(
    "select" => array('ID', 'UF_NAME', 'UF_DESCRIPTION', 'UF_DATE_ADDED'),
    "order" => array('UF_DATE_ADDED' => 'DESC'),
    "limit" => 20
));

header('Content-Type: application/rss+xml; charset=utf-8');

echo '<?xml version="1.0" encoding="UTF-8" ?>';
echo '<rss version="2.0">';
echo '<channel>';
echo '<title>Highload-блок RSS</title>';
echo '<link>http://yourwebsite.com/</link>';
echo '<description>Новости из highload-блока</description>';
echo '<language>ru</language>';

// проходим по данным и формируем элементы RSS
while ($arItem = $rsData->fetch()) {
    echo '<item>';
    echo '<title>' . htmlspecialchars($arItem['UF_NAME']) . '</title>';
    echo '<link>http://yourwebsite.com/item/' . $arItem['ID'] . '</link>';
    echo '<description>' . htmlspecialchars($arItem['UF_DESCRIPTION']) . '</description>';
    echo '<pubDate>' . date(DATE_RSS, strtotime($arItem['UF_DATE_ADDED'])) . '</pubDate>';
    echo '</item>';
}

echo '</channel>';
echo '</rss>';

Используя ID highload-блока, получаем информацию о нём и данные, которые будем экспортировать в RSS-формат. Устанавливаем заголовок Content-Type, чтобы указать браузеру, что документ является RSS-лентой. В блоке while проходим по всем элементам, полученным из highload-блока, и формируем соответствующие элементы RSS <item>.


Highload-блоки в Битрикс24, несмотря на их мощность, имеют ряд ограничений и потенциальных проблем. Одно из основных ограничений является объем данных и производительность. Хотя highload-блоки могут хорошо работать с миллионами записей, производительность системы может снижаться при увеличении объема данных. Это связано с тем, что запросы к БД могут становиться более медленными, особенно если они не оптимизированы или отсутствует кэширование.

При увеличении объема данных может возникнуть необходимость в оптимизации самой БД:, индексация, настройка параметров кэширования и т.п.

В заключение напоминаю про открытый урок, на котором участники обсудят изменение пользовательских интерфейсов в Битрикс24.

К концу занятия вы узнаете, почему не стоит использовать переопределение шаблонов компонентов, как встраивать пользовательские поля с произвольной версткой, как встраивать REST приложения и дорабатывать интерфейс при помощи JavaScript.

Встреча пройдет 16 июля. Если актуально — записывайтесь по ссылке.

Источник: https://habr.com/ru/companies/otus/articles/827008/


Интересные статьи

Интересные статьи

Сложно ли потянуть коробку? В этой статье расскажу, в каких случаях пользователям облачного Битрикс24 стоит переезжать в коробочную версию и к чему надо быть готовым.Приветствую всех, это Сергей Михно...
Данной статьей я начинаю цикл статей по интеграции Битрикс24, а именно разборов кейсов работы обычных компаний и подбора решений, с помощью которых можно значительно упростить жизнь этих компаний. Сле...
Представляю вашему вниманию цикл статей по работе с пока еще мало знакомым многим битрикс-разработчикам инструментом оперирования данными с CRM Битрикс24 через абстрактные фабрики. В первой статье рас...
Нередко при работе с Bitrix24 REST API возникает необходимость быстро получить содержимое определенных полей всех элементов какого-то списка (например, лидов). Традиционн...
История сегодня пойдёт про автосервис в Москве и его продвижении в течении 8 месяцев. Первое знакомство было ещё пару лет назад при странных обстоятельствах. Пришёл автосервис за заявками,...