Yandex Metrika
sanches.free 15 просмотров

Сниппеты 1С‑Битрикс: буфер вывода, prolog_before, авторизация, почта и заказы Sale

Введение

Ниже — переработанные шаблоны кода для повседневной работы и отладки типового сайта на 1С‑Битрикс. Часть примеров относится к legacy‑модулю Sale (CSaleOrder, CSaleBasket), часть — к ядру main.

Обнуление буфера вывода

Когда в ответ уже что‑то отправлено заголовком или простынёй ошибок и нужно вывести «чистый» результат отладочного блока или JSON, есть два знакомых пути.

  • $APPLICATION->RestartBuffer() — метод глобального приложения ядра: сбрасывает накопленный буфер в рамках жизненного цикла Битрикс и может перезаписать заголовки в зависимости от режима страницы.
  • ob_end_clean() — низкоуровневая функция PHP: просто уничтожает верхний уровень output buffering. Если уровней несколько или буфера нет — поведение отличается, поэтому для сложной вёрстки иногда нужен цикл или проверка ob_get_level().
global $APPLICATION;

// Вариант через API Битрикс
$APPLICATION->RestartBuffer();

// Альтернатива напрямую через OB
while (ob_get_level()) {
    ob_end_clean();
}

В продакшене не вызывайте это безусловно в шаблоне: вы обрежете весь последующий вывод страницы.

Мини‑обвязка: подключение ядра в своём файле

Для разового скрипта рядом с сайтом (не CLI и не входящий хит через /bitrix/urlrewrite.php) обычно задают корень документа, отключают лишнюю статистику и подключают prolog_before.php. Если файл лежит в подкаталоге, один подъём вверх по файловой системе часто даёт корректный DOCUMENT_ROOT.

if (php_sapi_name() === 'cli') {
    // Раскомментируйте, если скрипт должен выполняться только из веба:
    // die('Access denied');
}

$_SERVER['DOCUMENT_ROOT'] = dirname(__DIR__);

define('LANGUAGE_ID', 's1'); // код сайта из настроек
define('NO_KEEP_STATISTIC', true);
define('NOT_CHECK_PERMISSIONS', true);

require $_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_before.php';

// Здесь ваш код с доступом к $DB, Loader, агентам и т.д.

Для строгого CLI‑крона наоборот обычно проверяют php_sapi_name() === 'cli' и выходят из веба. Права доступа без NOT_CHECK_PERMISSIONS в реальных сценариях проверяйте явно под задачу.

Авторизация пользователя по ID

Удобно локально воспроизвести сессию конкретного пользователя без пароля — например чтобы отладить права доступа или шаблон с приветствием. Используйте аккуратно и только во внутренних средах.

global $USER;

$testUserId = 100;
$USER->Authorize((int)$testUserId, false, false);

// После этого $USER->IsAuthorized(), группы и поля профиля соответствуют выбранному ID.

Отправка почты через почтовые шаблоны

Типовой способ без прямого mail() — событие типа CEvent::Send(): подставляет поля в почтовое событие, настроенное в административном разделе.

CEvent::Send(
    'EVENT_NAME',
    'sa', // символьный идентификатор сайта
    [
        'NAME' => 'Фамилия Имя Отчество',
        'EMAIL' => 'test@example.ru',
        'DATA' => 'Дополнительный текст или сериализованные данные',
    ]
);

Имя события должно быть создано в Настройки → Настройки продукта → Почтовые события; иначе письма просто не поставятся в очередь.

Магазин: один заказ по ID

$orderId = 100;

$dbOrder = CSaleOrder::GetList([], ['ID' => $orderId]);

if ($arOrder = $dbOrder->Fetch()) {
    echo '<pre>';
    print_r($arOrder);
    echo '</pre>';
}

В новых версиях модуля sale предпочтительнее \Bitrix\Sale\Order::load(); пример выше сохранён для быстрого аудита данных на наследовании.

Магазин: корзины нескольких заказов и количество строк

Сводка помогает пойти «сломанные» корзины, когда сумма заказов в списках не совпадает с ожиданиями.

$orderIds = ['1', '2'];

foreach ($orderIds as $id) {
    $dbBasket = CSaleBasket::GetList(
        ['ID' => 'ASC', 'NAME' => 'ASC'],
        ['ORDER_ID' => $id],
        false,
        false,
        ['*']
    );

    echo $id . ' строк в корзине: ' . (int)$dbBasket->SelectedRowsCount() . PHP_EOL;
}

На что обратить внимание

  • RestartBuffer и чистка OB не заменяют корректные заголовки Content-Type для API — их всё равно нужно задавать перед выводом.
  • $USER->Authorize() в общедоступном скрипте — прямой обход безопасности; после отладки удаляйте вызов.
  • Для D7-проекта перенесите ключевые куски на ORM и сервисы Sale\, оставив старые классы точечным инструментом миграции.

Сборка закрывает самые частые «бытовые» сценарии: от подготовки чистого вывода и подключения пролога до почты и простых запросов к заказам.

Не хотите копаться сами?

Починю за 1-3 дня. Без предоплаты — оплата по результату.

15+ лет опыта с 1С-Битрикс · Без предоплаты · 7 дней гарантии