Заполнение габаритов товара, после обмена с 1С, из свойств элемента инфоблока.

Просмотров: 18452

Если Ваш интернет-магазин интегрирован с 1С, скорее всего столкнулись с такой проблемой: 1С не умеет выгружать параметры товара: Вес, Ширина, Высота, Глубина.

Но эти параметры нужны для служб доставки, таких как Почта России, DHL и прочих. И желательно, что бы они были именно в параметрах товара модуля торгового каталога.

Заполнить их достаточно просто, для этого понадобиться создать дополнительные реквизиты в 1С с этими параметрами и воспользоваться методом API CCatalogProduct::Update

Заполняем параметры из свойств

Итак: мы создали доп реквизиты Вес, Ширина, Высота, Глубина в 1С, заполнили их и обменялись с сайтом. Теперь на сайте есть свойства ATT_WEIGHT, ATT_WIDTH, ATT_HEIGHT, ATT_LENGTH

Пишем простенький скрипт, который просто получит все элементы из инфоблока с каталогом (в примере, его ID = 15), с отбором данных свойств.

$addProps = CIBlockElement::GetList (
Array("ID" => "ASC"),
Array("IBLOCK_ID" => 15),
	false,
	false,
	Array(
		'ID',
		'PROPERTY_ATT_WEIGHT',
		'PROPERTY_ATT_WIDTH',
		'PROPERTY_ATT_HEIGHT',
		'PROPERTY_ATT_LENGTH'
	)
);
while($ar_fields = $addProps->GetNext())
{
	echo 'ID' . $ar_fields['ID'] .' / ';
	echo 'Вес:' . $ar_fields['PROPERTY_WEIGHT_VALUE'].' / ';
	echo 'Длина:' . $ar_fields['PROPERTY_DLINA_VALUE'].' / ';
	echo 'Ширина:' . $ar_fields['PROPERTY_SHIRINA_VALUE'].' / ';
	echo 'Высота:' . $ar_fields['PROPERTY_VYSOTA_VALUE'].'

'; } endif;

Если запустить этот скрипт, просто получим вывод всех товаров каталога с указанием ID элемента и наших свойств.

Зная эти свойства, просто загоняем их значения в стандартные поля торгового каталога, методом CCatalogProduct::Update

$addProps = CIBlockElement::GetList (
Array("ID" => "ASC"),
Array("IBLOCK_ID" => 15),
	false,
	false,
	Array(
		'ID',
		'PROPERTY_ATT_WEIGHT',
		'PROPERTY_ATT_WIDTH',
		'PROPERTY_ATT_HEIGHT',
		'PROPERTY_ATT_LENGTH'
	)
);
while($ar_fields = $addProps->GetNext())
{
	echo 'Товару с ID-' . $ar_fields['ID'] .' установлены параметры';
	echo 'Вес:' . $ar_fields['PROPERTY_ATT_WEIGHT_VALUE'].' / ';
	echo 'Длина:' . $ar_fields['PROPERTY_ATT_WIDTH_VALUE'].' / ';
	echo 'Ширина:' . $ar_fields['PROPERTY_ATT_HEIGH_VALUET'].' / ';
	echo 'Высота:' . $ar_fields['PROPERTY_ATT_LENGTH_VALUE'];
	
	Cmodule::IncludeModule('catalog');
	$PRODUCT_ID = $ar_fields['ID'];
	$arFields = array(
		'WEIGHT' => $ar_fields['PROPERTY_ATT_WEIGHT_VALUE'],
		'WIDTH' => $ar_fields['PROPERTY_ATT_WIDTH_VALUE'],
		'HEIGHT' => $ar_fields['PROPERTY_ATT_HEIGHT_VALUE'],
		'LENGTH' => $ar_fields['PROPERTY_ATT_LENGTH_VALUE']
	);
	CCatalogProduct::Update($PRODUCT_ID, $arFields);
}
endif;

В примере, вывод с небольшой свисто-перделкой- он выводит уведомление об установке параметров. Можно этого не делать, просто вывести echo 'Параметры успешно установлены';

Данный скрипт, подразумевает, что Вы будете запускать его в ручную, по необходимости. Это оптимально, если в каталоге не высокая текучка товаров и параметры товаров не меняются постоянно.

Само собой, можете добавить его в init.php дабы скрипт срабатывал на событиях
OnAfterIBlockElementUpdate - обновление элемента
OnAfterIBlockElementAdd - добавление элемента
Что повысит время обмена с 1С и в целом, нагрузку на сервер. Лучше повесить скрипт на агента, что бы срабатывал с некоторой переодичностью (раз в сутки, например). На врядли габариты товаров меняются постоянно и при каждом обмене.

Дополнение: Если 1С выгружает габариты в множественное свойство "Реквизиты"

Если ваша 1С выгружает габариты товаров в множественное свойство "Реквизиты" (пример на скрине):

Можно также получить данные цифры методом CIBlockElement::GetProperty а дальше заполнить штатные поля товара способом выше

Пример кода (в данном случае, нужно было еще и перевести сантиметры в миллиметры):

CModule::IncludeModule('iblock');
Cmodule::IncludeModule('catalog');
$iBlockID = 5; // ID инфоблока с товарами
$addProps = CIBlockElement::GetList(
    Array("ID" => "ASC"),
    Array("IBLOCK_ID" => $iBlockID), 
    false,
    false,
    Array(
        'ID',
    )
);
while ($ar_fields = $addProps->Fetch()) {
    $VALUES = array(); // создаем пустой массив
    $db_props = CIBlockElement::GetProperty(
    	$iBlockID, 
    	$ar_fields['ID'], 
    	array("sort" => "asc"), 
    	Array("CODE" => "CML2_TRAITS") // код свойства с реквизитами
    );
    while ($ar_props = $db_props->Fetch()) {
        $VALUES[] = $ar_props['VALUE']; // наполняем массив
    }
    $arFields = array(
    	// Берем габариты из значений массива (у вас могут быть другие номера
        'WIDTH' => $VALUES['3'] * 10,
        'HEIGHT' => $VALUES['4'] * 10,
        'LENGTH' => $VALUES['5'] * 10;
    );
    CCatalogProduct::Update($ar_fields['ID'], $arFields);
    echo "Габариты для " . $ar_fields['ID'] . " применены";
    $arFields = array();
}

Небольшое пояснение к происходяему в скрипте:

  • От метода CIBlockElement::GetList нам нужен только ID товара. Поэтому используем Fetch (работает быстрее).
  • Методом CIBlockElement::GetProperty получили значения свойства CML2_TRAITS и наполниили ими массив $VALUES.
  • В массив $arFields передали элементы массива $VALUES со значениями габаритов (рапечатайте print_r($VALUES), что бы увидеть свои).
  • Массив $VALUES принудительно создается именно в нутри цикла, что бы очищался при каждой итерации

Стоимость разработки на 1С-Битрикс:

Индивидуальная разработка магазина

от 500 000 руб. от 5-ти недель

Разработка магазина на 1С-Битрикс с нуля. Дизайн, сборка и оптимизация производительности под конкретный проект и требования. Реализация любого функционала без ограничений готовых решений.

Запуск сайта на готовом решении

от 150 000 руб. от 7-ми дней

Вариант для тех, кто не хочет тратить много средств на индивидуальный проект, и не имеет серьезных требований к сайту. Магазин, быстро запускается на базе одного из 200-та готовых решений.

Мобильное приложение

от 550 000 руб. от 5-ти недель

Разработка кроссплатформенного мобильного приложения, которое не уступает нативным решениям как в производительности, так и пользовательском опыте. Публикуется в AppStore, GooglePlay и RuStore

Сайт компании

от 300 000 руб. от 2-х недель

Корпоративный сайт с информационными разделами, каталогом товаров или услуг. Включает формы обратной связи карточек каталога, любое количество статичных и динамичных разделов.

Инфоресурс

от 300 000 руб. от 4-х недель

Информационный ресурс любой сложности. Сайт для СМИ, городской портал или многопользовательская доска объявлений. Внутренние форумы, блоги- по необходимости.

3D‑моделирование, визуализация

от 25 000 руб. от 3-х дней

По вашим фото, чертежам или описанию создадим 3D‑модели и отрендерим набор изображений для каталога товаров: общий вид, крупные планы и технические ракурсы или 360°‑обзор товара.