Интеграция 1С-Битрикс с Google Shopping Ads
Google Shopping показывает товарные объявления с изображением, ценой и названием прямо в поисковой выдаче. Для работы нужна цепочка: Битрикс → Google Merchant Center → Google Ads. Слабое звено — фид: если цены в фиде расходятся с ценами на сайте, Google отклоняет товары и объявления не показываются. Интеграция — это не разовая выгрузка, а автоматическое обновление фида с мониторингом статусов товаров в Merchant Center.
Архитектура интеграции
[Битрикс каталог]
↓
[Генератор фида: PHP-скрипт или модуль]
↓
[XML-фид на хостинге / S3]
↓
[Google Merchant Center: импорт по расписанию]
↓
[Google Ads: товарные кампании]
Фид обновляется на стороне Битрикс, Google Merchant Center забирает его по URL с заданной частотой (раз в 24–72 часа или принудительно через Content API).
Структура Google Shopping фида (Merchant Center)
Google требует формат Google Shopping XML (или TSV). Обязательные поля:
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:g="http://base.google.com/ns/1.0">
<channel>
<title>Мой магазин</title>
<link>https://your-site.ru</link>
<item>
<g:id>PRODUCT-SKU-123</g:id>
<g:title>Название товара (150 симв. макс.)</g:title>
<g:description>Подробное описание для рекламы</g:description>
<g:link>https://your-site.ru/catalog/product-123/</g:link>
<g:image_link>https://your-site.ru/upload/img/product-123.jpg</g:image_link>
<g:price>1990 RUB</g:price>
<g:sale_price>1490 RUB</g:sale_price> <!-- если акция -->
<g:availability>in stock</g:availability>
<g:condition>new</g:condition>
<g:brand>BrandName</g:brand>
<g:gtin>4607086560001</g:gtin> <!-- штрихкод, EAN -->
<g:mpn>ART-0001</g:mpn> <!-- артикул, если нет GTIN -->
<g:product_type>Электроника > Смартфоны</g:product_type>
<g:google_product_category>5032</g:google_product_category>
<g:shipping>
<g:country>RU</g:country>
<g:service>Курьер</g:service>
<g:price>300 RUB</g:price>
</g:shipping>
</item>
</channel>
</rss>
g:google_product_category — числовой ID из таксономии Google (скачивается с support.google.com). Неправильная категория снижает релевантность показа.
Генератор фида из каталога Битрикс
// /local/php_interface/cron/google_shopping_feed.php
define('NO_KEEP_STATISTIC', true);
define('NOT_CHECK_PERMISSIONS', true);
require_once($_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_before.php');
\Bitrix\Main\Loader::includeModule('iblock');
\Bitrix\Main\Loader::includeModule('catalog');
$IBLOCK_ID = 10; // ID каталога
$outputFile = $_SERVER['DOCUMENT_ROOT'] . '/feeds/google_shopping.xml';
$xml = new XMLWriter();
$xml->openUri($outputFile);
$xml->startDocument('1.0', 'UTF-8');
$xml->startElement('rss');
$xml->writeAttribute('version', '2.0');
$xml->writeAttribute('xmlns:g', 'http://base.google.com/ns/1.0');
$xml->startElement('channel');
$xml->writeElement('title', 'Мой магазин');
$xml->writeElement('link', 'https://your-site.ru');
// Запрос элементов каталога
$elements = \CIBlockElement::GetList(
['SORT' => 'ASC'],
[
'IBLOCK_ID' => $IBLOCK_ID,
'ACTIVE' => 'Y',
'!CATALOG_QUANTITY' => 0, // только в наличии
],
false,
false,
['ID', 'NAME', 'DETAIL_PAGE_URL', 'PREVIEW_TEXT', 'DETAIL_TEXT']
);
while ($el = $elements->GetNextElement()) {
$fields = $el->GetFields();
$props = $el->GetProperties();
// Получаем цену
$price = \CPrice::GetBasePrice($fields['ID']);
// Получаем изображение
$image = \CFile::GetPath($fields['PREVIEW_PICTURE'] ?: $fields['DETAIL_PICTURE']);
// Наличие
$productData = \CCatalogProduct::GetByIDEx($fields['ID']);
$availability = ($productData['QUANTITY'] > 0) ? 'in stock' : 'out of stock';
$xml->startElement('item');
$xml->writeElement('g:id', $fields['ID']);
$xml->writeElement('g:title', substr(strip_tags($fields['NAME']), 0, 150));
$xml->writeElement('g:description', substr(strip_tags($fields['PREVIEW_TEXT'] ?: $fields['DETAIL_TEXT']), 0, 5000));
$xml->writeElement('g:link', 'https://your-site.ru' . $fields['DETAIL_PAGE_URL']);
if ($image) {
$xml->writeElement('g:image_link', 'https://your-site.ru' . $image);
}
if ($price) {
$xml->writeElement('g:price', number_format($price['PRICE'], 2, '.', '') . ' ' . $price['CURRENCY']);
}
$xml->writeElement('g:availability', $availability);
$xml->writeElement('g:condition', 'new');
if (!empty($props['BRAND']['VALUE'])) {
$xml->writeElement('g:brand', $props['BRAND']['VALUE']);
}
if (!empty($props['BARCODE']['VALUE'])) {
$xml->writeElement('g:gtin', $props['BARCODE']['VALUE']);
} elseif (!empty($props['ARTICLE']['VALUE'])) {
$xml->writeElement('g:mpn', $props['ARTICLE']['VALUE']);
$xml->writeElement('g:identifier_exists', 'no');
}
$xml->endElement(); // item
}
$xml->endElement(); // channel
$xml->endElement(); // rss
$xml->endDocument();
$xml->flush();
Скрипт запускается через cron раз в 2–4 часа. Файл фида доступен по URL https://your-site.ru/feeds/google_shopping.xml.
Content API: принудительное обновление отдельных товаров
При изменении цены или остатка ждать следующего сканирования фида нецелесообразно — Google может показывать устаревшую цену сутки. Content API позволяет обновить конкретный товар мгновенно:
// composer require google/apiclient
$client = new \Google\Client();
$client->setAuthConfig('/path/to/service-account.json');
$client->addScope(\Google\Service\ShoppingContent::CONTENT);
$service = new \Google\Service\ShoppingContent($client);
$product = new \Google\Service\ShoppingContent\Product([
'offerId' => 'PRODUCT-SKU-123',
'price' => new \Google\Service\ShoppingContent\Price([
'value' => '1490.00',
'currency' => 'RUB',
]),
'availability' => 'in stock',
]);
$service->products->update($merchantId, 'online:ru:RU:PRODUCT-SKU-123', $product);
На событие OnAfterCatalogProductUpdate в Битрикс — вызываем Content API обновление для конкретного товара. Это добавляет ~100–200 мс к сохранению, но цена в Google обновляется в течение нескольких минут.
Типичные причины отклонения товаров в Merchant Center
-
price mismatch— цена в фиде не совпадает с ценой на странице товара. Google сканирует сайт отдельно и сравнивает. Чаще всего — расхождение из-за скидок, которые не отражены в фиде, или кэшированная страница с устаревшей ценой -
missing required attribute [gtin]— нет штрихкода. Для многих категорий GTIN обязателен. Если его нет — добавляемidentifier_exists: no -
image too small— изображение меньше 100×100 px (для одежды — 250×250). Битрикс хранит изображения вupload/, нужно проверить размер оригиналов -
landing page not crawlable— страница товара недоступна для бота Google. Проверяемrobots.txtиnoindex
Сроки разработки
| Этап | Содержание | Срок |
|---|---|---|
| Маппинг полей каталога | Соответствие полей/свойств Битрикс → поля фида | 1 день |
| Генератор фида | PHP-скрипт + cron | 2–3 дня |
| Настройка Merchant Center | Загрузка фида, верификация сайта, налоги/доставка | 1 день |
| Интеграция Content API | Обновление при смене цены/остатка | 2–3 дня |
| Диагностика и исправление ошибок | Устранение причин отклонений | 1–2 дня |







