Веб-сайты на платформе 1С-Битрикс часто используют каталог товаров с торговыми предложениями (SKU), где каждый товар может иметь несколько вариаций (например, разные размеры, цвета или другие характеристики). Однако стандартный поиск в Битрикс не всегда поддерживает возможность поиска по артикулу торговых предложений, что может стать проблемой для пользователей. В этой статье мы расскажем, как с помощью простого скрипта и дополнительного поля можно заставить поиск работать по артикулу торговых предложений, а также предложим решение для автоматизации этого процесса.

Задача
Нам нужно организовать поиск товаров по артикулу их торговых предложений (SKU) в системе 1С-Битрикс. Это можно сделать, создав дополнительное поле, в котором будут храниться артикулы всех торговых предложений товара. Однако для удобства работы с большим количеством товаров и торговых предложений нужно автоматизировать заполнение этого поля.
Что потребуется
Для решения задачи нам понадобятся следующие шаги:
- Создадим дополнительное поле для хранения артикулов торговых предложений.
- Напишем скрипт для автоматического заполнения этого поля.
- Перезапустим процесс индексации поиска, чтобы новые данные стали доступны для поиска.
Шаг 1: Создание дополнительного поля для хранения артикулов торговых предложений
Первым шагом необходимо создать новое дополнительное поле для товара, в котором будут храниться артикулы его торговых предложений, разделённые запятыми. Пример кода для создания поля:
- В административной панели Битрикс перейдите в раздел Контент → Типы инфоблоков.
- Выберите нужный инфоблок товаров и добавьте новое поле, например, с кодом
OFFERSES_ARTICLES
.
Шаг 2: Написание скрипта для автоматического заполнения поля
Теперь, когда дополнительное поле создано, нужно автоматизировать процесс заполнения этого поля для всех товаров. Для этого создадим PHP-скрипт, который будет извлекать артикулы всех торговых предложений и записывать их в созданное дополнительное поле. Скрипт можно разместить в папке /local/php_interface/
, например, под именем offers-articles.php
.
Вот пример кода:
<?php
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
CModule::IncludeModule("iblock");
$iblockId = 2; // ID основного каталога товаров
$offersIblockId = 3; // ID инфоблока торговых предложений
$fieldCode = 'ARTNUMBER'; // Код поля с артикулом
// Получаем список всех товаров
$arSelect = Array('ID', 'NAME');
$arFilter = Array("IBLOCK_ID" => $iblockId);
$res = CIBlockElement::GetList(Array(), $arFilter, false, false, $arSelect);
while($ob = $res->GetNextElement()) {
$articles = ''; // Строка для хранения артикулов
// Получаем информацию о товаре
$arFields = $ob->GetFields();
$offers = CCatalogSKU::getOffersList($arFields['ID'], $iblockId);
// Если у товара есть торговые предложения
if(!empty($offers[$arFields['ID']]) && count($offers[$arFields['ID']]) > 0) {
foreach ($offers[$arFields['ID']] as $offer) {
// Получаем артикул из свойства торгового предложения
$db_props = CIBlockElement::GetProperty($offersIblockId, $offer['ID'], array("sort" => "asc"), Array("CODE" => $fieldCode));
$ar_props = $db_props->Fetch();
// Добавляем артикул в строку
$articles .= $ar_props['VALUE'] . ', ';
}
}
// Если артикулы найдены, записываем их в дополнительное поле товара
if(!empty($articles)) {
// Убираем последнюю запятую и пробел
$articles = rtrim($articles, ', ');
// Записываем артикулы в дополнительное поле
CIBlockElement::SetPropertyValueCode($arFields["ID"], "OFFERSES_ARTICLES", $articles);
}
}
?>
Шаг 3: Запуск скрипта
Теперь, чтобы запустить скрипт, откройте его в браузере, перейдя по адресу:
http://yourdomain.local/local/php_interface/offers-articles.php
После этого скрипт пройдет по всем товарам, найдет их торговые предложения и запишет артикулы в дополнительное поле OFFERSES_ARTICLES
.
Шаг 4: Переиндексация поиска
После того как скрипт выполнит свою работу, необходимо переиндексировать поисковую систему Битрикс, чтобы новые данные стали доступны в поиске. Для этого:
- Перейдите в административную панель Битрикс.
- Откройте раздел Настройки → Инструменты → Поиск.
- Выберите Переиндексация.
- Убедитесь, что не стоит галочка "Переиндексировать только измененные", и запустите полную индексацию.
Что делает этот код?
- Скрипт проходит по всем товарам в каталоге (инфоблок с ID 2).
- Для каждого товара он извлекает все связанные торговые предложения.
- Из каждого торгового предложения он получает значение артикулов (свойство с кодом
ARTNUMBER
). - Все артикулы собираются в одну строку, разделённую запятыми, и записываются в дополнительное поле товара
OFFERSES_ARTICLES
.
Заключение
Теперь, когда артикулы торговых предложений записаны в дополнительное поле товара, поиск по этим артикулам будет возможен. Этот способ позволяет легко организовать поиск по артикулу без необходимости вручную заполнять дополнительные поля для каждого товара. Скрипт можно запускать по мере необходимости, и он автоматически обновит информацию по товарам.
Таким образом, даже если в вашем каталоге тысячи товаров с сотнями торговых предложений, этот способ позволит эффективно управлять и индексировать товары для поиска по артикулу.