Как заполнить вес и размеры товара в Bitrix?

Добрый день! Столкнулся с проблемой заполнения веса и габаритов товара в Bitrix.
Настроена выгрузка из 1С после которой данные веса и размеров заполняются в реквизиты, также в init.php настроен обработчик на события OnAfterIBlockElementAdd и OnAfterIBlockElementUpdate.
В обработчике формируется массив из данных:
Array
(
[LENGTH] => 23
[WIDTH] => 21
[HEIGHT] => 42
)
И с помощью метода CCatalogProduct::Update($PRODUCT_ID, $arFields); загружаю данные в нужные поля.
Но ничего не происходит. Перелопатил кучу сайтов, где то советуют делать через метод Add (либо добавить его до метода update), тоже попытался, но нет, где-то написано, что элемент не является товаром и нужно его пересохранить, у меня не вышло.

Попробовал до и после метода update вывести свойства товара методом GetByID. До метода данные три свойства пустые, но после они заполнены нужными полями. Казалось бы, что все отработало, но при заходе в товар, свойства пусты. Уже не знаю, что делать и куда смотреть. В документации написано, что данные методы устарели, но вроде как поддерживаются. Заранее спасибо за помощь.
  • Вопрос задан
  • 3645 просмотров
Пригласить эксперта
Ответы на вопрос 2
@vardoLP
Ват ю сэй эбаут май мама?!
Что-то как-то непонятно! Вы из 1с грузите свойства. Зачем вам init.php нужен?
Ответ написан
rpsv
@rpsv
делай либо хорошо, либо никак
Вес должен обрабатываться, проверьте настройки обмена со стороны 1С (можете сам файл выгрузки посмотреть, там в оффере или продукте должен быть тэг вес (не реквизит, а именно тег). Если нет - то проверяйте настройки 1С.

Если танцы с бубном в сторону 1С не помогли, то доработайте со стороны сайта. Для начала вешаться на событие изменения/добавления элемента не стоит, т.к. если товаров много, а обмены частые - то время обмена увеличиться крайне сильно. Повешайтесь на событие окончания обмена и за 1 раз сделайте обновление весов всем товарам.

Обработчик

AddEventHandler("catalog", "OnBeforeCatalogImport1C", "CatalogWeightProcessor::OnBeforeCatalogImport1C");
AddEventHandler("catalog", "OnSuccessCatalogImport1C", "CatalogWeightProcessor::OnSuccessCatalogImport1C");

class CatalogWeightProcessor
{
    protected static $exchangeStart = null;

    public static function OnBeforeCatalogImport1C()
    {
        // запоминаем время начала обмена, чтобы вытащить только обновленные товары
        self::$exchangeStart = time();
    }

    public static function OnSuccessCatalogImport1C()
    {
        Bitrix\Main\Loader::includeModule('iblock');

        $select = [
            'ID',
            'PROPERTY_[вес]',
        ];
        $filter = [
            '=IBLOCK_ID' => "ид каталога",
            '>=TIMESTAMP_X' => Bitrix\Main\Type\DateTime::createFromTimestamp(self::$exchangeStart),
        ];
        $result = CIBlockElement::GetList([], $filter, false, false, $select);
        while ($row = $result->GetNext()) {
            $productId = $row['ID'];
            $weight = (float) $row['PROPERTY_[вес]_VALUE'];
            $result = Bitrix\Catalog\ProductTable::update($productId, [
                'WEIGHT' => $weight,
            ]);
            if (!$result->isSuccess()) {
                $errors = $result->getErrorMessages();
                CEventLog::Add([
                    'SEVERITY' => 'ERROR',
                    'AUDIT_TYPE_ID' => 'exchange1c',
                    'MODULE_ID' => 'catalog',
                    'ITEM_ID' => $productId,
                    'DESCRIPTION' => join(",", $errors),
                ]);
            }
        }
    }
}

Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы