Блог разработчика 1С-Битрикс

Как массово переименовать товары (элементы) в 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


Валерий Макеев
06.09.2025 09:56
Этот скрипт одновременно заменяет несколько слов (например, «кроссовки», «футболка», «джинсы») на новые варианты («кеды», «топ», «джинсовка») в названиях товаров, корректно сохраняя регистр каждого слова (например, «Футболка» → «Топ», «ДЖИНСЫ» → «ДЖИНСОВКА»), при этом затрагивая только целые слова, а не их части.
Код
<?php
require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_before.php");

use Bitrix\Iblock\ElementTable;

if (CModule::IncludeModule("iblock")) {
    $iblockId = 2; // ID инфоблока с товарами
    $replacements = [
        "кроссовки" => "кеды",
        "футболка"  => "топ",
        "джинсы"    => "джинсовка"
    ];

    $arFilter = [
        "IBLOCK_ID" => $iblockId,
        "ACTIVE"    => "Y",
        "NAME"      => array_keys($replacements) // Поиск по любому из ключевых слов
    ];

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

    while ($element = $elements->GetNext()) {
        $newName = $element['NAME'];

        foreach ($replacements as $search => $replace) {
            // Проверяем, есть ли целое слово для замены (с учётом границ слова и регистра)
            $pattern = '/(?<=^|\P{L})' . preg_quote($search, '/') . '(?=\P{L}|$)/ui';

            $newName = preg_replace_callback($pattern, function($matches) use ($replace, $search) {
                $original = $matches[0];

                if (mb_strtoupper($original, 'UTF-8') === $original) {
                    return mb_strtoupper($replace, 'UTF-8');
                } elseif (mb_strtolower($original, 'UTF-8') === $original) {
                    return mb_strtolower($replace, 'UTF-8');
                } else {
                    return mb_strtoupper(mb_substr($replace, 0, 1), 'UTF-8') . mb_substr($replace, 1);
                }
            }, $newName);
        }

        if ($newName !== $element['NAME']) {
            CIBlockElement::SetPropertyValuesEx($element['ID'], $iblockId, []);
            $el = new CIBlockElement();
            $el->Update($element['ID'], ['NAME' => $newName]);
            echo "Обновлено: '{$element['NAME']}' → '{$newName}'<br>";
        }
    }
}

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

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

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

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

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

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

Лечение сайтов от вирусов

восстановление сайта и подъем версии PHP

от 25 000 рублей
Лечение сайтов на решениях АСПРО и прочих.

* полный комплекс лечения проекта и закрытия дыр

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

от 7 дней

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

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