Бренды не выгружаются из 1С в Битрикс: почему так и как настроить синхронизацию
Товары из 1С выгружаются, а поле бренда в карточке остаётся пустым и страницы производителей стоят без товаров. Это не сбой обмена: бренд в решениях Аспро — привязка к элементу другого инфоблока, а обмен по CommerceML такие связи сам не устанавливает.
Содержание
Почему бренды не переносятся автоматически
В решениях Аспро бренды — это отдельный инфоблок. У товара за производителя отвечает служебное свойство BRAND с типом «привязка к элементам инфоблока»: в нём хранится не название, а ID элемента из каталога брендов.
Такая схема даёт страницы брендов с описанием, логотипом и списком товаров производителя. Но она же объясняет проблему: обмен по CommerceML передаёт из 1С название бренда как значение свойства, а сопоставить его с элементом инфоблока брендов и подставить ID обмен не может. В результате после выгрузки строковое свойство заполнено, а BRAND пуст.
BRAND удалять нельзя ни при каких обстоятельствах — на нём завязан весь раздел брендов решения. Если оно пропало, восстановите его с прежним символьным кодом и типом.Что нужно подготовить перед настройкой
- Причесать справочник в 1С. Названия брендов должны быть единообразными: без лишних пробелов, в одном регистре и написании. Каждое расхождение станет отдельной карточкой бренда на сайте.
- Определить, куда 1С кладёт название. Обычно это строковое свойство каталога с кодом вида
BREND,PROIZVODITEL,MANUFACTURER. Посмотрите в карточке выгруженного товара, какое свойство заполняется. - Узнать ID инфоблоков. ID каталога товаров и ID инфоблока брендов: *Контент → Инфоблоки → Типы инфоблоков*, ID виден в списке.
- Проверить свойство BRAND. Оно должно существовать в каталоге, иметь тип «привязка к элементам» и указывать на инфоблок брендов. Если каталог создан обменом с нуля — свойство нужно создать вручную с такими же настройками.
- Снять бэкап файлов и базы и развернуть тестовую площадку. Ошибка в
init.phpкладёт весь сайт целиком.
Решение: обработчик события
Логика простая: после того как обмен создал или обновил товар, обработчик читает название бренда из строкового свойства, находит соответствующий элемент в инфоблоке брендов (а если его нет — создаёт) и проставляет ID в свойство BRAND.
Код размещается в /local/php_interface/init.php (или /bitrix/php_interface/init.php, если папка /local на проекте не используется). Загружать файл нужно по FTP или SSH — не создавайте init.php через файловый менеджер админки.
AddEventHandler('iblock', 'OnAfterIBlockElementAdd', ['ArtgkBrandSync', 'handle']);
AddEventHandler('iblock', 'OnAfterIBlockElementUpdate', ['ArtgkBrandSync', 'handle']);
class ArtgkBrandSync
{
const CATALOG_IBLOCK_ID = 29; // ID инфоблока каталога товаров
const BRANDS_IBLOCK_ID = 157; // ID инфоблока брендов решения
const SOURCE_PROPERTY = 'BREND'; // код свойства, куда 1С кладёт название
const TARGET_PROPERTY = 'BRAND'; // служебное свойство-привязка решения
private static $lock = false;
public static function handle(&$arFields)
{
if (self::$lock || (int)$arFields['IBLOCK_ID'] !== self::CATALOG_IBLOCK_ID) {
return;
}
$elementId = (int)$arFields['ID'];
if ($elementId <= 0) {
return;
}
$name = self::getSourceValue($elementId);
if ($name === '') {
return;
}
$brandId = self::findBrand($name);
if ($brandId === 0) {
$brandId = self::createBrand($name);
}
if ($brandId === 0) {
return;
}
self::$lock = true;
CIBlockElement::SetPropertyValuesEx($elementId, false, [self::TARGET_PROPERTY => $brandId]);
self::$lock = false;
}
private static function getSourceValue($elementId)
{
$row = CIBlockElement::GetList(false,
['IBLOCK_ID' => self::CATALOG_IBLOCK_ID, 'ID' => $elementId],
false, false, ['ID', 'PROPERTY_' . self::SOURCE_PROPERTY])->Fetch();
$value = $row['PROPERTY_' . self::SOURCE_PROPERTY . '_VALUE'];
if (is_array($value)) {
$value = reset($value);
}
return trim((string)$value);
}
private static function findBrand($name)
{
$row = CIBlockElement::GetList(false,
['IBLOCK_ID' => self::BRANDS_IBLOCK_ID, '=NAME' => $name, 'ACTIVE' => 'Y'],
false, false, ['ID'])->Fetch();
return $row ? (int)$row['ID'] : 0;
}
private static function createBrand($name)
{
$el = new CIBlockElement();
$id = $el->Add([
'IBLOCK_ID' => self::BRANDS_IBLOCK_ID,
'NAME' => $name,
'ACTIVE' => 'Y',
'CODE' => CUtil::translit($name, 'ru', ['replace_space' => '-', 'replace_other' => '-']),
]);
if (!$id) {
AddMessage2Log('BrandSync: не создан бренд "' . $name . '": ' . $el->LAST_ERROR, 'artgk');
return 0;
}
return (int)$id;
}
}
Что в этом коде важно
- Константы вверху. Четыре значения — ID двух инфоблоков и коды двух свойств. Подставьте свои, больше в коде менять нечего.
- Защита от рекурсии.
SetPropertyValuesExвнутри обработчикаOnAfterIBlockElementUpdateспособен вызвать обработчик повторно. Флаг$lockобрывает цикл. - Точный поиск бренда. Фильтр
=NAMEищет полное совпадение. Без знака равенства Битрикс подставит поиск по подстроке, и «Bosch» найдётся внутри «Bosch Professional». - Обработка массива. Если свойство-источник множественное, берётся первое значение, а не массив целиком.
- Логирование вместо тишины. Неудачное создание бренда пишется в журнал событий, а не пропадает молча.
php -l), но ID инфоблоков и коды свойств у каждого проекта свои. Разверните тестовую площадку, проверьте на ней полный цикл обмена и только потом переносите на боевой сайт.Как проверить, что заработало
- В 1С измените бренд у одного тестового товара и запустите обмен.
- Откройте карточку товара в админке: свойство
BRANDдолжно содержать привязку к элементу каталога брендов. - Проверьте инфоблок брендов: если бренда не было, появился новый элемент с корректным символьным кодом.
- Откройте страницу этого бренда на сайте — товар должен быть в списке.
- Загляните в журнал событий (*Настройки → Инструменты → Журнал событий*): сообщений об ошибках создания брендов быть не должно.
Частые осложнения
| Симптом | Причина | Что делать |
|---|---|---|
| Бренды создаются дублями | Разные написания в 1С | Привести справочник 1С к единому виду, дубли на сайте объединить вручную |
| Свойство BRAND остаётся пустым | Не тот код свойства-источника | Посмотреть в карточке товара, какое свойство реально заполняет обмен |
| Товары теряют бренд после следующего обмена | Обмен очищает свойства, не пришедшие в пакете | Проверить настройки правил обмена в 1С: должна выгружаться полная карточка товара |
| Обмен стал заметно медленнее | Обработчик вызывается на каждый элемент | Ограничить обработчик нужным инфоблоком (в коде это уже сделано) и не делать в нём тяжёлых запросов |
| На многосайтовом проекте бренды попадают не туда | Инфоблок брендов свой у каждого сайта | Нужна доработка с учётом привязки к сайту — типовой обработчик здесь не подходит |
Альтернатива без кода
Если брендов десятки, а обмен идёт раз в неделю, привязку можно поддерживать вручную: отфильтровать в админке товары с пустым BRAND, выделить группу и проставить значение групповой операцией. Это рабочий вариант на старте, но с ростом каталога он перестаёт масштабироваться — тогда возвращайтесь к обработчику.
Частые вопросы
Почему бренд не переносится сам, ведь в 1С он заполнен?
В 1С бренд — обычная строка или элемент справочника, а в решении это свойство типа «привязка к элементу инфоблока». Обмен передаёт значение, но не может сопоставить его с элементом каталога брендов на сайте — эту связь нужно устанавливать отдельно.
Можно ли обойтись без кода?
Частично. Если брендов немного и они меняются редко, привязку можно проставлять вручную или разово через групповые операции в админке. При регулярном обмене и сотнях позиций это нежизнеспособно.
Что будет со свойством BRAND, если его удалить?
Раздел брендов перестанет работать: карточка не покажет производителя, страницы брендов останутся пустыми. Это служебное свойство решения, удалять его нельзя.
Обработчик создаёт бренды сам. Не наплодит ли он дублей?
Дубли появляются, если в 1С название пишут по-разному: «Bosch», «BOSCH », «Бош». Перед запуском приведите справочник в 1С к единому виду, иначе на сайте появятся три карточки одного бренда.
Куда класть код — в /bitrix или в /local?
В /local/php_interface/init.php, если папка /local используется на проекте. Приоритет у /local, и код не пострадает при обновлениях.
Не хотите разбираться сами?
Настроим, обновим и почистим сайт на 1С-Битрикс. Официальный партнёр Битрикс и Аспро, 20 лет в разработке.
Оставить заявку 8 (800) 555-31-56