Массовое изменение цен в 1С-Битрикс через API

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

Массовое изменение цен в 1С-Битрикс через API

Зачем нужно массовое изменение цен?

Массовое изменение цен может понадобиться по различным причинам:

  • Изменение ценовых категорий товаров (например, по акции или скидке).
  • Обновление цен на основе внешних данных, таких как изменения поставщиков или валют.
  • Автоматическое регулирование цен в зависимости от остатка на складе или сезонных факторов.

Для всех этих целей API 1С-Битрикс предоставляет отличные возможности, позволяя оперативно обновлять цены и избегать ручных изменений.

Как работает API 1С-Битрикс?

В 1С-Битрикс для работы с каталогами и товарами используется несколько основных классов:

  • CIBlockElement — для работы с элементами инфоблоков (товарами, статьями и т.д.).
  • CPrice — для работы с ценами товаров.
  • CIBlockProperty — для работы со свойствами товаров (например, наличие скидок или акций).

Шаг 1: Подключение необходимых модулей

Перед тем как приступить к изменениям, нужно подключить модули, которые понадобятся для работы с инфоблоками и ценами. В начале скрипта мы подключаем модули iblock и catalog:

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

CModule::IncludeModule("iblock");
CModule::IncludeModule("catalog");
?>

Шаг 2: Определяем, какие товары изменяем

Для массового обновления цен нам нужно выбрать товары, которые будут подвергаться изменениям. Это можно сделать, например, по фильтру по разделу, по конкретным свойствам или по конкретному инфоблоку.

Пример фильтрации товаров по инфоблоку и разделу:

$iblockId = 2; // ID инфоблока товаров
$sectionId = 5; // ID раздела товаров

$arFilter = [
    "IBLOCK_ID"   => $iblockId,
    "SECTION_ID"  => $sectionId,
    "ACTIVE"      => "Y" // Только активные товары
];

$rsProducts = CIBlockElement::GetList(
    ["SORT" => "ASC"], // Сортировка по возрастанию
    $arFilter,
    false,
    false,
    ["ID", "NAME", "IBLOCK_ID"]
);

В этом примере мы выбираем все товары из инфоблока с ID 2, находящиеся в разделе с ID 5, и которые активны.

Шаг 3: Получаем текущие цены товаров

Для каждого товара нужно извлечь текущие цены. Для этого используем класс CPrice:

while ($arProduct = $rsProducts->Fetch()) {
    // Получаем ID товара
    $productId = $arProduct["ID"];

    // Ищем цену товара с типом "1" (базовая цена)
    $dbPrice = CPrice::GetList(
        [],
        [
            "PRODUCT_ID"       => $productId,
            "CATALOG_GROUP_ID" => 1 // ID типа цены
        ]
    );

    // Если цена найдена, обновляем её
    if ($arPrice = $dbPrice->Fetch()) {
        $priceId = $arPrice["ID"];
        $newPrice = $arPrice["PRICE"] * 1.1; // Например, увеличиваем цену на 10%
    } else {
        // Если цена не найдена, задаём новую цену
        $newPrice = 100; // Установить фиксированную цену
    }

    // Массив с новыми данными для обновления цены
    $arFields = [
        "PRODUCT_ID"       => $productId,
        "CATALOG_GROUP_ID" => 1,
        "PRICE"            => $newPrice,
        "CURRENCY"         => "RUB" // Валюта
    ];

    // Обновляем цену товара
    if ($priceId) {
        CPrice::Update($priceId, $arFields);
        echo "Updated price for product #{$productId} <br>";
    } else {
        CPrice::Add($arFields);
        echo "Added price for product #{$productId} <br>";
    }
}

Здесь мы увеличиваем цену товара на 10%. Если цена уже существует, обновляем её. Если цена отсутствует, добавляем новую.

Шаг 4: Обновление других свойств товаров

Кроме изменения цен, иногда бывает необходимо обновить другие данные, например, специальные свойства товаров (наличие скидки, статус товара и т.д.). Для этого используется метод CIBlockElement::SetPropertyValuesEx.

Пример обновления свойства товара:

CIBlockElement::SetPropertyValuesEx($productId, $iblockId, [
    "SALE" => "Y" // Обновляем свойство SALE на значение "Y"
]);

Этот код обновляет свойство с кодом SALE для товара, присваивая ему значение Y (например, активировать акцию).

Шаг 5: Переиндексация и очистка кэша

После массовых изменений цен и свойств товаров, важно не забывать о переиндексации и очистке кэша. Это гарантирует, что все изменения будут учтены в поиске и отображении на сайте.

Для переиндексации товаров можно использовать инструмент индексации в админке Битрикс, либо выполнить это программно:

CModule::IncludeModule("search");
$searchIndex = new CSearch;
$searchIndex->ReindexElement($productId); // Переиндексация конкретного товара

Также рекомендуется очистить кэш после массового обновления товаров:

$CACHE_MANAGER->ClearByTag("iblock_id_".$iblockId); // Очистка кэша для инфоблока

Пример готового скрипта для массового изменения цен

Вот пример готового скрипта для массового обновления цен товаров в указанном разделе:

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

CModule::IncludeModule("iblock");
CModule::IncludeModule("catalog");

$iblockId = 2; // ID инфоблока товаров
$sectionId = 5; // ID раздела

$arFilter = [
    "IBLOCK_ID"   => $iblockId,
    "SECTION_ID"  => $sectionId,
    "ACTIVE"      => "Y"
];

$rsProducts = CIBlockElement::GetList(
    ["SORT" => "ASC"],
    $arFilter,
    false,
    false,
    ["ID", "NAME", "IBLOCK_ID"]
);

while ($arProduct = $rsProducts->Fetch()) {
    $productId = $arProduct["ID"];

    $dbPrice = CPrice::GetList(
        [],
        [
            "PRODUCT_ID"       => $productId,
            "CATALOG_GROUP_ID" => 1
        ]
    );

    if ($arPrice = $dbPrice->Fetch()) {
        $priceId = $arPrice["ID"];
        $newPrice = $arPrice["PRICE"] * 1.1;
    } else {
        $newPrice = 100;
    }

    $arFields = [
        "PRODUCT_ID"       => $productId,
        "CATALOG_GROUP_ID" => 1,
        "PRICE"            => $newPrice,
        "CURRENCY"         => "RUB"
    ];

    if ($priceId) {
        CPrice::Update($priceId, $arFields);
    } else {
        CPrice::Add($arFields);
    }

    CIBlockElement::SetPropertyValuesEx($productId, $iblockId, [
        "SALE" => "Y"
    ]);
}

require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/epilog_after.php");
?>

Заключение

Массовое изменение цен в 1С-Битрикс через API — это мощный инструмент для автоматизации работы интернет-магазина. С помощью стандартных классов и методов, таких как CPrice и CIBlockElement, можно легко обновлять цены на товары, изменять их свойства и обеспечивать правильное отображение информации на сайте. Правильное использование API позволяет ускорить процессы, повысить точность и снизить количество ошибок при изменении данных.

Теги:  API, массовое изменение цен, интернет-магазин, автоматизация, ценовая политика

Стоимость услуг по разработке и сопровождению сайтов на 1C-Битрикс

Разработка интернет-магазина с готовой версткой

от 4 недель

от 90 000 рублей

* указана минимальная стоимость. Стоимость выбранной лицензии «1С-Битрикс» оплачивается отдельно.

Перенос сайтов на «1С-Битрикс»

сайты на платформе «1С-Битрикс» — это удобство, надежность и высокая посещаемость

от 12 000 рублей
Перенос сайтов с любых CMS и статичных страниц на платформу «1С-Битрикс», с учетом дизайна, верстки и урл-адресов. С сохранением всей информации и структуры сайта.

* зависит от объема выполняемых работ.

Аутсорсинг

готов помочь, если нет времени

договорная

Могу взять на себя работы по full-stack на основе готовой верстки

* если нет верстки, то возможность верстать с Figma в режиме редактора