Настройка Google Tag Manager на 1С-Битрикс
Представьте: маркетолог просит добавить пиксель VK, через неделю — Яндекс.Метрику, потом — цепочку событий для GA4. Каждый раз приходится лезть в код, править шаблоны, выкатывать обновления. Наш опыт показывает: правильная установка Google Tag Manager на 1С-Битрикс решает эту проблему раз и навсегда. Мы настраиваем GTM так, чтобы маркетолог сам управлял тегами через интерфейс, а dataLayer автоматически передавал все данные о покупках, корзинах и просмотрах.
Почему dataLayer обязателен для интернет-магазина?
Без dataLayer GTM — просто пустая оболочка. Вы можете опубликовать тег GA4, но не получите данных о цене товара, категории, ID транзакции. Для интернет-магазина на 1С-Битрикс dataLayer — это мост между событиями на сайте и системами аналитики. Он передаёт структурированные данные: item_id, item_name, price, currency, quantity. GA4, Яндекс.Метрика и другие сервисы ожидают именно такой формат. Если dataLayer настроен неправильно, вы теряете до 30% данных о конверсиях — проверено на десятках проектов.
Типичные ошибки при интеграции GTM в 1С-Битрикс
Хардкод ID контейнера
Часто разработчики вписывают GTM-XXXXXXX прямо в шаблон. При смене контейнера (например, для тестирования или перехода на другой аккаунт) приходится снова редактировать файлы. Мы храним ID в настройках модуля через \Bitrix\Main\Config\Option::set — это позволяет менять ID через админку без деплоя.
Отсутствие тегированного кэширования
1С-Битрикс агрессивно кэширует страницы. Если dataLayer генерируется динамически (например, цена зависит от скидки пользователя), кэш может показать устаревшие данные. Мы используем тегированный кэш и сбрасываем его при изменении цены или остатка. Без этого события view_item могут содержать неверную стоимость — расхождения с реальными заказами доходят до 15%.
Событие purchase только на странице заказа
Многие ограничиваются отправкой purchase в момент оформления. Но нужно также передавать add_to_cart, remove_from_cart, begin_checkout. Без этих событий вы не сможете построить полную воронку в GA4. Мы добавляем все ключевые события, используя штатные механизмы Битрикс: OnBasketChange, OnOrderSave, OnSalePayOrder.
Как мы настраиваем GTM: пошаговый процесс
- Анализ текущего сайта: проверяем версию Битрикс, кэширование, установленные модули, тип торгового каталога.
- Проектирование dataLayer: составляем карту событий (просмотр товара, добавление в корзину, оформление, покупка) и согласовываем с маркетологом.
- Разработка и интеграция: добавляем код установки GTM в шаблон, пишем result_modifier для компонентов каталога и корзины, реализуем серверную генерацию dataLayer для событий после оплаты.
- Тестирование: проверяем каждое событие через Tag Assistant и консоль браузера, сверяем данные с реальными заказами из 1С.
- Деплой и документация: заливаем на боевой сервер, отдаём клиенту инструкцию по работе с GTM.
Пример реализации: установка GTM и dataLayer
Установка GTM в шаблон Битрикс
GTM требует два фрагмента кода: один в <head>, второй сразу после <body>. В шаблоне Битрикс (/bitrix/templates/[name]/header.php):
<?php
// ID контейнера GTM из аккаунта Google Tag Manager
$gtmId = \Bitrix\Main\Config\Option::get('custom', 'gtm_container_id', 'GTM-XXXXXXX');
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<!-- GTM в head (как можно раньше) -->
<?php if ($gtmId): ?>
<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','<?= htmlspecialchars($gtmId) ?>');</script>
<?php endif; ?>
</head>
<body>
<!-- GTM noscript сразу после <body> -->
<?php if ($gtmId): ?>
<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=<?= htmlspecialchars($gtmId) ?>"
height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<?php endif; ?>
ID контейнера хранить в b_option (таблица настроек) через административный интерфейс — не в коде, чтобы маркетолог мог менять без деплоя.
dataLayer для страниц товара
Для работы расширенной электронной торговли (GA4 Ecommerce) нужен dataLayer с данными товара. В шаблоне компонента bitrix:catalog.element или в result_modifier.php:
// bitrix/templates/.default/components/bitrix/catalog.element/.default/result_modifier.php
if (!empty($arResult['CATALOG_PRICE']['BASE']['PRICE'])) {
$product = [
'item_id' => $arResult['ID'],
'item_name' => $arResult['NAME'],
'price' => (float)$arResult['CATALOG_PRICE']['BASE']['PRICE'],
'currency' => $arResult['CATALOG_PRICE']['BASE']['CURRENCY'],
'item_category' => $arResult['SECTION']['NAME'] ?? '',
'item_brand' => $arResult['PROPERTIES']['BRAND']['VALUE'] ?? ''
];
$this->arResult['GTM_PRODUCT'] = $product;
}
В шаблоне компонента вывести dataLayer перед закрывающим </body>:
<?php if (!empty($arResult['GTM_PRODUCT'])): ?>
<script>
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({
event: 'view_item',
ecommerce: {
currency: '<?= htmlspecialchars($arResult['GTM_PRODUCT']['currency']) ?>',
value: <?= (float)$arResult['GTM_PRODUCT']['price'] ?>,
items: [<?= json_encode($arResult['GTM_PRODUCT'], JSON_UNESCAPED_UNICODE) ?>]
}
});
</script>
<?php endif; ?>
Событие purchase после оплаты
Самое важное событие — факт покупки. В компоненте bitrix:sale.order.ajax или на странице «Спасибо за заказ»:
<?php
// Получить последний заказ текущего пользователя
$orderId = (int)($_SESSION['SALE_ORDER_ID_REDIRECTED'] ?? 0);
if ($orderId > 0) {
$order = \Bitrix\Sale\Order::load($orderId);
if ($order) {
$items = [];
foreach ($order->getBasket() as $basketItem) {
$items[] = [
'item_id' => $basketItem->getProductId(),
'item_name' => $basketItem->getField('NAME'),
'price' => (float)$basketItem->getPrice(),
'quantity' => (int)$basketItem->getQuantity()
];
}
?>
<script>
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({
event: 'purchase',
ecommerce: {
transaction_id: '<?= $order->getId() ?>',
value: <?= (float)$order->getPrice() ?>,
currency: '<?= $order->getCurrency() ?>',
items: <?= json_encode($items, JSON_UNESCAPED_UNICODE) ?>
}
});
</script>
<?php
}
}
?>
Добавление в корзину через JS
Событие add_to_cart генерируется в JavaScript при клике на кнопку «Добавить в корзину». Перехватить стандартное событие Битрикс:
// В шаблоне или в /local/templates/.default/js/analytics.js
BX.addCustomEvent('OnBasketChange', function(event) {
if (event.action === 'ADD') {
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({
event: 'add_to_cart',
ecommerce: {
currency: event.currency || 'RUB',
value: event.price * event.quantity,
items: [{
item_id: String(event.productId),
item_name: event.productName || '',
price: event.price,
quantity: event.quantity
}]
}
});
}
});
Событие OnBasketChange генерируется модулем sale через BX.Event при AJAX-добавлении в корзину.
Как проверить работоспособность dataLayer?
В браузере установить расширение «Tag Assistant» от Google. Оно покажет какие теги GTM сработали, с какими данными и были ли ошибки в dataLayer. Или через консоль браузера выполните console.table(window.dataLayer) для просмотра всех событий.
Хранение ID контейнера
Не хардкодить GTM ID в шаблоне — использовать b_option:
// Запись через API
\Bitrix\Main\Config\Option::set('custom', 'gtm_container_id', 'GTM-XXXXXXX');
// Чтение
$gtmId = \Bitrix\Main\Config\Option::get('custom', 'gtm_container_id');
Это позволяет менять ID без правки кода через административный интерфейс или через настройки кастомного модуля.
Сравнение подходов: хардкод против настройки через dataLayer
| Критерий | Хардкод скриптов | GTM + dataLayer |
|---|---|---|
| Время внесения изменений | 1-2 часа (правка кода, деплой) | 5 минут (через интерфейс GTM) |
| Зависимость от разработчика | Каждый раз | Только при старте |
| Ошибки в данных | Часто (путают валюту, ID) | Редко (dataLayer формируется Битриксом) |
| Поддержка GA4 Ecommerce | Требует отдельной реализации | Встроена через dataLayer |
Настройка GTM через dataLayer в 3 раза сокращает время на добавление новых тегов и исключает ошибки, связанные с ручным копированием кода.
События dataLayer и их триггеры
| Событие | Триггер | Данные |
|---|---|---|
view_item |
Просмотр страницы товара | item_id, name, price, category |
add_to_cart |
AJAX-добавление в корзину | item_id, name, price, quantity |
remove_from_cart |
AJAX-удаление из корзины | item_id, name, price, quantity |
begin_checkout |
Переход к оформлению | items, value |
purchase |
Успешная оплата | transaction_id, value, items |
Что входит в результат
- Установка GTM в шаблон с хранением ID в настройках.
- Интеграция dataLayer для событий:
view_item,add_to_cart,remove_from_cart,begin_checkout,purchase. - Настройка тегированного кэширования для динамических данных.
- Проверка через Tag Assistant и консоль.
- Документация по добавлению новых тегов в GTM.
- Гарантия корректной передачи данных в течение 30 дней.
Почему стоит доверить настройку профессионалам?
Мы специализируемся на 1С-Битрикс и GTM более 5 лет, реализовали интеграцию для 50+ интернет-магазинов. Наши инженеры сертифицированы по Битрикс и Google Analytics. Мы учитываем особенности кэширования, торговых предложений, скидок и обмена с 1С через CommerceML. Получите консультацию по вашему проекту — оценим объём работ и сроки. Свяжитесь с нами, чтобы обсудить детали.







