При схеме разработки в, как минимум, 2 копии (dev и production) возникает потребность переноса изменений базы данных из одной копии в другую. На текущий момент (пока не решили вопрос с миграциями) мы пишем код на API 1С-Битрикс, который можно запустить в PHP-командной строке битрикса и изменения появятся в нужной копии. Примеры этого кода я и буду размещать у себя в блоге. Начну с добавления свойств к инфоблоку.

Хочу заменить, что данная миграция не обновляет уже существующие свойства, а любезно скажет разработчику, что свойство уже есть.

Вам остаётся только собрать нужной структуры массив $arProperties и выполнить миграцию.

Код миграции

//<?php
 
/**
 * Добавление свойств к инфоблоку.
 * в массиве $arProperties нужно описать список свойств
 * @doc http://dev.1c-bitrix.ru/api_help/iblock/classes/ciblockproperty/add.php документация по добавлению свойств
 * @doc http://dev.1c-bitrix.ru/api_help/iblock/fields.php#fproperty документация по списку свойств доп. поля
 */
 
/** @var CMain $APPLICATION */
global $APPLICATION;
 
$errors = array();
$info = array();
 
if(\Bitrix\Main\Loader::includeModule('iblock')){
 
    $arProperties = array(
        array(
            'NAME' => 'Величина скидки на аренду, в процентах',
            'ACTIVE' => 'Y',
            'SORT' => 500,
            'CODE' => 'RENT_SALE_PERCENT',
            'IBLOCK_ID' => 1,
            'PROPERTY_TYPE' => 'N', // Тип свойства. Возможные значения: S - строка, N - число, F - файл, L - список, E - привязка к элементам, G - привязка к группам.
        ),
    );
 
    foreach ($arProperties as $arProperty) {
 
        $resProperty = CIBlockProperty::GetList(
            array(), 
            array('CODE' => $arProperty['CODE'], 'IBLOCK_ID' => $arProperty['IBLOCK_ID'])
        );
        while($arHasProperty = $resProperty->Fetch()){
            $errors[] = sprintf("Ошибка: [2] Свойство c кодом %s уже существует.<br>\nИнформация по свойству: <pre>%s</pre>", $arProperty['CODE'], var_export($arHasProperty, true));
        }
 
        if(!empty($errors)) continue;
 
        $ibp = new CIBlockProperty;
        if(($propID = $ibp->Add($arProperty))){
            $info[] = sprintf('Информация: Свойство «%s» [%d] успешно добавлено', $arProperty['NAME'], $propID);
        }else{
            if(($ex = $APPLICATION->GetException())){
                $errors[] = sprintf('Ошибка: [3] %s', $ex->GetString());
            }
 
            if(isset($ibp->LAST_ERROR)){
                $errors[] = sprintf('Ошибка: [4] %s', $ibp->LAST_ERROR);
            }
        }
    }
 
}else{
    $errors[] = 'Ошибка: [1] Модуль информационных блоков не подключен';
}
 
echo implode("<br>\n", $errors);
echo implode("<br>\n", $info);

Список миграций доступен по тегу Миграции для 1С-Битрикс