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

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

Если Ваш интернет-магазин интегрирован с 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'],
		'HEIGH' => $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С и в целом, нагрузку на сервер

Либо добавить скрипт в крон, на выполнение по расписанию. Для совсем больших магазинов, можно создать своего агента. Но, данной заметкой, надеюсь, дал наводку.