Программирование на языке PHP в CMS 1С-Битрикс
Основы работы с 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 для шаблона почтового события.