Сниппеты 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 дней гарантии