Телеграм: @bazarow_ru Почта: mihail@bazarow.ru

Наличие на складах в умном фильтре 1С-Битрикс, с автоматическим обновлением

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

Задача: добавить возможность фильтрации товаров по складам в умном фильтре. Данные должны обновляться автоматически, при импорте товаров из 1С.

Отбор по складам в умном фильтре 1С-Битрикс

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

Отбор по складам в умном фильтре 1С-Битрикс
Названия складов, для фильтра, можно задать произвольно. Не обязательно один в один, как названия заданы в модуле магазина.

Связываем склады со свойством инфоблока

Теперь, нужно создать пользовательское поле у складов, тип число. Я задал код, этого, UF_ поля: "UF_ATT_NAL_STORE"

У каждого склада вписываем, в это поле, ID значения соответствующего ему элемента свойства инфоблока.

Отбор по складам в умном фильтре 1С-Битрикс

Таким образом мы связали каждый склад со свойством инфоблока.

Консольный скрипт для обновления свойства инфоблока

Cоздадим консольный скрипт который будет заполнять свойство инфоблока по crontab расписанию.

Если текучка товаров не большая, данный скрипт можно повесить на crontab задание, что бы выполнялся в фоне с заданной периодичностью, например, раз в 12 часов.

$_SERVER['DOCUMENT_ROOT'] = realpath(dirname(__FILE__) . '/../..');
$DOCUMENT_ROOT = $_SERVER['DOCUMENT_ROOT'];

define('NO_KEEP_STATISTIC', true);
define('NOT_CHECK_PERMISSIONS', true);
define('BX_NO_ACCELERATOR_RESET', true);

require($_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_before.php');

@set_time_limit(0);
@ignore_user_abort(true);

use \Bitrix\Main\Loader;

Loader::includeModule("iblock");

$IBLOCK_ID = 13;
$dbGoods = CIBlockElement::GetList(
    array('ID' => 'ASC'),
    array(
        'IBLOCK_ID' => $IBLOCK_ID,
    ),
    false,
    false,
    array(
        'ID'
    )
);
while ($arGood = $dbGoods->Fetch()) {
// Очищаем свойство от предыдущих значений
    CIBlockElement::SetPropertyValuesEx(
        $arGood['ID'],
        $IBLOCK_ID,
        array(
            'ATT_NAL_STORE' => ''
        )
    );

// Собираем инфу о складе
    $arStores = array();
    $dbStores = CCatalogStore::GetList(
        array(),
        array(
            'PRODUCT_ID' => array($arGood['ID']),
            'ACTIVE' => 'Y',
        ),
        false,
        false,
        array(
            'ID',
            'PRODUCT_AMOUNT',
            'UF_ATT_NAL_STORE'
        )
    );
    while ($arStore = $dbStores->Fetch()) {
        $arStores[] = $arStore;
    }


// Готовим свойство значение склад = ID свойства
    $PROPERTY_VALUES = array('VALUE' => '');
    foreach ($arStores as $arStore) {
        if ($arStore['PRODUCT_AMOUNT'] > 0) {
            $PROPERTY_VALUES[] = array(
                'VALUE' => $arStore['UF_ATT_NAL_STORE']
            );
        }
    }

// Устанавливаем значение свойства
    CIBlockElement::SetPropertyValuesEx(
        $arGood['ID'],
        $IBLOCK_ID,
        array(
            'ATT_NAL_STORE' => $PROPERTY_VALUES
        )
    );

// Обновляем индекс
    \Bitrix\Iblock\PropertyIndex\Manager::updateElementIndex(
        $IBLOCK_ID,
        $arGood['ID']
    );
}
  • С помощью CIBlockElement::GetList проходимся по всем элементам инфоблока (в моем случае $IBLOCK_ID = 13). Нам нужен только ID товара.
  • Внутри цикла очищаем значения свойства "ATT_NAL_STORE", установленные ранее, с помощью CIBlockElement::SetPropertyValuesEx
  • Далее, собираем массив $arStores с помощью CCatalogStore::GetList, в котором собрано наличие данного товара на складе и пользовательское поле склада "UF_ATT_NAL_STORE", связываюшее его со значением свойства "ATT_NAL_STORE"
  • Если на конкретном складе есть данный товар/элемент, наполняем массив $PROPERTY_VALUES в котором передаем ID элемента списка, свойства "ATT_NAL_STORE"
  • Из этого массива устанавливаем значение свойства методом CIBlockElement::SetPropertyValuesEx
  • Обновляем связанную с элементом инфомацию с помощью \Bitrix\Iblock\PropertyIndex\Manager::updateElementIndex

Обновление свойства при обмене с 1С

Если текучка товаров большая и необходима постоянная, актуальная информация о складах в умном фильтре. Можно добавить обработчик со скриптом в /local/php_interface/init.php, который будет срабатывать при каждом обновлении элемента каталога.

AddEventHandler("iblock", "OnAfterIBlockElementUpdate", array("UpdateStoreProp", "OnAfterIBlockElementUpdateHandler"));
class UpdateStoreProp
{
    function OnAfterIBlockElementUpdateHandler(&$arFields)
    {
        if ($arFields["RESULT"]) {
           ... ...
           Здесь скрипт приведенный выше
           В CIBlockElement::GetList добавляем
           фильтрацию 'ID' => $arFields['ID']
           ... ...
        }
    }
}
AddEventHandler("iblock", "OnAfterIBlockElementAdd", array("UpdateStoreProp2", "OnAfterIBlockElementAddHandler"));
class UpdateStoreProp2
{
    function OnAfterIBlockElementAddHandler(&$arFields)
    {
        if ($arFields["RESULT"]) {
           ... ...
           Здесь скрипт приведенный выше
           В CIBlockElement::GetList добавляем
           фильтрацию 'ID' => $arFields['ID']
           ... ...
        }
    }
}

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

Михаил Базаров 20.12.2022
Дополнение для товаров со SKU.
Смысл в том, что если у товара есть SKU пробегаемся по ним и обновляем свойство у основного (родителя) элемента.

SKU товара получаем методом CCatalogSKU::getOffersList

Скрытый текст

Записная книжка разработчика

Примерно с 2013-го года пишу заметки по разработке сайтов на Битрикс.
Вы можете задавать уточняющие вопросы в комментариях- отвечаю или дополняю заметки по возможности.

Настройка выгрузки товаров в Яндекс Маркет с сайта Битрикс Просмотров: 37354 Настройка выгрузки в Яндекс маркет в формате yml, выполняется достаточно просто, кроме одн... Малая корзина Битрикс, упрощенный шаблон Просмотров: 13088 Шаблон малой корзины битрикс, который можно вывести в боковом разделе шаблона или в шапке ... Если товар в корзине, поменять значение input на "В корзине" Просмотров: 10693 Если Вам нужно поменять текст на кнопке, добавляющей товар в корзину, достаточно воспользо... Массово: применить наценку ко всем товарам каталога с пересчетом от б... Просмотров: 6045 Рассмотрим как, в магазине работающем на 1С-битрикс, массово применить наценку на все това... Увидеть файл заказов который передаст Битрикс в 1С Просмотров: 23965 Для диагностики обмена заказов, интернет-магазина на 1С Битрикс с 1С Управление Торговлей,... Время на БД и веб сервере отличается на 3600 секунд, тест Битрикс Просмотров: 15690 Достаточно часто, при проверке параметров системы, в Битрикс, можно увидеть одну из ошибок... Вывести компонент новостей на страницу в Битрикс Просмотров: 64433 Посмотрел Яндекс метрику на свой сайт, и решил что буду частенько писать сюда именно то, ч... Простые калькуляторы в карточке товара каталога на Битрикс Просмотров: 15842 На одном из создаваемых сайтов было необходимо сделать небольшой калькулятор и предварител... Ajax форма обратной связи, реализация в битрикс Просмотров: 8145 Иногда, на сайте требуется создать форму обратной связи, которая будет писать все данные в... Вывести все разделы в которых находится элемент инфоблока Просмотров: 14111 Если нужно вывести все разделы, со всей доступной информацией о них, внутри элемента инфоб... Умный фильтр только на последнем уровне разделов каталога. Просмотров: 11071 Если в разработаываемом магазине или в принципе в каталоге на Битрикс, вы выводите умный ф... Установить остатки товара на складе из доступных остатков. Просмотров: 5577 Задача, заполнить остатки товаров, в 1С-Битрикс, из параметра "Доступное количество". Дать пользователю возможность быстро отредактировать материал Просмотров: 4680 На одном из разрабатываемых сайтов, пользователи формирую его контент. После регистрации, ... Моментальная фильтрация на AJAX в умном фильтре 1С-Битрикс Просмотров: 25661 При штатной установке, интернет-магазина на 1С Битрикс, умный фильтр по товарам, показывае... Картинка торгового предложения вместо иконки цвета, в выборе SKU Просмотров: 500 Задача: вместо не информативных иконок цветов нужно вывести детальную картинку торгового п... Спойлер в списке новостей Битрикс Просмотров: 11732 Иногда нужно сделать спойлеры в копонентах Битрикс, в основном конечно, имеет смысл при оч... Показ страницы сайта в боковом слайдере, на примере всплывающей формы... Просмотров: 2586 Если вы хотите сделать подгрузку любой страницы сайта в боковой слайдер, для этого в битри... Основные функции вывода в шаблонах Битрикс Просмотров: 156792 Знаю, что все их знают. Но иногда не бывает лишним собрать все самое используемое в одну к... Сниппеты типографики bootstrap, для Битрикс Просмотров: 7947 Если вы подключили bootstrap к своему сайту, или сверстали весь шаблон, подключив bootstra... Определить местоположение пользователя и показать на карте Просмотров: 3625 Задача определить местоположение текущего пользователя и показать его на карте, с меткой. ...