Программирование на языке PHP в CMS 1С-Битрикс

Раздел: Управление контентом -> CMS Битрикс

Основы работы с API Битрикс на PHP

Эффективное решение: использование ORM (Data\DataManager)

ORM (Object-Relational Mapping) в Битриксе предоставляет удобный и производительный способ работы с данными. Он позволяет избежать ручного написания SQL-запросов и обеспечивает кеширование, события и типизацию.


use Bitrix\Main\Data\DataManager;
use Bitrix\Main\ORM\Fields\IntegerField;
use Bitrix\Main\ORM\Fields\StringField;

class MyTable extends DataManager
{
    public static function getTableName()
    {
        return 'my_table';
    }

    public static function getMap()
    {
        return [
            new IntegerField('ID', ['primary' => true, 'autocomplete' => true]),
            new StringField('NAME', ['required' => true]),
        ];
    }
}

// Добавление записи
$result = MyTable::add(['NAME' => 'Пример']);
if ($result->isSuccess()) {
    echo $result->getId();
}

// Выборка
$items = MyTable::getList(['select' => ['ID', 'NAME'], 'filter' => ['=NAME' => 'Пример']]);
while ($item = $items->fetch()) {
    echo $item['ID'];
}

Bitrix test php (тестирование php в 1с-битрикс)

Пояснение: создается класс, наследующий DataManager, описывается таблица. Метод add добавляет запись, getList выбирает. ORM автоматически экранирует данные и поддерживает кеширование.

Типичные проблемы:

  • Отсутствие прав на создание таблиц в БД - ошибка "Access denied". Решение: использовать существующие таблицы или создать через API.
  • Неверное указание классов в use - исключение "Class not found". Проверить подключение модулей.

Как получить список элементов инфоблока с помощью CIBlockElement?

Класс CIBlockElement - классический способ работы с элементами инфоблоков. Он предоставляет методы GetList, Add, Update, Delete.


\CModule::IncludeModule('iblock');
$arFilter = ['IBLOCK_ID' => 1, 'ACTIVE' => 'Y'];
$arSelect = ['ID', 'NAME', 'PROPERTY_*'];
$res = \CIBlockElement::GetList([], $arFilter, false, ['nTopCount' => 10], $arSelect);
while ($ob = $res->GetNextElement()) {
    $arFields = $ob->GetFields();
    $arProps = $ob->GetProperties();
    print_r($arFields);
}

Bitrix api php (api битрикс на php)

Пояснение: GetList принимает сортировку, фильтр, группировку, навигацию, выбор полей. GetNextElement возвращает объект, из которого извлекаются поля и свойства.

Ошибки:

  • Не подключен модуль iblock - получаем фатальную ошибку. Всегда добавлять CModule::IncludeModule('iblock').
  • Неправильный IBLOCK_ID - пустой результат. Проверить ID инфоблока.

Как выполнить REST запрос к Битрикс24 из PHP?

Внешние приложения могут использовать REST API Битрикс24. Для этого требуется авторизация и отправка HTTP-запросов.


$webhookUrl = 'https://your-domain.bitrix24.ru/rest/1/your-webhook-token/';
$method = 'crm.lead.list';
$params = ['filter' => ['STATUS_ID' => 'NEW'], 'select' => ['ID', 'TITLE']];
$url = $webhookUrl . $method . '.json';

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params));
$response = curl_exec($ch);
curl_close($ch);

$result = json_decode($response, true);
print_r($result);

Пояснение: в URL встраивается токен вебхука. Параметры передаются методом POST. Ответ в формате JSON.

Проблемы:

  • Ошибка авторизации (401) - неверный токен или домен. Проверить данные вебхука.
  • Превышение лимита запросов (429) - необходимо добавить задержку.

Как создать агент для выполнения фоновых задач?

Агенты - это функции, выполняемые по расписанию. Регистрируются через CAgent или ORM.


// Функция агента
function myAgentFunction() {
    // Логика
    return "myAgentFunction();"; // Возвращаем имя для повторного выполнения
}

// Регистрация агента
\CAgent::AddAgent(
    "myAgentFunction();",
    "", // модуль (можно пусто)
    "N", // периодичность (N - непериодический)
    86400, // интервал в секундах
    "", // дата старта
    "Y", // активность
    "", // сортировка
    "2025-01-01 00:00:00" // дата следующего запуска
);

Пояснение: агент должен возвращать строку с именем функции для повторения или пустую строку для однократного выполнения. CAgent::AddAgent регистрирует его.

Типичные ошибки:

  • Функция не найдена - требуется autoload или явное подключение файла.
  • Агент не выполняется - проверить настройки cron или отсутствие блокировок.

Как подписаться на события модуля (OnEvent)?

События позволяют реагировать на действия в системе без изменения ядра.


// В init.php или файле модуля
\Bitrix\Main\EventManager::getInstance()->addEventHandler(
    'iblock',
    'OnAfterIBlockElementAdd',
    'myEventHandler'
);

function myEventHandler(&$arFields) {
    // $arFields содержит ID, IBLOCK_ID и другие поля
    \CEventLog::Add([
        'SEVERITY' => 'INFO',
        'AUDIT_TYPE_ID' => 'MY_EVENT',
        'MODULE_ID' => 'iblock',
        'ITEM_ID' => $arFields['ID'],
        'DESCRIPTION' => 'Добавлен элемент инфоблока',
    ]);
}

Пояснение: addEventHandler подписывается на событие OnAfterIBlockElementAdd. Функция-обработчик получает массив полей.

Проблемы:

  • Событие не вызывается - проверить правильность имени события и модуля.
  • Бесконечная рекурсия - в обработчике не модифицировать данные, которые вызывают это же событие.

Расширенные примеры использования API Битрикс

ORM: выборка с связями и агрегацией

Пример: получить список элементов инфоблока с названием раздела и количеством просмотров из таблицы статистики (предположим, есть таблица statistics с полями ELEMENT_ID, VIEWS).

Пример

use Bitrix\Main\Data\DataManager;
use Bitrix\Main\ORM\Query\Join;
use Bitrix\Main\ORM\Fields\Relations\Reference;
use Bitrix\Main\ORM\Fields\ExpressionField;

class ElementTable extends DataManager {
    public static function getTableName() { return 'b_iblock_element'; }
    public static function getMap() {
        return [
            new IntegerField('ID', ['primary' => true]),
            new StringField('NAME'),
            new IntegerField('IBLOCK_SECTION_ID'),
            (new Reference('SECTION', SectionTable::class, Join::on('this.IBLOCK_SECTION_ID', 'ref.ID')))->configureJoinType('left'),
        ];
    }
}

class SectionTable extends DataManager {
    public static function getTableName() { return 'b_iblock_section'; }
    public static function getMap() {
        return [
            new IntegerField('ID', ['primary' => true]),
            new StringField('NAME'),
        ];
    }
}

// Запрос
$result = ElementTable::getList([
    'select' => ['ID', 'NAME', 'SECTION_NAME' => 'SECTION.NAME'],
    'filter' => ['=IBLOCK_ID' => 2],
    'limit' => 10,
]);
while ($row = $result->fetch()) {
    echo $row['ID'] . ' - ' . $row['NAME'] . ' - ' . $row['SECTION_NAME'] . "\n";
}

Результат:

1 - Товар1 - Раздел А
2 - Товар2 - Раздел Б
...

Пояснение: используется Reference для связи с разделом. Выборка включает поле из связанной таблицы.

Агент для массовой очистки старых логов

Пример: агент удаляет записи из таблицы логов старше 30 дней.

Пример

function cleanOldLogs() {
    $connection = \Bitrix\Main\Application::getConnection();
    $sql = "DELETE FROM b_event_log WHERE TIMESTAMP_X < DATE_SUB(NOW(), INTERVAL 30 DAY)";
    $connection->queryExecute($sql);
    return "cleanOldLogs();";
}

// Регистрация
\CAgent::AddAgent("cleanOldLogs();", "", "N", 86400);

Результат: запуск агента каждый день удаляет старые логи.

REST: обновление пользовательского поля лида

Пример: установить значение пользовательского поля UF_CRM_5_IS_IMPORTANT у лида.

Пример

$webhook = 'https://site.bitrix24.ru/rest/1/xxx/';
$method = 'crm.lead.update';
$params = [
    'id' => 123,
    'fields' => [
        'UF_CRM_5_IS_IMPORTANT' => 1,
    ],
];
$url = $webhook . $method . '.json';
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params));
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);
if ($result['result']) {
    echo 'Обновлено успешно';
} else {
    print_r($result['error']);
}

Результат: возвращается true при успехе.

Событие: отправка email при добавлении элемента

Пример: подписка на OnAfterIBlockElementAdd и отправка письма.

Пример

\Bitrix\Main\EventManager::getInstance()->addEventHandler(
    'iblock',
    'OnAfterIBlockElementAdd',
    'sendNewElementNotification'
);

function sendNewElementNotification(\Bitrix\Main\Event $event) {
    $parameters = $event->getParameters();
    $elementId = $parameters['ID'];
    $iblockId = $parameters['IBLOCK_ID'];
    // Получить данные элемента
    $element = \CIBlockElement::GetByID($elementId)->GetNext();
    $name = $element['NAME'];
    // Отправить email
    \CEvent::Send('NEW_ELEMENT', SITE_ID, [
        'ELEMENT_NAME' => $name,
        'ELEMENT_ID' => $elementId,
    ]);
}

Пояснение: событие передает ID и другие параметры. Используется CEvent::Send для шаблона почтового события.

API Битрикс на PHP - comments

En
Bitrix api php (php)