Не получается выгрузить бренды из 1С
Инструкция и приведенные в ней фрагменты кода приведены для сайтов, установленных не в режиме многосайтовости. Если вам необходимо настроить выгрузку брендов из 1С для интернет-магазина с многосайтовостью, необходимо заказать индивидуальную доработку проекта.
Важно! Инструкция предназначена для пользователей с уровнем знания PHP не ниже среднего. Если вы не владеете достаточными для этого знаниями и навыками, стоит заказать индивидуальную доработку решения. Статья в том числе актуальна для сайтов, обновленных до версии PHP 8.1.
Если вы хотите, чтобы бренды выгружались из 1С и автоматически синхронизировались с системой, необходимо отредактировать файл init.php, который находится в папке /bitrix/php_interface. Если файл отсутствует, создайте его и загрузите в указанную папку, а затем отредактируйте содержимое файла, прописав в нем фрагмент кода. Этот код позволит синхронизировать свойство загружаемого из 1С со свойством BRAND у решения.
Внимание! При проведении работ с настройками инфоблока запрещается удалять служебное свойство BRAND. В противном случае корректная работа функционала будет нарушена.

Если выгрузка из 1С производится в новый инфоблок, необходимо создать это свойство вручную, сохранив соответствующие настройки (см. скриншот выше). После создания свойства перейдите в его настройки, чтобы привязать свойство BRAND к нужному инфоблоку.

Настоятельно рекомендуем вносить изменения через ftp и ни в коем случае не создавать файл init.php в структуре сайта инструментами 1С-Битрикс. Некорректный ввод или кастомизация кода приведет к полной потере работоспособности сайта. Прежде чем кастомизировать решение, обязательно проведите резервное копирование.
Пример кода:
<?php// поместить этот скрипт в init.php
AddEventHandler("iblock", "OnAfterIBlockElementAdd", array("aspro_import", "FillTheBrands"));
AddEventHandler("iblock", "OnAfterIBlockElementUpdate", array("aspro_import", "FillTheBrands"));
class aspro_import
{
static function FillTheBrands($arFields)
{
$arCatalogID = array(29); // ID инфоблока каталога
$numBrandsID = 157; // ID инфоблока брендов Аспро
$oldBrandsCode = 'BREND'; // символьный код свойства брендов, откуда будет взято название для создания нового бренда
if (in_array($arFields['IBLOCK_ID'], $arCatalogID)) {
$arItem = CIBlockElement::GetList(false, array('IBLOCK_ID' => $arFields['IBLOCK_ID'], 'ID' => $arFields['ID']), false, false, array('ID', 'PROPERTY_' . $oldBrandsCode))->fetch();
if ($arItem['PROPERTY_' . $oldBrandsCode . '_VALUE']) {
$arBrand = CIBlockElement::GetList(false, array('IBLOCK_ID' => $numBrandsID, 'NAME' => $arItem['PROPERTY_' . $oldBrandsCode . '_VALUE']))->fetch();
if ($arBrand) {
CIBlockElement::SetPropertyValuesEx($arFields['ID'], false, array('BRAND' => $arBrand['ID']));
} else {
$el = new CIBlockElement;
$arParams = array("replace_space" => "-", "replace_other" => "-");
$id = $el->Add(array(
'ACTIVE' => 'Y',
'NAME' => $arItem['PROPERTY_' . $oldBrandsCode . '_VALUE'],
'IBLOCK_ID' => $numBrandsID,
'CODE' => Cutil::translit($arItem['PROPERTY_' . $oldBrandsCode . '_VALUE'], "ru", $arParams)
));
if ($id) {
CIBlockElement::SetPropertyValuesEx($arFields['ID'], false, array('BRAND' => $id));
} else {
echo $el->LAST_ERROR;
}
}
}
}
}
}
В коде необходимо задать значения 3-м переменным:

-
значение ID инфоблока каталога (переменная $arCatalogID) — соответствует ID инфоблока каталога вашего магазина. Узнать значение ID можно, к примеру, в настройках инфоблока каталога

-
Значение ID инфоблока брендов Аспро (переменная $numBrandsID). Значение ID инфоблока указан в соответствующих настройках в инфоблоке контента

-
Символьный код свойства брендов (переменная $oldBrandsCode). Перейдите в список свойств инфоблока и найдите нужное свойство, выгруженное из 1С, которое соответствует значению брендов. В нашем случае значение символьного кода — BREND, у вас может быть другое. Скопируйте его. Также обратите внимание на тип свойства — нужно выбрать вариант «Строка».

Внимание! Для корректной работы сайта проверьте, заключен ли ваш код в специальные теги — в самом начале кода файла и в самом конце.
Выглядеть должно так:

При выгрузке вы можете столкнуться с ошибкой «Элемент с таким символьным кодом уже существует». Скорее всего, у вас в 1С есть бренды, отличающиеся только специальным символом или регистром. У них генерируется одинаковый символьный код, и возникает ошибка. Устранить ее можно двумя способами: скорректировать название бренда или изменить метод транслитерации под свой проект. Во втором способе вам поможет документация 1С-Битрикс.



Возможно пригодиться тем кто использует выгрузку товаров в инфоблок "Товарный каталог CRM" через модуль "Коннектор к Битрикс24".
Выгрузка брендов работает после подмены Идентификаторов объектов в 1С.
Подразумевается что у вас уже настроен обмен товарами.
Что бы бренды при выгрузке привязывались к товарам, требуется:
1. На стороне Битрикс заполнить информацию о брендах.
(необходимо для получения ID)
2. На стороне 1С в справочнике Номенклатура создать Дополнительное сведение с Типом значения - Дополнительное значение.
Заполнить Значения наименованиями брендов.
(сопоставлением с брендами происходить не по наименование. Поэтому наименования могут отличаться)
3. Внести измени в любую Номенклатуру с указанием|выбором Бренда в Дополнительных сведениях.
4. Запустить обмен между 1С и Битрикс (делаем для присвоения идентификаторов брендам заведенным в 1С)
5. В 1С открываем Значение (наш бренд) Дополнительного сведения и открываем вкладку Идентификаторы Битрикс24
Открываем Значение свойства товара.
Заменяем записанный Идентификатор на ID бренда из инфоблока Бренды.
Записать и Закрыть.
Алексей, здравствуйте!
Благодарим за активность в комментариях. У вас получилось подробная инструкция. Думаем, что она поможет пользователям в будущем.
Желаем хорошего дня!
а есть решения для выгрузки товаров с брендами из CSV?
Иван, добрый день! Благодарим за комментарий.
Рекомендуем для получения ответа на вопрос написать в техническую поддержку:Будем ждать вашу заявку. До свидания!
Справочник Брендов заполнился производителями из 1С и отображается в пункте меню Бренды в полном объеме.
А вот у товаров заполняется только на один товар от любого Бренда/Производителя, то есть только один Товар одного Бренда/Производителя, в остальных товарах Бренд не заполняется, о чем и сообщается при выгрузке, что такой значение уже есть на сервере.
Пробовал менять id Каталога Товаров на Торговые предложения - не помогло.
То есть, проблема не в том что указана в статье, что есть похожие Бренды и из надо по разному транслитерировать, а в том, что остальным, кроме одного/первого товарам не записыват значение Бренд.
Семен, здравствуйте!
Понимаем, что не всегда получается решить проблему самостоятельно. В базе знаний мы стараемся дать общий вариант исправления неполадок, но каждый сайт индивидуален, так как может бесконечно дорабатываться.
Для устранения ошибки советуем обратиться в техподдержку:
Специалисты проанализируют ваш сайт и найдут индивидуальное решение.
Ждем вашу заявку. Желаем успехов вашему бизнесу!
В коде нужно из строчки "static function FillTheBrands( $arFields ){" убрать слово "static". И тогда всё нормально заработает.
Также НЕ НУЖНО выполнять это: "Также обратите внимание на тип свойства – нужно выбрать вариант «Строка».
У меня из 1с бренды летят списком. В случае если поставить "строка", то при выгрузке создастся новое свойство бренд с символьным кодом типа BREND_1.
То есть всё работает даже если из 1С тип свойства "список".
Здравствуйте, Шамиль! Благодарим за замечание.
Отметим, что ваши инструкции применимы, если сайт не обновлен до версии PHP 8.1. Вариант в статье как раз относится к этой версии. Добавили об этом в примечании.
Спасибо за вашу активность. Хорошего дня!