Работая с проектами на 1С-Битрикс, разработчики часто сталкиваются с необходимостью массового переноса данных: будь то копирование значений свойств или создание новых элементов на основе существующих. Ручное выполнение таких задач через админ-панель неэффективно и чревато ошибками, особенно при больших объемах данных.
В этой статье вы найдете готовые PHP-скрипты, которые помогут автоматизировать процессы копирования свойств и элементов между инфоблоками, обеспечивая точность и экономию времени.
Зачем это нужно?
-
Безопасное обновление данных: Вы можете создать копию свойства для тестирования новых функций, не затрагивая рабочее поле.
-
Миграция данных: При изменении структуры сайта часто требуется перенести элементы в другой инфоблок.
-
Исправление ошибок: Если данные были выгружены некорректно (как в примере автора, когда инфоблок "оказался не там"), скрипт поможет быстро их восстановить.
Важные предупреждения перед началом
-
Бэкап! Перед запуском любых скриптов, которые изменяют данные, обязательно сделайте полную резервную копию базы данных.
-
Тестовый стенд. Проверяйте скрипт на тестовой копии сайта, а не на боевом сервере.
-
Внимательность. Внимательно проверьте все идентификаторы (ID инфоблоков, коды свойств), чтобы случайно не испортить данные.
Скрипт 1: Копирование значения одного свойства в другое
Этот скрипт используется, когда в рамках одного инфоблока нужно продублировать значение из одного свойства (PROP_FROM_OLD) в другое (PROP_TO_NEW).
<?
// Подключаем ядро Битрикса
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
// Подключаем модуль инфоблоков
CModule::IncludeModule("iblock");
// Снимаем ограничения для длительных скриптов (для больших объемов данных)
@set_time_limit(99600);
ini_set("memory_limit", "4096M");
ini_set("max_execution_time", "0");
ini_set("max_input_time", "0");
// Получаем список элементов исходного инфоблока
$res = CIBlockElement::GetList(
array(), // Сортировка
array('IBLOCK_ID' => 1), // Фильтр (ID вашего исходного инфоблока)
false, // Группировка
false, // Постраничная навигация
array('ID', 'PROP_FROM_OLD') // Выбираемые поля (обязательно ID и копируемое свойство)
);
// Обрабатываем каждый элемент
while($el = $res->GetNextElement()) {
$fields = $el->GetFields();
// Получаем массив данных свойства, которое копируем
$from = $el->GetProperty('PROP_FROM_OLD');
// Обновляем целевое свойство
CIBlockElement::SetPropertyValuesEx(
$fields['ID'], // ID обновляемого элемента
1, // ID инфоблока (должен совпадать с исходным!)
array('PROP_TO_NEW' => $from['VALUE']) // Массив [код_свойства => значение]
);
// Для отладки можно выводить информацию
echo "Обработан элемент ID: " . $fields['ID'] . "<br>";
}
// Сообщение об окончании работы
echo "Скопирование свойств завершено.";
?>Что важно в этом коде:
-
В фильтре
CIBlockElement::GetListи в методеSetPropertyValuesExдолжен быть указан один и тот же IBLOCK_ID, если вы работаете в пределах одного инфоблока. -
PROP_FROM_OLDиPROP_TO_NEW— это символьные коды свойств. Замените их на свои. -
Метод
SetPropertyValuesExявляется предпочтительным для обновления свойств, так как он учитывает их тип (список, файл, привязка к элементам и т.д.).
Скрипт 2: Перенос элементов в другой инфоблок
Этот скрипт полезен, когда нужно не просто скопировать свойство, а создать полностью новые элементы в другом инфоблоке на основе данных из старого.
<?
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
CModule::IncludeModule("iblock");
// Получаем элементы из исходного инфоблока (ID = 8)
$rs = CIBlockElement::GetList (
false,
Array("IBLOCK_ID" => 8, "ACTIVE" => "Y"),
false,
false,
Array('ID', 'NAME', 'PROPERTY_HOURS', 'PROPERTY_MINUTES', 'ACTIVE_FROM')
);
while ($ar_fields = $rs->GetNext()) {
// Создаем новый элемент
$el = new CIBlockElement;
// Подготавливаем массив свойств для нового элемента
$PROP = array();
$PROP[7] = 1; // Свойство с ID 7 (например, "Проект")
$PROP[8] = $ar_fields['PROPERTY_HOURS_VALUE']; // Копируем часы
$PROP[9] = $ar_fields['PROPERTY_MINUTES_VALUE']; // Копируем минуты
// Массив полей для нового элемента
$arLoadProductArray = Array(
"MODIFIED_BY" => $USER->GetID(), // Текущий пользователь как редактор
"IBLOCK_SECTION_ID" => false, // Раздел "Корень"
"IBLOCK_ID" => 3, // ID целевого инфоблока
"DATE_ACTIVE_FROM" => $ar_fields['ACTIVE_FROM'], // Копируем дату
"PROPERTY_VALUES" => $PROP, // Массив свойств
"NAME" => $ar_fields['NAME'], // Копируем название
"ACTIVE" => "Y", // Делаем активным
);
// Пытаемся добавить элемент
if($PRODUCT_ID = $el->Add($arLoadProductArray)) {
echo "Успешно создан новый элемент с ID: ".$PRODUCT_ID . "<br>";
} else {
echo "Ошибка при создании элемента: ".$el->LAST_ERROR . "<br>";
}
}
?>Что важно в этом коде:
-
В этом скрипте мы работаем с двумя разными инфоблоками: исходным (ID=8) и целевым (ID=3).
-
Свойства задаются не по символьным кодам, а по их ID (
$PROP[7],$PROP[8]). Узнать ID свойства можно в админке в разделе "Настройки" инфоблока. -
Используется метод
CIBlockElement::Add, который создает совершенно новый элемент.
Заключение
С помощью этих скриптов вы можете эффективно управлять данными в своих проектах на Битрикс, автоматизируя рутинные и массовые операции. Главное — всегда помнить о мерах предосторожности: бэкапы и тестирование.