Массовая простановка символьных кодов в Битриксе

Внимание! Работает режим премодерации. Все сообщения публикуются после проверки!
Страницы: 1
Ответить
RSS
Массовая простановка символьных кодов в Битриксе
Массовая генерация символьных кодов через API Битрикса средствами старого ядра и D7

Задача. Простановка символьных кодов у всех элементов инфоблока  (или его конкретного раздела) через API Битрикса средствами старого ядра  и D7.
Этот скрипт массово генерирует символьные коды для всех элементов указанного инфоблока по транслитерации названия, но только у тех элементов, у которых код ещё не задан, используя современное ядро D7 и логируя каждый шаг.
Код
<?php
// Подключаем пролог Битрикс (автоматически подключит ядро и настройки)
require_once($_SERVER['DOCUMENT_ROOT'] . '/bitrix/header.php');

use Bitrix\Main\Loader;
use Bitrix\Iblock\Elements\ElementCatalogTable;

// Логируем начало
AddMessage2Log("Запуск массовой генерации символьных кодов для инфоблока через D7");

// Подключаем модуль инфоблоков
if (!Loader::includeModule('iblock')) {
    AddMessage2Log("Ошибка: не удалось подключить модуль iblock");
    die("Не удалось подключить модуль iblock");
}

// Настройки
$iblockId = 3; // Укажите нужный ID инфоблока
$params = [
    "max_len" => 100,
    "change_case" => "L",
    "replace_space" => "-",
    "replace_other" => "-",
    "delete_repeat_replace" => true,
    "safe_chars" => ""
];

// Получаем элементы без символьного кода
$elements = ElementCatalogTable::getList([
    'filter' => [
        'IBLOCK_ID' => $iblockId,
        'CODE' => false // Только элементы без CODE
    ],
    'select' => ['ID', 'NAME']
]);

while ($element = $elements->fetch()) {
    $elementID = $element['ID'];
    $elementName = $element['NAME'];

    // Генерируем символьный код
    $newCode = CUtil::translit($elementName, 'ru', $params);

    // Обновляем элемент
    $result = ElementCatalogTable::update($elementID, ['CODE' => $newCode]);

    if ($result->isSuccess()) {
        AddMessage2Log("D7. Элемент ID {$elementID}: установлен код '{$newCode}'");
    } else {
        AddMessage2Log("D7. Элемент ID {$elementID}: ошибка обновления -> " . implode(', ', $result->getErrorMessages()));
    }
}

echo "Обработка завершена. Результаты записаны в лог.";
require_once($_SERVER['DOCUMENT_ROOT'] . '/bitrix/footer.php');
?>
Ошибка (из предыдущего примера), типа

[Error]
Class "Bitrix\Iblock\Elements\ElementCatalogTable" not found (0)

возникает потому, что класс Bitrix\Iblock\Elements\ElementCatalogTable не существует автоматически — он генерируется только при наличии соответствующего инфоблока, если включена опция "Генерировать коды компонентов" и созданы классы D7 через интерфейс Битрикс (например, через "Типы инфоблоков" → "Генерация D7-классов").

Если таких классов нет — вы не можете использовать ElementCatalogTable, и PHP выбрасывает Class not found.

✅ Можно использовать универсальный D7-метод без зависимостей от сгенерированных классов
Ниже пример, который не требует наличия ElementCatalogTable, а использует стандартный API D7 через CIBlockElement и Bitrix\Iblock\ElementTable:
Код
<?php
// Подключаем пролог Битрикс
require_once($_SERVER['DOCUMENT_ROOT'] . '/bitrix/header.php');

use Bitrix\Main\Loader;
use Bitrix\Iblock\ElementTable;
use Bitrix\Main\Entity\DataManager;

// Логируем начало
AddMessage2Log("Запуск массовой генерации символьных кодов для элементов инфоблока (универсальный D7)");

// Подключаем модуль iblock
if (!Loader::includeModule('iblock')) {
    AddMessage2Log("Ошибка: не удалось подключить модуль iblock");
    die("Модуль iblock не подключён");
}

// Настройки
$iblockId = 3; // ← Укажите нужный ID вашего инфоблока
$params = [
    "max_len" => 100,
    "change_case" => "L",           // в нижний регистр
    "replace_space" => "-",         // пробелы на дефис
    "replace_other" => "-",         // прочие символы на дефис
    "delete_repeat_replace" => true, // убрать дубли дефисов
    "safe_chars" => ""              // безопасные символы (если нужны)
];

// Получаем элементы инфоблока без символьного кода
$query = ElementTable::getList([
    'filter' => [
        '=IBLOCK_ID' => $iblockId,
        'CODE' => null // или false — элементы без CODE
    ],
    'select' => ['ID', 'NAME'],
    'limit'  => 5000 // защита от перегрузки; можно запускать по частям
]);

$updatedCount = 0;
while ($element = $query->fetch()) {
    $elementID = $element['ID'];
    $elementName = trim($element['NAME']);

    if (empty($elementName)) {
        AddMessage2Log("D7. Элемент ID {$elementID}: пропущен — пустое название");
        continue;
    }

    // Генерируем символьный код
    $newCode = CUtil::translit($elementName, 'ru', $params);

    // Обновляем поле CODE через ElementTable
    $result = ElementTable::update($elementID, ['CODE' => $newCode]);

    if ($result->isSuccess()) {
        AddMessage2Log("D7. Элемент ID {$elementID}: установлен код '{$newCode}'");
        $updatedCount++;
    } else {
        $errors = implode(', ', $result->getErrorMessages());
        AddMessage2Log("D7. Элемент ID {$elementID}: ошибка обновления -> {$errors}");
    }
}

echo "Готово. Обновлено элементов: {$updatedCount}. Результаты в логах (/bitrix/logs/).";
require_once($_SERVER['DOCUMENT_ROOT'] . '/bitrix/footer.php');
?>
Страницы: 1
Ответить
Форма ответов
Текст сообщения*
Перетащите файлы
Ничего не найдено
Файл
 

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

Модули и компоненты для «1С-Битрикс»

оценка производится на основе предоставленного Технического Задания

от 20 000 рублей
Разработка дополнительных модулей для 1С-Битрикс, расширение функционала, внедрение любых решений, требующихся для выполнения ваших бизнес-задач.

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

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

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

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

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

Разработка корпоративного сайта

от 7 дней

от 40 000 рублей

Разработка сайта без системы оплаты заказов через корзину

* стоимость зависит от наличия верстки, использования готового решения и т.д.