AI-команда NEW
Для клиентов →
Позвонить
Главная/База знаний/Обмен с 1С/Бренды не выгружаются из 1С в Битрикс: почему так и как настроить синхронизацию
Навигация по базе знаний
Все статьи базы
Разделы
По решению
Интернет-магазины
Корпоративные сайты
Модули и сервисы
Платформа
Документация по решениям

Пошаговые руководства по настройке решений Аспро — от установки до запуска.

Открыть документацию
Не нашли ответ?

Разберём вашу задачу и добавим статью.

Написать нам
Обмен с 1С

Бренды не выгружаются из 1С в Битрикс: почему так и как настроить синхронизацию

Создана 20 авг 2026 · обновлена 24 авг 2026Чтение ~6 мин

Товары из 1С выгружаются, а поле бренда в карточке остаётся пустым и страницы производителей стоят без товаров. Это не сбой обмена: бренд в решениях Аспро — привязка к элементу другого инфоблока, а обмен по CommerceML такие связи сам не устанавливает.

Актуально дляИнтернет-магазины на решениях Аспро с разделом брендов: Маркет, Крутой шоп, Максимум и другие. Нужен доступ по FTP/SSH и уровень PHP не ниже среднего. Для сайтов в режиме многосайтовости требуется отдельная доработка.
Содержание

Почему бренды не переносятся автоматически

В решениях Аспро бренды — это отдельный инфоблок. У товара за производителя отвечает служебное свойство BRAND с типом «привязка к элементам инфоблока»: в нём хранится не название, а ID элемента из каталога брендов.

Такая схема даёт страницы брендов с описанием, логотипом и списком товаров производителя. Но она же объясняет проблему: обмен по CommerceML передаёт из 1С название бренда как значение свойства, а сопоставить его с элементом инфоблока брендов и подставить ID обмен не может. В результате после выгрузки строковое свойство заполнено, а BRAND пуст.

Служебное свойство BRAND удалять нельзя ни при каких обстоятельствах — на нём завязан весь раздел брендов решения. Если оно пропало, восстановите его с прежним символьным кодом и типом.

Что нужно подготовить перед настройкой

  1. Причесать справочник в 1С. Названия брендов должны быть единообразными: без лишних пробелов, в одном регистре и написании. Каждое расхождение станет отдельной карточкой бренда на сайте.
  2. Определить, куда 1С кладёт название. Обычно это строковое свойство каталога с кодом вида BREND, PROIZVODITEL, MANUFACTURER. Посмотрите в карточке выгруженного товара, какое свойство заполняется.
  3. Узнать ID инфоблоков. ID каталога товаров и ID инфоблока брендов: *Контент → Инфоблоки → Типы инфоблоков*, ID виден в списке.
  4. Проверить свойство BRAND. Оно должно существовать в каталоге, иметь тип «привязка к элементам» и указывать на инфоблок брендов. Если каталог создан обменом с нуля — свойство нужно создать вручную с такими же настройками.
  5. Снять бэкап файлов и базы и развернуть тестовую площадку. Ошибка в 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. В 1С измените бренд у одного тестового товара и запустите обмен.
  2. Откройте карточку товара в админке: свойство BRAND должно содержать привязку к элементу каталога брендов.
  3. Проверьте инфоблок брендов: если бренда не было, появился новый элемент с корректным символьным кодом.
  4. Откройте страницу этого бренда на сайте — товар должен быть в списке.
  5. Загляните в журнал событий (*Настройки → Инструменты → Журнал событий*): сообщений об ошибках создания брендов быть не должно.

Частые осложнения

СимптомПричинаЧто делать
Бренды создаются дублямиРазные написания в 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

Мы используем cookie и Яндекс.Метрику для работы сайта и анализа поведения. Нажмите «Принять», чтобы разрешить аналитику. Условия — в политике обработки персональных данных. «Отклонить» — аналитика будет выключена.

Используем cookie и Метрику. Подробнее