Настройка массовой генерации SEO-тегов 1С-Битрикс
Новый раздел каталога — 3 000 товаров, у каждого нужен уникальный <title>, <meta name="description"> и OG-теги. Писать вручную нецелесообразно. Битрикс поддерживает шаблонную генерацию SEO-полей через встроенный механизм SEO-фильтров, и его возможности достаточно широки для большинства задач.
Где хранятся SEO-поля
SEO-данные элементов инфоблока хранятся в таблице b_iblock_element_iprop (iprop — iblock property). Связь через b_iblock_iprop_template — шаблонные правила для разделов и элементов.
Для отдельных элементов: Карточка товара → вкладка SEO — поля ELEMENT_META_TITLE, ELEMENT_META_KEYWORDS, ELEMENT_META_DESCRIPTION, ELEMENT_PAGE_TITLE.
Шаблонные правила задаются на уровне инфоблока или раздела: Инфоблоки → [инфоблок] → вкладка SEO. В шаблоне используются переменные вида {=this.Name}, {=this.DetailText}, {=this.Property.BRAND.Value}.
Настройка шаблонов через интерфейс
Для большинства каталогов достаточно шаблонных правил без скриптов:
Шаблон title: {=this.Name} купить в Москве — {=this.Property.BRAND.Value}
Шаблон description: {=this.Name} по цене от {=catalog.MinPrice} руб. Быстрая доставка. {=this.PreviewText}
В разделе Инфоблоки → [инфоблок] → Правила для SEO можно задать разные шаблоны для разных разделов каталога — это позволяет учесть специфику категорий без кода.
Переменные, доступные в шаблоне:
| Переменная | Что возвращает |
|---|---|
{=this.Name} |
Название элемента |
{=this.PreviewText} |
Анонсовый текст |
{=this.Property.CODE.Value} |
Значение свойства |
{=catalog.MinPrice} |
Минимальная цена |
{=section.Name} |
Название раздела |
Программная генерация через iPropertyValues
Если шаблонного механизма недостаточно — генерируем SEO-теги скриптом и сохраняем через \Bitrix\Iblock\InheritedProperty\ElementValues:
use Bitrix\Iblock\InheritedProperty\ElementValues;
$iblockId = 10;
$elementsRes = \CIBlockElement::GetList(
[],
['IBLOCK_ID' => $iblockId, 'ACTIVE' => 'Y'],
false,
false,
['ID', 'NAME', 'PREVIEW_TEXT', 'XML_ID']
);
while ($element = $elementsRes->Fetch()) {
// Получаем нужные свойства
$props = \CIBlockElement::GetProperty($iblockId, $element['ID'], [], ['CODE' => ['BRAND', 'COLOR', 'MATERIAL']])->Fetch();
$brand = $props['BRAND_VALUE'] ?? '';
$title = "{$element['NAME']} {$brand} купить с доставкой";
$description = "Купите {$element['NAME']} от {$brand}. " . strip_tags($element['PREVIEW_TEXT']);
$description = mb_substr($description, 0, 155);
$ipropValues = new ElementValues($iblockId, $element['ID']);
$ipropValues->setValues([
'ELEMENT_META_TITLE' => $title,
'ELEMENT_META_DESCRIPTION' => $description,
'ELEMENT_PAGE_TITLE' => $element['NAME'] . ($brand ? " ({$brand})" : ''),
]);
}
ElementValues::setValues() сохраняет данные в b_iblock_element_iprop и автоматически инвалидирует кэш.
Генерация через AI/шаблонизатор
Для более сложных описаний можно передавать данные товара в GPT-совместимый API и записывать результат обратно. Это оправдано, если в каталоге есть технические товары с описаниями из 1С, которые нечитаемы для поисковика.
Принцип тот же: получаем данные элемента → формируем описание → сохраняем через ElementValues::setValues(). Важно: ограничивайте частоту запросов к API и кэшируйте уже обработанные элементы, чтобы повторный запуск не тратил API-квоту.
Проверка уникальности
После генерации полезно проверить, нет ли полных дублей title:
SELECT ELEMENT_META_TITLE, COUNT(*) AS cnt
FROM b_iblock_element_iprop
WHERE IBLOCK_ID = 10
GROUP BY ELEMENT_META_TITLE
HAVING cnt > 1
ORDER BY cnt DESC
LIMIT 50;
Дубли title — это сигнал, что шаблон недостаточно специфичен. Добавьте в шаблон уникализирующее свойство: артикул, цвет, размер.
Сроки выполнения
| Задача | Время |
|---|---|
| Настройка шаблонных правил (без кода) | 2–4 часа |
| Скрипт генерации для каталога до 5 000 товаров | 1 день |
| Генерация с AI-описаниями, 1 000–5 000 товаров | 2–4 дня |







