PHP-программы для решения задач на платформе 1С-Битрикс

Раздел: CMS -> 1С-Битрикс

Наиболее эффективный подход к созданию скриптов для 1С-Битрикс - написание автономного PHP-файла с подключением ядра системы. Такой файл можно разместить в корне или в папке /local/scripts/ и вызывать через браузер или cron. Он не зависит от шаблонов и компонентов, что даёт полную свободу действий.

Основные шаги:

  1. Создать файл, например /local/scripts/custom_task.php.
  2. Подключить пролог до выполнения: require $_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_before.php';
  3. Проверить права доступа (рекомендуется проверять администратора).
  4. Выполнить нужные операции: работа с инфоблоками, пользователями, отправка почты и т.д.
  5. Подключить пролог после: 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).

PHP скрипты для 1С-Битрикс - comments

En
битрикс php скриптов (php)