На примере создания инфоблока баннеров.

/**
 * Описываем свойства нового типа инфоблока
 */
$arFieldsIblockType = Array(
    'ID' => 'banners',
    'SECTIONS' => 'N',
    'IN_RSS' => 'N',
    'SORT' => 900,
    'LANG' => array(
        'ru' => array(
            'NAME' => 'Баннеры',
            'SECTION_NAME' => 'Баннеры',
            'ELEMENT_NAME' => 'Баннеры',
        ),
        'en' => array(
            'NAME' => 'Banners',
            'SECTION_NAME' => 'Banners',
            'ELEMENT_NAME' => 'Banners'
        ),
    )
);
 
/**
 * Описываем свойства нового инфоблока
 */
$arFieldsIblock = array(
    'VERSION' => 2,
    'ACTIVE' => 'Y',
    'NAME' => 'Баннеры',
    'IBLOCK_TYPE_ID' => 'banners',
    'CODE' => 'banners',
    'SITE_ID' => array('s1'),
    'SORT' => 500,
    'GROUP_ID' => array(2 => 'R'),
    'LIST_MODE' => 'C',
    'WORKFLOW' => 'N',
    'INDEX_ELEMENT' => 'N',
    'INDEX_SECTION' => 'N',
    'RSS_ACTIVE' => 'N',
    'XML_ID' => 'banners',
    'LIST_PAGE_URL' => '/#IBLOCK_CODE#/',
    'SECTION_PAGE_URL' => '/#IBLOCK_CODE#/#SECTION_CODE_PATH#/',
    'DETAIL_PAGE_URL' => '/#IBLOCK_CODE#/#SECTION_CODE_PATH#/#ELEMENT_CODE#.html',
    'FIELDS' => array(
        'ACTIVE_FROM' => array(
            'IS_REQUIRED' => 'Y',
            'DEFAULT_VALUE' => '=now',
        ),
        'ACTIVE_TO' => array(
            'IS_REQUIRED' => 'Y',
            'DEFAULT_VALUE' => '60',
        ),
        'DETAIL_PICTURE' => array(
            'IS_REQUIRED' => 'Y',
        ),
        'CODE' => array(
            'IS_REQUIRED' => 'N',
            'DEFAULT_VALUE' => array(
                'UNIQUE' => 'Y',
            ),
        ),
        'IBLOCK_SECTION' => array(
            'IS_REQUIRED' => 'N',
        ),
        'SECTION_CODE' => array(
            'IS_REQUIRED' => 'N',
            'DEFAULT_VALUE' => array(
                'TRANSLITERATION' => 'Y',
                'UNIQUE' => 'Y',
                'TRANS_CASE' => 'L',
                'TRANS_SPACE' => '-',
                'TRANS_OTHER' => '-',
            ),
        ),
    ),
    'IS_CATALOG' => 'N',
    'VAT_ID' => '',
);
 
/**
 * Описываем поля свойств нового нужных инфоблоков
 */
$arProperties = array(
    array(
        'NAME' => 'Тип баннера',
        'ACTIVE' => 'Y',
        'SORT' => 500,
        'CODE' => 'TYPE_BANNER',
        'IBLOCK_ID' => '{NEW_IBLOCK_ID}',
        'PROPERTY_TYPE' => 'L',
        'IS_REQUIRED' => 'Y',
        'FILTRABLE' => 'Y',
        'VALUES' => array(
            array(
                'XML_ID' => 'ON_MAIN_PAGE',
                'VALUE' => 'На главной странице',
                'DEF' => 'N',
                'SORT' => 100,
            ),
            array(
                'XML_ID' => 'ON_CATALOG_PAGE',
                'VALUE' => 'На странице каталога',
                'DEF' => 'N',
                'SORT' => 200,
            ),
        )
    ),
);
 
 
// logic
 
function oGetMessage($key, $fields)
{
    $messages = array(
        'A_AM_NEW_IBLOCK_TYPE_MESSAGE_ADDED' => 'Тип информационного блока «#IBLOCK_TYPE#» успешно добавлен',
        'A_AM_NEW_IBLOCK_TYPE_MESSAGE_UPDATE' => 'Тип информационного блока «#IBLOCK_TYPE#» успешно обновлён',
 
        'A_AM_NEW_IBLOCK_MESSAGE_ADDED' => 'Информационный блок «#IBLOCK#» [#ID#] успешно добавлен',
        'A_AM_NEW_IBLOCK_MESSAGE_UPDATE' => 'Информационный блок «#IBLOCK#» [#ID#] успешно обновлён',
        'A_AM_NEW_IBLOCK_MESSAGE_ERROR' => 'Ошибка добавления информационного блока «#IBLOCK#»: #ERROR#',
        'A_AM_NEW_IBLOCK_MESSAGE_ERROR_UPDATE' => 'Ошибка обновления информационного блока «#IBLOCK#»: #ERROR#',
        'A_AM_NEW_IBLOCK_MESSAGE_EXISTS' => 'Инфоблок «#IBLOCK#» уже существует',
 
        'A_AM_NEW_IBLOCK_PROP_MESSAGE_UPDATE' => 'Свойство «#NAME#» [#ID#] успешно обновлено',
        'A_AM_NEW_IBLOCK_PROP_MESSAGE_UPDATE_ERROR' => 'Ошибка обновления свойства «#NAME#» [#ID#]: #ERROR#',
 
        'A_AM_NEW_IBLOCK_PROP_MESSAGE_ADDED' => 'Свойство «#NAME#» [#ID#] успешно добавлено',
        'A_AM_NEW_IBLOCK_PROP_MESSAGE_ADDED_ERROR' => 'Ошибка добавления свойства «#NAME#»: #ERROR#',
    );
    return isset($messages[$key])
        ? str_replace(array_keys($fields), array_values($fields), $messages[$key])
        : '';
}
 
 
global $DB;
 
$DB->StartTransaction();
 
try {
    \Bitrix\Main\Loader::includeModule('iblock');
 
    $info = array();
 
    // {{{ Add type
    $boolIblockExists = false;
 
    $iblockTypeIterator = \Bitrix\Iblock\TypeTable::getById('banners');
    if (($iblockType = $iblockTypeIterator->fetch())) {
        $boolIblockExists = true;
    }
 
    $obBlockType = new CIBlockType;
 
    if ($boolIblockExists) {
        if ($obBlockType->Update($arFieldsIblockType['ID'], $arFieldsIblockType)) {
            $info[] = oGetMessage('A_AM_NEW_IBLOCK_TYPE_MESSAGE_UPDATE', array(
                '#IBLOCK_TYPE#' => $arFieldsIblockType['LANG']['ru']['NAME'],
            ));
        } else {
            throw new \Bitrix\Main\SystemException(oGetMessage('A_AM_NEW_IBLOCK_TYPE_MESSAGE_ERROR_UPDATE', array(
                '#ERROR#' => $obBlockType->LAST_ERROR,
            )));
        }
    } else {
        $res = $obBlockType->Add($arFieldsIblockType);
        if ($res) {
            $info[] = oGetMessage('A_AM_NEW_IBLOCK_TYPE_MESSAGE_ADDED', array(
                '#IBLOCK_TYPE#' => $arFieldsIblockType['LANG']['ru']['NAME'],
            ));
        } else {
            throw new \Bitrix\Main\SystemException(oGetMessage('A_AM_NEW_IBLOCK_TYPE_MESSAGE_ERROR', array(
                '#ERROR#' => $obBlockType->LAST_ERROR,
            )));
        }
    }
    // }}}
 
    // {{{ Add iblock
    $newIBlockId = 0;
    $iblockIterator = \Bitrix\Iblock\IblockTable::getList(array(
        'filter' => array(
            '=IBLOCK_TYPE_ID' => 'banners',
        )
    ));
    if (($iblock = $iblockIterator->fetch())) {
        $newIBlockId = $iblock['ID'];
    }
 
    $obIBlock = new CIBlock;
 
    if (intval($newIBlockId) > 0) {
 
        if ($obIBlock->Update($newIBlockId, $arFieldsIblock)) {
            $info[] = oGetMessage('A_AM_NEW_IBLOCK_MESSAGE_UPDATE', array(
                '#IBLOCK#' => $arFieldsIblock['NAME'],
                '#ID#' => intval($newIBlockId),
            ));
        } else {
            throw new \Bitrix\Main\SystemException(oGetMessage('A_AM_NEW_IBLOCK_MESSAGE_ERROR_UPDATE', array(
                '#ERROR#' => $obIBlock->LAST_ERROR,
            )));
        }
 
    } else {
 
        $res = $obIBlock->Add($arFieldsIblock);
 
        if ($res) {
            $newIBlockId = intval($res);
            $info[] = oGetMessage('A_AM_NEW_IBLOCK_MESSAGE_ADDED', array(
                '#IBLOCK#' => $arFieldsIblock['NAME'],
                '#ID#' => $newIBlockId,
            ));
        } else {
            throw new \Bitrix\Main\SystemException(oGetMessage('A_AM_NEW_IBLOCK_MESSAGE_ERROR', array(
                '#ERROR#' => $obIBlock->LAST_ERROR,
            )));
        }
    }
    // }}}
 
 
    // {{{ Add Iblock Props
    foreach ($arProperties as $arProperty) {
 
        $arProperty['IBLOCK_ID'] = str_replace('{NEW_IBLOCK_ID}', $newIBlockId, $arProperty['IBLOCK_ID']);
 
        $ibp = new CIBlockProperty();
 
        $resProperty = CIBlockProperty::GetList(
            array(),
            array(
                'CODE' => $arProperty['CODE'],
                'IBLOCK_ID' => $arProperty['IBLOCK_ID']
            )
        );
        if ($arHasProperty = $resProperty->Fetch()) {
 
            if ($ibp->Update($arHasProperty['ID'], $arProperty)) {
                $info[] = oGetMessage('A_AM_NEW_IBLOCK_PROP_MESSAGE_UPDATE', array(
                    '#NAME#' => $arProperty['NAME'],
                    '#ID#' => $arHasProperty['ID'],
                ));
            } else {
                if (($ex = $APPLICATION->GetException())) {
                    throw new \Bitrix\Main\SystemException(oGetMessage('A_AM_NEW_IBLOCK_PROP_MESSAGE_UPDATE_ERROR', array(
                        '#ERROR#' => $ex->GetString(),
                        '#NAME#' => $arProperty['NAME'],
                        '#ID#' => $arHasProperty['ID'],
                    )));
                } elseif (isset($ibp->LAST_ERROR)) {
                    throw new \Bitrix\Main\SystemException(oGetMessage('A_AM_NEW_IBLOCK_PROP_MESSAGE_UPDATE_ERROR', array(
                        '#ERROR#' => $ibp->LAST_ERROR,
                        '#NAME#' => $arProperty['NAME'],
                        '#ID#' => $arHasProperty['ID'],
                    )));
                }
            }
 
        } else {
 
            if (($propID = $ibp->Add($arProperty))) {
                $info[] = oGetMessage('A_AM_NEW_IBLOCK_PROP_MESSAGE_ADDED', array(
                    '#NAME#' => $arProperty['NAME'],
                    '#ID#' => $propID,
                ));
            } else {
                if (($ex = $APPLICATION->GetException())) {
                    throw new \Bitrix\Main\SystemException(oGetMessage('A_AM_NEW_IBLOCK_PROP_MESSAGE_ADDED_ERROR', array(
                        '#NAME#' => $arProperty['NAME'],
                        '#ERROR#' => $ex->GetString(),
                    )));
                } elseif (isset($ibp->LAST_ERROR)) {
                    throw new \Bitrix\Main\SystemException(oGetMessage('A_AM_NEW_IBLOCK_PROP_MESSAGE_ADDED_ERROR', array(
                        '#NAME#' => $arProperty['NAME'],
                        '#ERROR#' => $ibp->LAST_ERROR,
                    )));
                }
            }
 
        }
 
    }
 
    $DB->Commit();
 
    echo implode("<br>\n", $info);
 
} catch (\Bitrix\Main\SystemException $e) {
 
    $DB->Rollback();
 
    echo sprintf("%s<br>\n%s",
        $e->getMessage(),
        implode("<br>\n", $info)
    );
 
}
 
// }}}

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