Как массово переименовать товары (элементы) в 1С-Битрикс, сохранив регистр символов. Разбор кода

В последнее время многие владельцы интернет-магазинов, работающих на CMS 1С-Битрикс, сталкиваются с необходимостью массового переименования товаров. Причины могут быть самые разные: от ребрендинга до корректировки наименований в соответствии с SEO-требованиями. Однако при переименовании важно сохранить регистр символов: заглавные буквы должны остаться заглавными, а строчные – строчными. Ниже приведён рабочий скрипт на PHP, который решает эту задачу автоматизированно и безопасно.

Массовое переименование товаров каталога, с сохранением регистра

В конце статьи приведены скриншоты, показывающие результат исполнения скрипта.


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

if (CModule::IncludeModule("iblock")) {
    $iblockId = 2; // ID инфоблока
    $searchString = "штаны";
    $replaceString = "брюки";

    // Получаем элементы инфоблока
    $arFilter = [
        "IBLOCK_ID" => $iblockId,
        "ACTIVE" => "Y",
        "%NAME" => $searchString
    ];

    $elements = CIBlockElement::GetList([], $arFilter, false, false, ["ID", "NAME"]);

    while ($element = $elements->GetNext()) {
        // Функция для замены с учетом регистра
        $newName = preg_replace_callback(
            "/\b($searchString)\b/iu",
            function ($matches) use ($replaceString) {
                $originalWord = $matches[0];

                // Сохраняем регистр оригинального слова
                $newWord = $replaceString;

                // Сравниваем регистр оригинального слова и заменяем
                if (mb_strtoupper($originalWord) === $originalWord) {
                    return mb_strtoupper($newWord); // Все заглавные
                } elseif (mb_strtolower($originalWord) === $originalWord) {
                    return mb_strtolower($newWord); // Все строчные
                } else {
                    // Сохраняем регистр первой буквы
                    return mb_strtoupper(mb_substr($newWord, 0, 1)) . mb_substr($newWord, 1);
                }
            },
            $element['NAME']
        );

        // Обновляем элемент, если имя изменилось
        if ($newName !== $element['NAME']) {
            $el = new CIBlockElement();
            $el->Update($element['ID'], ["NAME" => $newName]);
            echo "Элемент ID {$element['ID']} переименован в '{$newName}'<br>";
        }
    }
}

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

Разбор кода

Если вам необходимо в кратчайшие сроки скорректировать названия большого количества товаров в каталоге, скрипт выше станет отличным инструментом. Он позволяет не только заменить слово во всех именах элементов, но и корректно сохранить регистры букв, чтобы новые названия выглядели аккуратно и соответствовали правилам русского языка (или любого другого, на котором вы работаете).

Как работает скрипт

  1. Подключение ядра 1С-Битрикс
    
    require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
                        

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

  2. Проверка и подключение модуля `iblock`
    
    if (CModule::IncludeModule("iblock")) {
        // Ваш код для работы с инфоблоком
    }
                        

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

  3. Определение параметров скрипта
    
    $iblockId = 2; // ID инфоблока
    $searchString = "штаны";
    $replaceString = "брюки";
                        
    • $iblockId – идентификатор инфоблока, в котором мы собираемся менять названия.
    • $searchString – слово или фраза, которые необходимо найти в названии.
    • $replaceString – слово или фраза, на которые будет произведена замена.
  4. Формируем фильтр для выборки элементов
    
    $arFilter = [
        "IBLOCK_ID" => $iblockId,
        "ACTIVE" => "Y",
        "%NAME" => $searchString
    ];
                        

    В массиве фильтра указываем:

    • IBLOCK_ID – нужный инфоблок.
    • ACTIVE => "Y" – выбираем только активные элементы.
    • "%NAME" => $searchString – ищем совпадения в названии элементов по подстроке $searchString.
  5. Получаем список элементов
    
    $elements = CIBlockElement::GetList([], $arFilter, false, false, ["ID", "NAME"]);
                        

    Функция CIBlockElement::GetList возвращает список элементов, подходящих под заданный фильтр. Второй параметр – сам $arFilter, остальные используются для сортировки и постраничной навигации (здесь не применяются).

  6. Перебираем каждый элемент и определяем новое имя
    
    while ($element = $elements->GetNext()) {
        $newName = preg_replace_callback(
            "/\b($searchString)\b/iu",
            function ($matches) use ($replaceString) {
                ...
            },
            $element['NAME']
        );
        ...
    }
                        
    • preg_replace_callback позволяет использовать анонимную функцию для тонкой настройки замены.
    • Регулярное выражение /\b($searchString)\b/iu означает:
      • \b – граница слова (чтобы заменить только целое слово, а не его часть).
      • $searchString – наша искомая строка.
      • u – указывает, что мы работаем в юникод-режиме, корректно обрабатывая различные языки.
      • i – регистр не учитывается при поиске (нужно, чтобы находить все варианты слова, но при этом сохранить исходные регистры в дальнейшей логике).
  7. Сохранение регистра символов

    Внутри анонимной функции проверяется, каким образом записано исходное слово – все буквы заглавные, все строчные или только первая буква заглавная. Затем в результате замены мы возвращаем $replaceString с учётом нужного регистра:

    
    // Если исходное слово полностью в верхнем регистре
    if (mb_strtoupper($originalWord) === $originalWord) {
        return mb_strtoupper($newWord);
    }
    // Если полностью в нижнем регистре
    elseif (mb_strtolower($originalWord) === $originalWord) {
        return mb_strtolower($newWord);
    }
    // Иначе меняем регистр только первой буквы
    else {
        return mb_strtoupper(mb_substr($newWord, 0, 1)) . mb_substr($newWord, 1);
    }
                        

    Таким образом, если в названии были слова «ШТАНЫ» или «штаны», они станут «БРЮКИ» или «брюки» соответственно. Если же встречается «Штаны» с заглавной первой буквой, оно превратится в «Брюки».

  8. Обновление элемента
    
    if ($newName !== $element['NAME']) {
        $el = new CIBlockElement();
        $el->Update($element['ID'], ["NAME" => $newName]);
        echo "Элемент ID {$element['ID']} переименован в '{$newName}'<br>";
    }
                        

    Проверяем, действительно ли произошло изменение названия. Если да, то метод Update класса CIBlockElement перезаписывает поле NAME элемента на новое.

  9. Завершающая часть
    
    require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_after.php");
                        

    Подключение prolog_after.php завершает работу скрипта в контексте ядра 1С-Битрикс.

Результат до

Элементы до исполнения скрипта по переименованию

Результат после

Элементы после исполнения скрипта по переименованию

Заключение

Этот скрипт станет удобным решением, если вам необходимо:

  • Быстро изменить названия большого количества товаров или других сущностей в инфоблоке.
  • Гарантировать сохранение регистра символов для корректного отображения текстов.
  • Упростить рутинный процесс переименования в больших каталогах 1С-Битрикс.

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

Теги:  массовое переименование, товары, регистр символов, PHP, скрипт, ребрендинг, SEO

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

Интернет-магазин на готовом решении

от 7 дней

от 40 000 рублей
запуск сайта в максимально короткие сроки

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

Техническая поддержка

выполняется с сайтами на основе любых CMS

от 5 000 рублей
Оптимизация производительности действующих интернет-проектов, наполнение и сопровождение, полная техническая поддержка и продвижение в поисковых сетях.

* стоимость зависит от объема и сложности выполняемых работ, используемой CMS.

Аутсорсинг

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

договорная

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

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