Интеграция 1С-Битрикс с Google Shopping Ads

Наша компания занимается разработкой, поддержкой и обслуживанием решений на Битрикс и Битрикс24 любой сложности. От простых одностраничных сайтов до сложных интернет магазинов, CRM систем с интеграцией 1С и телефонии. Опыт разработчиков подтвержден сертификатами от вендора.
Предлагаемые услуги
Показано 1 из 1 услугВсе 1626 услуг
Интеграция 1С-Битрикс с Google Shopping Ads
Средняя
~1-2 недели
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1177
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    811
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    Разработка на базе Битрикс, Битрикс24, 1С для компании Development of an Online Appointment Booking Widget for a Medical Center
    564
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Разработка на базе 1С Предприятие для компании МИРСАНБЕЛ
    747
  • image_crm_dolbimby_434_0.webp
    Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    655
  • image_crm_technotorgcomplex_453_0.webp
    Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    976

Интеграция 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>Электроника &gt; Смартфоны</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 дня