Настройка 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. Получите консультацию по вашему проекту — оценим объём работ и сроки. Свяжитесь с нами, чтобы обсудить детали.







