Настройка пикселя Facebook на 1С-Битрикс
Пиксель Facebook не работает «из коробки» на Битриксе — и дело не в сложности кода, а в том, что стандартный механизм подключения скриптов конфликтует с кешированием и событийной моделью. Базовый код пикселя вставляют в шапку через header.php или через настройки сайта, но без передачи событий это просто счётчик посещений, не более.
Где живёт базовый код и почему там проблемы
Шаблон сайта в Битриксе хранит header.php в /bitrix/templates/<имя_шаблона>/. Вставка скрипта напрямую в файл — рабочий вариант, но неудобный: при смене шаблона код теряется, а при использовании составных шаблонов (bitrix:page.polymorph) часть блоков кешируется и пиксель может не срабатывать на закешированных страницах.
Правильнее использовать компонент bitrix:main.include с установленным параметром AREA_FILE_SHOW = head, или подключать скрипт через обработчик события OnEpilog в файле /bitrix/php_interface/init.php:
AddEventHandler("main", "OnEpilog", function() {
$pixelId = COption::GetOptionString("main", "fb_pixel_id", "");
if ($pixelId) {
echo '<script>/* FB Pixel code with id: ' . htmlspecialchars($pixelId) . ' */</script>';
}
});
ID пикселя при этом хранится в таблице b_option (модуль main), через COption::SetOptionString.
Стандартные события и передача данных каталога
Для e-commerce важны три события: ViewContent, AddToCart, Purchase. Все они должны передавать параметры товара — content_ids, content_type, value, currency.
ViewContent — вызывается на странице детального просмотра товара. Компонент bitrix:catalog.element генерирует страницу, данные товара доступны в $arResult. Кастомизируете template.php компонента и добавляете JS-вызов fbq('track', 'ViewContent', {...}) с подстановкой $arResult["ID"] и $arResult["PRICES"].
AddToCart — проблемнее. Добавление в корзину в Битриксе идёт через AJAX-запрос к sale.basket.basket или напрямую через CSaleBasket::Add(). Событие пикселя нужно стрелять в колбэке JS после успешного ответа. В ядре Битрикса за добавление в корзину отвечает событие OnSaleBasketItemAdd — его можно использовать для серверной передачи через Conversions API, но это отдельная история.
Purchase — срабатывает на странице thank_you или в компоненте bitrix:sale.order.ajax после успешного оформления. В $arResult["ORDER_ID"] есть ID заказа, сумму берёте из CSaleOrder::GetByID().
Conversions API как дополнение к пикселю
Браузерный пиксель теряет данные из-за блокировщиков рекламы и iOS-ограничений. Facebook рекомендует дублировать события через серверный Conversions API. Запрос уходит с вашего сервера на graph.facebook.com/v18.0/<pixel_id>/events с токеном доступа.
В Битриксе это реализуется через CURLFile или стандартный \Bitrix\Main\Web\HttpClient. Вешаете обработчик на событие OnSaleOrderSaved и отправляете Purchase с хешированным email (sha256) и event_id для дедупликации с браузерным событием.
Модуль bitrix.main версии 22+ включает \Bitrix\Main\Web\HttpClient — используйте его, а не file_get_contents, чтобы не зависеть от конфигурации allow_url_fopen.
Проверка работоспособности
После настройки проверяйте через Facebook Pixel Helper (расширение Chrome) и через Events Manager в кабинете Facebook — вкладка «Тестирование событий». В тестовом режиме Conversions API видно реальный разбор payload с ошибками валидации.
Типичная проблема: событие дублируется дважды — браузерное и серверное приходят без event_id. Без дедупликации Facebook считает их двумя разными конверсиями. event_id должен быть одинаковым в JS-вызове fbq('track', 'Purchase', data, {eventID: 'order_123'}) и в серверном запросе.







