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

Копируем значения свойств в 1С-Битрикс: от одного элемента до всего инфоблока

При миграциях, рефакторинге инфоблоков или выравнивании данных часто возникает задача: аккуратно перенести значение из одного свойства элементов в другое. Ниже — два практичных скрипта для 1С-Битрикс: первый копирует значение для конкретного элемента по ID, второй — массово обрабатывает весь инфоблок. В примерах мы используем абстрактные коды свойств SOURCE_META (источник) и TARGET_META (приёмник), чтобы не зависеть от каких-либо модулей и названий.

Копируем значения свойств в 1С-Битрикс

Скрипт 1: Для одного элемента по ID

<?php
// ====================== ВАРИАНТ 1: для одного элемента по ID ======================
require_once($_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_before.php');
use Bitrix\Main\Loader;
use Bitrix\Iblock\ElementTable;
// Инициализация
if (!Loader::includeModule('iblock')) {
    die('Модуль iblock не установлен');
}
// Параметры
$iblockId  = 1;
$elementId = 139;
// Проверяем, что элемент существует в нужном инфоблоке
$element = ElementTable::getList([
    'select' => ['ID'],
    'filter' => ['=ID' => $elementId, '=IBLOCK_ID' => $iblockId],
    'limit'  => 1,
])->fetch();
if (!$element) {
    die("Элемент с ID {$elementId} не найден");
}
// Получаем значение свойства-источника (например, SOURCE_META)
$propRow = CIBlockElement::GetProperty(
    $iblockId,
    $elementId,
    ["sort" => "asc"],
    ['CODE' => 'SOURCE_META']
)->Fetch();
$sourceMetaValue = $propRow['VALUE'] ?? null;
// Если свойство множественное — берём первое значение
if (is_array($sourceMetaValue)) {
    $sourceMetaValue = reset($sourceMetaValue);
}
if ($sourceMetaValue) {
    // Копируем значение в целевое свойство (например, TARGET_META)
    CIBlockElement::SetPropertyValuesEx(
        $elementId,
        $iblockId,
        ['TARGET_META' => $sourceMetaValue]
    );
    echo "Значение свойства TARGET_META успешно обновлено для элемента {$elementId}";
} else {
    echo "Свойство SOURCE_META не найдено или пустое";
}
?>

Скрипт 2: Для всех элементов инфоблока

<?php
// ====================== ВАРИАНТ 2: для всех элементов инфоблока ======================
require_once($_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_before.php');
use Bitrix\Main\Loader;
if (!Loader::includeModule('iblock')) {
    die('Модуль iblock не установлен');
}
$iblockId = 1;
// Выбираем элементы с заполненным SOURCE_META и пустым TARGET_META
$elements = CIBlockElement::GetList(
    [],
    [
        'IBLOCK_ID' => $iblockId,
        '!PROPERTY_SOURCE_META' => false,
        'PROPERTY_TARGET_META' => false
    ],
    false,
    false,
    ['ID', 'IBLOCK_ID', 'PROPERTY_SOURCE_META']
);
$count = 0;
while ($item = $elements->Fetch()) {
    $elId   = (int)$item['ID'];
    $srcVal = $item['PROPERTY_SOURCE_META_VALUE'];
    // Если значение массив (множественное свойство) — берём первое
    if (is_array($srcVal)) {
        $srcVal = reset($srcVal);
    }
    if ($srcVal) {
        CIBlockElement::SetPropertyValuesEx(
            $elId,
            $iblockId,
            ['TARGET_META' => $srcVal]
        );
        $count++;
    }
}
echo "Обновлено элементов: {$count}";
?>

Как работает вариант для одного элемента

  1. Инициализация и проверка модулей.
    Подключаем пролог и убеждаемся, что модуль iblock установлен. В продакшене это лучше оформлять через обработку исключений.
  2. Параметры задачи.
    Указываем ID инфоблока $iblockId и ID элемента $elementId, для которого хотим выполнить перенос.
  3. Проверка существования элемента.
    Запрашиваем ElementTable и убеждаемся, что элемент относится к нужному инфоблоку.
  4. Чтение значения свойства-источника.
    Через CIBlockElement::GetProperty получаем строку свойства SOURCE_META.
    - Если свойство множественное, берём первый элемент массива.
    - Если пусто — корректно сообщаем об этом.
  5. Запись в целевое свойство.
    Через CIBlockElement::SetPropertyValuesEx устанавливаем TARGET_META равным значению SOURCE_META. При успехе выводим сообщение.

Когда использовать: точечные корректировки, быстрое исправление отдельных карточек, тестирование логики на единичном примере перед массовой операцией.


Как работает вариант для всего инфоблока

  1. Отбор элементов.
    Сразу фильтруем только те элементы, у которых SOURCE_META заполнено, а TARGET_META пусто. Это экономит ресурсы и не трогает уже обработанные записи.
  2. Итерация и перенос.
    Для каждого найденного элемента:
    - Берём значение PROPERTY_SOURCE_META_VALUE;
    - При множественном значении берём первое;
    - Записываем его в TARGET_META и считаем количество обновлений.
  3. Итоговый отчёт.
    После цикла выводим, сколько элементов было изменено.

Когда использовать: массовые правки после смены схемы данных, выравнивание свойств, подготовка к новым сценариям отображения или интеграциям.


Рекомендации и частые нюансы

  • Согласованность типов свойств.
    Старайтесь, чтобы SOURCE_META и TARGET_META имели совместимые типы (строка → строка, число → число, привязка к элементу → привязка к элементу и т. п.). Иначе возможны ошибки записи или «пустые» результаты.
  • Множественные свойства.
    В примерах мы осознанно берём первое значение массива. Если вам нужно копировать все значения, запишите массив целиком:
    ['TARGET_META' => (array)$srcVal].
  • Производительность.
    Для очень больших инфоблоков запускайте скрипт из консоли PHP или через Агент/cron батчами (например, по 1 000 элементов за проход), чтобы не упираться во время исполнения и память.
  • Безопасность изменений.
    Перед массовой операцией сделайте бэкап БД. На тестовом стенде прогоните скрипт с выборкой nTopCount и убедитесь, что перенос срабатывает корректно.
  • Кэш и индекс.
    После крупных изменений свойств может потребоваться сброс управляемого кэша и/или переиндексация, если свойства участвуют в фильтрах/поиске.
  • Прав доступа.
    Скрипт должен выполняться под пользователем/контекстом, который имеет права на чтение/запись в указанный инфоблок.

Что изменить под себя

  • Коды свойств.
    Поменяйте SOURCE_META/TARGET_META на реальные коды ваших свойств в админке инфоблока.
  • Фильтры отбора.
    Добавьте дополнительные условия (по разделам, активностям, датам), если нужно сузить круг элементов.
  • Обработка значений.
    Между чтением и записью можно «обогатить» данные: обрезать пробелы, нормализовать регистр, проставить суффиксы/префиксы, валидировать форматы.

Итог

Два лаконичных скрипта решают распространённую задачу: скопировать значение из одного свойства в другое — либо для одного элемента, либо массово для всего инфоблока. Начните с точечного варианта, проверьте логику, а затем смело запускайте массовую обработку, соблюдая рекомендации по бэкапам и производительности.

Теги: инфоблоки, свойства, миграция данных, скрипты, PHP, CIBlockElement


Валерий Макеев
08.09.2025 14:12
Скрипт массово копирует значения из свойства OLD_PRICE в свойство BASE_PRICE для всех элементов инфоблока с ID 5, где BASE_PRICE ещё не заполнено.
Код
<?php
require_once($_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_before.php');
use Bitrix\Main\Loader;

if (!Loader::includeModule('iblock')) {
    die('Не загружен модуль iblock');
}

// Копирует значение свойства "OLD_PRICE" в "BASE_PRICE" для всех элементов инфоблока 5, где "BASE_PRICE" пуст
$iblockId = 5;

$res = CIBlockElement::GetList(
    [],
    [
        'IBLOCK_ID' => $iblockId,
        '!PROPERTY_OLD_PRICE' => false,
        'PROPERTY_BASE_PRICE' => false
    ],
    false,
    false,
    ['ID', 'PROPERTY_OLD_PRICE']
);

$updated = 0;
while ($element = $res->Fetch()) {
    $newValue = $element['PROPERTY_OLD_PRICE_VALUE'];
    if ($newValue !== null) {
        CIBlockElement::SetPropertyValuesEx($element['ID'], $iblockId, ['BASE_PRICE' => $newValue]);
        $updated++;
    }
}

echo "Обновлено элементов: $updated";
?>

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

Участие в проекте

привлечение в проект на part-time основе

от 30 000 рублей / неделя

Возможно участие в проекте на ежедневной основе, как разработчика. Занятость - до 20 часов в неделю
Минимальный срок - одна неделя.

* сумма фиксированная

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

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

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

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

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

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

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

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