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

Скрипт 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}";
?>
Как работает вариант для одного элемента
- Инициализация и проверка модулей.
Подключаем пролог и убеждаемся, что модульiblock
установлен. В продакшене это лучше оформлять через обработку исключений. - Параметры задачи.
Указываем ID инфоблока$iblockId
и ID элемента$elementId
, для которого хотим выполнить перенос. - Проверка существования элемента.
ЗапрашиваемElementTable
и убеждаемся, что элемент относится к нужному инфоблоку. - Чтение значения свойства-источника.
ЧерезCIBlockElement::GetProperty
получаем строку свойстваSOURCE_META
.
- Если свойство множественное, берём первый элемент массива.
- Если пусто — корректно сообщаем об этом. - Запись в целевое свойство.
ЧерезCIBlockElement::SetPropertyValuesEx
устанавливаемTARGET_META
равным значениюSOURCE_META
. При успехе выводим сообщение.
Когда использовать: точечные корректировки, быстрое исправление отдельных карточек, тестирование логики на единичном примере перед массовой операцией.
Как работает вариант для всего инфоблока
- Отбор элементов.
Сразу фильтруем только те элементы, у которыхSOURCE_META
заполнено, аTARGET_META
пусто. Это экономит ресурсы и не трогает уже обработанные записи. - Итерация и перенос.
Для каждого найденного элемента:
- Берём значениеPROPERTY_SOURCE_META_VALUE
;
- При множественном значении берём первое;
- Записываем его вTARGET_META
и считаем количество обновлений. - Итоговый отчёт.
После цикла выводим, сколько элементов было изменено.
Когда использовать: массовые правки после смены схемы данных, выравнивание свойств, подготовка к новым сценариям отображения или интеграциям.
Рекомендации и частые нюансы
- Согласованность типов свойств.
Старайтесь, чтобыSOURCE_META
иTARGET_META
имели совместимые типы (строка → строка, число → число, привязка к элементу → привязка к элементу и т. п.). Иначе возможны ошибки записи или «пустые» результаты. - Множественные свойства.
В примерах мы осознанно берём первое значение массива. Если вам нужно копировать все значения, запишите массив целиком:
['TARGET_META' => (array)$srcVal]
. - Производительность.
Для очень больших инфоблоков запускайте скрипт из консоли PHP или через Агент/cron батчами (например, по 1 000 элементов за проход), чтобы не упираться во время исполнения и память. - Безопасность изменений.
Перед массовой операцией сделайте бэкап БД. На тестовом стенде прогоните скрипт с выборкойnTopCount
и убедитесь, что перенос срабатывает корректно. - Кэш и индекс.
После крупных изменений свойств может потребоваться сброс управляемого кэша и/или переиндексация, если свойства участвуют в фильтрах/поиске. - Прав доступа.
Скрипт должен выполняться под пользователем/контекстом, который имеет права на чтение/запись в указанный инфоблок.
Что изменить под себя
- Коды свойств.
ПоменяйтеSOURCE_META
/TARGET_META
на реальные коды ваших свойств в админке инфоблока. - Фильтры отбора.
Добавьте дополнительные условия (по разделам, активностям, датам), если нужно сузить круг элементов. - Обработка значений.
Между чтением и записью можно «обогатить» данные: обрезать пробелы, нормализовать регистр, проставить суффиксы/префиксы, валидировать форматы.
Итог
Два лаконичных скрипта решают распространённую задачу: скопировать значение из одного свойства в другое — либо для одного элемента, либо массово для всего инфоблока. Начните с точечного варианта, проверьте логику, а затем смело запускайте массовую обработку, соблюдая рекомендации по бэкапам и производительности.