PHP-программы для решения задач на платформе 1С-Битрикс
Наиболее эффективный подход к созданию скриптов для 1С-Битрикс - написание автономного PHP-файла с подключением ядра системы. Такой файл можно разместить в корне или в папке /local/scripts/ и вызывать через браузер или cron. Он не зависит от шаблонов и компонентов, что даёт полную свободу действий.
Основные шаги:
- Создать файл, например
/local/scripts/custom_task.php. - Подключить пролог до выполнения:
require $_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_before.php'; - Проверить права доступа (рекомендуется проверять администратора).
- Выполнить нужные операции: работа с инфоблоками, пользователями, отправка почты и т.д.
- Подключить пролог после:
require $_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/epilog_after.php';
<?php
// Файл: /local/scripts/update_iblock_elements.php
require $_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_before.php';
// Проверка прав
global $USER;
if (!$USER->IsAdmin()) {
echo 'Доступ запрещен';
die();
}
// Подключаем нужные модули
CModule::IncludeModule('iblock');
$iblockId = 2; // ID инфоблока
$arSelect = Array('ID', 'NAME', 'PROPERTY_PRICE');
$arFilter = Array('IBLOCK_ID' => $iblockId, 'ACTIVE' => 'Y');
$res = CIBlockElement::GetList(Array(), $arFilter, false, false, $arSelect);
while ($ob = $res->GetNextElement()) {
$arFields = $ob->GetFields();
$arProps = $ob->GetProperties();
// Увеличиваем цену на 10 процентов
$newPrice = $arProps['PRICE']['VALUE'] * 1.1;
CIBlockElement::SetPropertyValues($arFields['ID'], $iblockId, $newPrice, 'PRICE');
echo 'Элемент '.$arFields['ID'].' - цена обновлена до '.$newPrice.'<br>';
}
require $_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/epilog_after.php';
?>Bitrix catalog sections php (1с-битрикс каталог разделов php)
Пояснение: скрипт проходит по всем активным элементам инфоблока ID 2, увеличивает значение свойства PRICE на 10% и выводит результат. Подключение epilog обязательно для корректного завершения работы и отображения выходных данных.
Типичные проблемы и их решения:
- Ошибка «Не удалось подключить пролог» - проверьте путь к корню сайта и наличие файлов пролога.
- Скрипт выполняется бесконечно - используйте постраничную выборку (
nPageSizeиiNumPage). - Изменения не отображаются - очистите кэш в административной панели.
Альтернативные варианты реализации
Как выполнять задачи по расписанию без ручного запуска?
Используются агенты - встроенный механизм 1С-Битрикс. Агент представляет собой функцию PHP, которая выполняется через заданные интервалы. Регистрация происходит либо через административный интерфейс, либо программно:
// Пример регистрации агента в коде
CAgent::AddAgent(
'MyAgentFunction();', // имя функции
'main', // модуль
'N', // периодичность (N - непериодический, Y - периодический)
86400, // интервал в секундах
'', // дата старта (пусто - сразу)
'Y', // активность
'', // дата следующего запуска
30 // частота (в секундах)
);
function MyAgentFunction() {
// код, выполняемый агентом
$result = someLongOperation();
if ($result) {
return 'MyAgentFunction();'; // обязательно вернуть имя функции для повторного запуска
}
return ''; // если возвращается пустая строка, агент удаляется
}Bitrix section php (1с-битрикс раздел php)
Пояснение: агент срабатывает раз в сутки. Возвращаемое значение определяет, будет ли агент выполняться снова. Если функция возвращает пустую строку, агент считается завершённым и удаляется.
Распространённые ошибки при работе с агентами:
- Агент не запускается - убедитесь, что в настройках модуля «Агенты» включена автоматическая обработка (Настройки → Настройки продукта → Агенты).
- Агент выполняется слишком долго - разбейте задачу на несколько агентов или увеличьте лимит времени через
set_time_limit(). - Неверное возвращаемое значение - функция должна возвращать строку с именем своей функции (или пустую строку для удаления).
Как реагировать на изменения данных (добавление, обновление, удаление) в системе?
Через обработчики событий. В файлах /bitrix/php_interface/init.php или /local/php_interface/init.php регистрируются функции-обработчики на события ядра. Пример:
// В init.php
AddEventHandler('iblock', 'OnAfterIBlockElementAdd', 'myElementAddHandler');
function myElementAddHandler(&$arFields) {
if ($arFields['IBLOCK_ID'] == 2) {
// Логирование или отправка уведомления
CEvent::Send('NEW_ELEMENT', SITE_ID, array(
'ELEMENT_NAME' => $arFields['NAME'],
'ADMIN_EMAIL' => 'admin@example.com'
));
}
}
битрикс php скриптов (php скрипты для 1с-битрикс)
Пояснение: после добавления элемента в инфоблок 2 отправляется почтовое уведомление администратору. Обработчики можно вешать на любые события (onBefore* или onAfter*).
Потенциальные проблемы обработчиков:
- Рекурсия - если обработчик сам вызывает событие, на которое подписан (например, обновляя элемент в обработчике onAfterUpdate), возникает бесконечный цикл. Используйте флаги или отключайте обработчик на время выполнения.
- Перегрузка - тяжёлые операции в обработчиках замедляют запросы. Для длительных действий лучше ставить агента.
Как интегрировать 1С-Битрикс с внешними сервисами?
Через REST API. Битрикс24 (или коробочная версия с модулем REST) предоставляет вебхуки. Внешний скрипт отправляет HTTP-запросы к методам REST. Пример создания лида:
// Внешний PHP-скрипт (не на сервере Битрикс)
$webhookUrl = 'https://your-domain.bitrix24.ru/rest/1/your_webhook/crm.lead.add.json';
$data = array(
'fields' => array(
'TITLE' => 'Заявка с сайта',
'NAME' => 'Иван',
'PHONE' => array(array('VALUE' => '+7-999-123-45-67', 'VALUE_TYPE' => 'WORK')),
'SOURCE_ID' => 'WEB'
),
'params' => array('REGISTER_SONET_EVENT' => 'Y')
);
$ch = curl_init($webhookUrl);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);
if (isset($result['result'])) {
echo 'Лид создан, ID: '.$result['result'];
} else {
echo 'Ошибка: '.$result['error_description'];
}
Пояснение: скрипт отправляет POST-запрос к вебхуку, передавая данные лида. Ответ содержит ID созданного лида или описание ошибки.
Ошибки при использовании REST:
- Неверный URL или ключ вебхука - проверьте права приложения и правильность ввода.
- Превышение лимитов - Битрикс ограничивает количество запросов в минуту (обычно 40). Используйте паузу между вызовами.
- CORS - запросы из браузера запрещены, выполняйте только серверные скрипты.
Как запустить скрипт из командной строки (без веб-сервера)?
Для консольных скриптов ядро подключается иначе - без сессий и агентов. Пример:
// /local/scripts/cli_task.php
<?php
$_SERVER['DOCUMENT_ROOT'] = realpath(__DIR__ . '/../../');
require $_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include.php';
define('NO_AGENT_CHECK', true);
define('NO_KEEP_STATISTIC', true);
CModule::IncludeModule('iblock');
// Выполнение операций, например, очистка старых заказов
$dbRes = CSaleOrder::GetList(array(), array('<=DATE_INSERT' => date('Y-m-d', strtotime('-1 year'))), false, false, array('ID', 'STATUS_ID'));
while ($arOrder = $dbRes->Fetch()) {
CSaleOrder::CancelOrder($arOrder['ID'], 'Y','Устаревший заказ');
echo 'Отменен заказ ID: '.$arOrder['ID'].'\n';
}
Запуск: php /path/to/site/local/scripts/cli_task.php. Пояснение: для консоли не требуется сессия, поэтому отключаются проверки агентов и статистики.
Трудности консольных скриптов:
- Некорректный DOCUMENT_ROOT - используйте относительный путь через
__DIR__. - Отсутствие некоторых модулей - убедитесь, что все необходимые модули подключены до вызова функций.
- Права на запись - скрипт запускается от пользователя системы, ему нужны соответствующие права.
Как внедрить код, выполняемый при каждом запросе?
Файл /local/php_interface/init.php автоматически подключается при старте ядра. В нём размещают константы, пользовательские функции и регистрацию событий. Пример:
// /local/php_interface/init.php
<?php
// Пользовательская функция для проверки прав
define('MY_CUSTOM_CONSTANT', 'value');
function checkCustomAccess() {
global $USER;
return $USER->IsAdmin();
}
// Регистрация события
AddEventHandler('main', 'OnBeforeProlog', function() {
// действие перед отрисовкой страницы
});
Пояснение: init.php удобен для глобальных настроек, но не для тяжёлых вычислений, так как выполняется на каждом хите.
Нюансы init.php:
- Синтаксическая ошибка в init.php может полностью вывести сайт из строя - всегда тестируйте локально.
- Кэширование страниц - изменения в init.php не сбрасывают кэш компонентов, поэтому эффект может быть не сразу виден.
Расширенные примеры PHP скриптов для 1С-Битрикс
Пример 1. Выгрузка товаров в CSV с разбивкой на пакеты
Скрипт формирует CSV-файл со всеми активными элементами инфоблока. Для больших каталогов используется постраничная выборка, чтобы не превысить лимит памяти и времени выполнения.
<?php
// /local/scripts/export_csv.php
require $_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_before.php';
if (!$USER->IsAdmin()) die();
CModule::IncludeModule('iblock');
header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename=export.csv');
$output = fopen('php://output', 'w');
fputcsv($output, array('ID', 'NAME', 'PRICE', 'QUANTITY'));
$filter = array('IBLOCK_ID' => 2, 'ACTIVE' => 'Y');
$offset = 0;
$limit = 500;
$first = true;
while (true) {
$rs = CIBlockElement::GetList(array(), $filter, false, array('nPageSize' => $limit, 'iNumPage' => $offset+1), array('ID', 'NAME', 'PROPERTY_PRICE', 'PROPERTY_QUANTITY'));
if ($first) {
$totalCount = $rs->SelectedRowsCount();
$first = false;
}
while ($ar = $rs->Fetch()) {
fputcsv($output, array($ar['ID'], $ar['NAME'], $ar['PROPERTY_PRICE_VALUE'], $ar['PROPERTY_QUANTITY_VALUE']));
}
if ($rs->SelectedRowsCount() < $limit) break;
$offset++;
}
fclose($output);
require $_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/epilog_after.php';
?>
Результат: браузер скачивает CSV-файл с данными. Выгрузка происходит частями по 500 записей, что позволяет обрабатывать каталоги любого объёма.
Пример 2. Отправка массовых уведомлений в Битрикс24 через REST
Скрипт отправляет системное уведомление указанным пользователям Битрикс24. Используется метод im.notify.personal.add.
<?php
// /local/scripts/notify_bitrix24.php
$webhookUrl = 'https://your.bitrix24.ru/rest/1/your_webhook/im.notify.personal.add.json';
$userIds = array(1, 5, 10);
$message = 'Началась акция! Скидка 20% на все товары.';
foreach ($userIds as $userId) {
$params = array(
'USER_ID' => $userId,
'TITLE' => 'Акция',
'MESSAGE' => $message,
'TYPE' => 'SYSTEM'
);
$ch = curl_init($webhookUrl);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);
if (isset($result['result'])) {
echo 'Уведомление отправлено пользователю '.$userId.'\n';
} else {
echo 'Ошибка для '.$userId.': '.$result['error_description'].'\n';
}
}
?>
Результат: каждому указанному сотруднику приходит уведомление в ленту Битрикс24. Выводятся сообщения об успехе или ошибке для каждого пользователя.
Пример 3. Синхронизация пользователей с внешним источником
Скрипт получает список пользователей из внешней системы (в примере - массив) и создаёт или обновляет их в 1С-Битрикс.
<?php
// /local/scripts/sync_users.php
require $_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_before.php';
if (!$USER->IsAdmin()) die();
$externalUsers = array(
array('LOGIN' => 'ivanov', 'EMAIL' => 'ivanov@company.ru', 'NAME' => 'Иван', 'LAST_NAME' => 'Иванов', 'ACTIVE' => 'Y'),
array('LOGIN' => 'petrov', 'EMAIL' => 'petrov@company.ru', 'NAME' => 'Петр', 'LAST_NAME' => 'Петров', 'ACTIVE' => 'Y')
);
foreach ($externalUsers as $userData) {
$by = 'LOGIN';
$order = 'ASC';
$dbUser = CUser::GetList($by, $order, array('LOGIN' => $userData['LOGIN']));
if ($arUser = $dbUser->Fetch()) {
$user = new CUser;
$user->Update($arUser['ID'], $userData);
echo 'Обновлён пользователь '.$userData['LOGIN'].' (ID '.$arUser['ID'].')\n';
} else {
$user = new CUser;
$userData['PASSWORD'] = 'temp12345';
$userData['CONFIRM_PASSWORD'] = 'temp12345';
$id = $user->Add($userData);
if ($id) {
echo 'Создан пользователь '.$userData['LOGIN'].' с ID '.$id.'\n';
} else {
echo 'Ошибка создания '.$userData['LOGIN'].': '.$user->LAST_ERROR.'\n';
}
}
}
require $_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/epilog_after.php';
?>
Результат: скрипт проходит по внешнему списку, проверяет логин, обновляет существующих или создаёт новых пользователей с временным паролем. Выводится лог операций.
Пример 4. Генерация PDF-отчёта с помощью Dompdf
Скрипт формирует HTML-таблицу с товарами, конвертирует её в PDF с помощью библиотеки Dompdf и отправляет файл на скачивание.
<?php
// /local/scripts/generate_report_pdf.php
require $_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_before.php';
if (!$USER->IsAdmin()) die();
require $_SERVER['DOCUMENT_ROOT'].'/vendor/autoload.php'; // Composer
use Dompdf\Dompdf;
$html = '<h1>Отчёт по товарам</h1><table border="1"><tr><th>ID</th><th>Название</th><th>Цена</th></tr>';
CModule::IncludeModule('iblock');
$dbRes = CIBlockElement::GetList(array(), array('IBLOCK_ID' => 2, 'ACTIVE' => 'Y'), false, false, array('ID', 'NAME', 'PROPERTY_PRICE'));
while ($arEl = $dbRes->Fetch()) {
$html .= '<tr><td>'.$arEl['ID'].'</td><td>'.$arEl['NAME'].'</td><td>'.$arEl['PROPERTY_PRICE_VALUE'].'</td></tr>';
}
$html .= '</table>';
$dompdf = new Dompdf();
$dompdf->loadHtml($html);
$dompdf->setPaper('A4', 'landscape');
$dompdf->render();
$dompdf->stream('report.pdf', array('Attachment' => 1));
exit();
?>
Результат: скрипт генерирует PDF-документ с таблицей товаров и предлагает его скачать. Требуется установленная библиотека Dompdf (через Composer).