Задачка: Каталог наполняется из 1С, но 1С не передает коэффициент единицы измерения (особенность конкретной 1С, а вообще она умеет). Вместо этого, коэффициенты забиваются в обычный, дополнительный реквизит и приходят на сайт как свойство.
Для нормальной работы каталога и корзины (ввод количества товара по коэффициенту), дабы не городить огород и не переписывать, по отдельности шаблоны каталога (списка, топа, карточки) и корзины - просто скопируем коэффициенты из свойства в поле торгового каталога.
Скрипт для запуска в ручную, по крону или на событие в init.php:
Cmodule::IncludeModule('iblock');
Cmodule::IncludeModule('catalog');
$iblockId = 4;
$updateElements = CIBlockElement::GetList(
array("ID" => "ASC"),
array("IBLOCK_ID" => $iblockId),
false,
false,
array(
'ID',
'PROPERTY_ATT_COEFFFICIENT'
)
);
while ($arFields = $updateElements ->GetNext()) {
$coeff = $arFields['PROPERTY_ATT_COEFFFICIENT_VALUE'];
$curElementRatio = CCatalogMeasureRatio::getList(
false,
array(
'IBLOCK_ID' => $iblockId,
'PRODUCT_ID' => $arFields['ID']),
false,
false);
while ($arRatio = $curElementRatio->GetNext()) {
$ratioId = $arRatio['ID'];
}
CCatalogMeasureRatio::update($ratioId, array(
'PRODUCT_ID' => $arFields['ID'],
'RATIO' => $coeff
)
);
}
Пояснения:
C помощью CIBlockElement::GetLis - получили элементы инфоблока с ИД 4.
Нам нужны только ID элементов и значение свойства PROPERTY_ATT_COEFFFICIENT
Значение коэффициента загнали в переменную $coeff
Внутри цикла (каждого элемента), с помощью CCatalogMeasureRatio::getList получили ID коэффициента конкретного товара (элемента) и загнали в переменную $ratioId
С помощью CCatalogMeasureRatio::update перезаписали/установили коэффициенты для конкретного товара
PS: Если коэффициентов еще не было (пустые). Можно их создать, тут же в цикле, методом CCatalogMeasureRatio::add с любым значением. И тут же перезаписать. Или сразу добавить с нужным значением.

Цитата |
---|
База Таймень написал: почему-то не работает. блин очень нужно сделать, но не пашет. выполнял в админке в PHP командной строке |
Оттуда не сработеат, нужно модифицировать. Киньте скрипт на любую страницу и откройте ее

Цитата |
---|
Юрий Аликов пишет: не работает,потому что используются данные массива $ar_fields,а нужно $arFields |

Цитата |
---|
Sergey K. пишет: А на какое событие данный скрипт надо вешать? OnAfterIblockUpdate не подходит, MeasureRatio::OnBeforeUpdate срабатывает не по всем товарам. Можно повесить на событие OnCompleteCatalogImport1C в принципе или да, отрабатывать по крону. Еще есть варианты? |
На события элементов или импорт, не очень хорошо, так как увеличивается время импорта.
При небольшом каталоге еще туда сюда.
Еще есть событие очистки кеша, после завершения импорта, то есть скрипт можно запускать в самом конце обмена с 1С, когда она уже завершила работу.
В документации этого события нет и сейчас сходу не найду.
Если не забуду, добавлю в заметку, как подвернется такая задача.