Настройка централизованного управления товарным контентом 1С-Битрикс
Когда описания товаров редактируются в нескольких местах одновременно, они рано или поздно расходятся: в каталоге одно название, в YML-фиде другое, в email-рассылке третье. Централизованное управление контентом — это когда описание, фотографии и атрибуты обновляются в одном месте и автоматически распространяются на все каналы.
Проблема: источники дублирования
В типичном магазине на Битрикс контент хранится в:
- Инфоблоке каталога (
b_iblock_element,b_iblock_element_property) - Торговых предложениях (
b_iblock_elementдругого инфоблока) - Сгенерированных XML-фидах (ЯндексМаркет, Google Merchant)
- HL-блоках (доп. характеристики)
- Шаблонных письмах (встроенные описания)
Редактировать в нескольких местах вручную — путь к расхождениям.
Принцип единого источника
Решение — назначить один инфоблок «мастером» и настроить производные каналы на чтение из него. Структура данных не меняется — меняется процесс.
Мастер-инфоблок содержит всё: NAME, DETAIL_TEXT, PREVIEW_TEXT, DETAIL_PICTURE, MORE_PHOTO и все свойства. Ничего не заполняется нигде, кроме этого инфоблока.
Производные каналы читают из мастера:
- YML-фид: генератор читает
CIBlockElement::GetListиз мастер-инфоблока - Google Merchant feed: аналогично
- Email-шаблоны: свойства подставляются из
b_iblock_elementчерез API - Маркетплейсы: выгрузка по расписанию через агент
Настройка единого источника для торговых предложений
Часто описание задаётся у товара-родителя, а у торговых предложений (SKU) нет описания. Чтобы не дублировать:
// В шаблоне карточки товара — получить описание из родителя, если нет своего
$detailText = $arResult['DETAIL_TEXT'];
if (empty($detailText) && $arResult['IBLOCK_TYPE_ID'] === 'offers') {
$parentId = $arResult['PROPERTIES']['CML2_LINK']['VALUE'] ?? null;
if ($parentId) {
$parent = CIBlockElement::GetList(
[], ['ID' => $parentId],
false, false, ['DETAIL_TEXT']
)->Fetch();
$detailText = $parent['DETAIL_TEXT'] ?? '';
}
}
Контроль полноты заполнения (completeness)
Чтобы товар не выходил в продажу с незаполненными полями, добавляем проверку перед активацией:
AddEventHandler('iblock', 'OnBeforeIBlockElementUpdate', function(&$fields) {
if ($fields['IBLOCK_ID'] !== CATALOG_IBLOCK_ID) return;
if ($fields['ACTIVE'] !== 'Y') return;
$required = ['NAME', 'DETAIL_TEXT', 'PREVIEW_PICTURE'];
foreach ($required as $field) {
if (empty($fields[$field])) {
$fields['ACTIVE'] = 'N';
// Логируем незаполненный товар
\Bitrix\Main\Diag\Debug::writeToFile(
"Product {$fields['ID']} missing field {$field}",
'',
'/local/logs/content-completeness.log'
);
return;
}
}
// Проверка обязательных свойств
$requiredProps = ['BRAND', 'CML2_ARTICLE'];
foreach ($requiredProps as $propCode) {
if (empty($fields['PROPERTY_VALUES'][$propCode])) {
$fields['ACTIVE'] = 'N';
return;
}
}
});
Инструмент массового обновления контента
Для обновления описаний у сотен товаров — массовое редактирование через стандартный список элементов инфоблока в административной части. Включить колонки для редактирования: Административный раздел → Инфоблоки → Список элементов → Настройка столбцов.
Для загрузки описаний из файла CSV/XLSX — кастомный импортёр:
// /local/admin/import-content.php
// Формат CSV: ID_товара;Описание;Краткое_описание
$file = new SplFileObject($_FILES['csv']['tmp_name'], 'r');
$file->setFlags(SplFileObject::READ_CSV | SplFileObject::SKIP_EMPTY);
$file->setCsvControl(';');
$el = new CIBlockElement();
foreach ($file as $row) {
[$productId, $detailText, $previewText] = $row;
if (!(int)$productId) continue;
$el->Update((int)$productId, [
'DETAIL_TEXT' => trim($detailText),
'DETAIL_TEXT_TYPE' => 'html',
'PREVIEW_TEXT' => trim($previewText),
]);
}
Сброс кешей при обновлении контента
После массового обновления описаний кеши страниц нужно сбросить. Тег кеша для инфоблока — iblock_id_{$iblockId}:
// Сброс всего кеша инфоблока
\Bitrix\Main\Data\TaggedCache::clearByTag('iblock_id_' . CATALOG_IBLOCK_ID);
// Или точечный сброс по элементу
\Bitrix\Main\Data\TaggedCache::clearByTag('iblock_element_' . $productId);
Если используется CDN или внешнее кеширование (Varnish, nginx proxy_cache) — нужен отдельный механизм инвалидации через API CDN-провайдера.
Настройка централизованного управления контентом — это в первую очередь соглашение о процессах и несколько технических барьеров (обработчики событий + права доступа). Реализация занимает 3–7 дней в зависимости от количества каналов и сложности проверок полноты.







