Продолжая тему кусков кода для миграций на 1С-Битрикс представляю код миграции для пользователей и их групп. Для групп пользователей есть возможность установить права доступа к модулям и инфоблокам.

Код миграции

//<?php
 
$errors = array();
 
/**
 * Список групп пользователей
 * Доступно добавление/обновление групп пользователей
 *
 * 1. В массиве MODULES_PERMISSIONS указываем права к административным частям модулей
 * 2. В массиве IBLOCK_PERMISSIONS права доступа к инфоблокам array(iblock_id => permission)
 *
 * И MODULES_PERMISSIONS и IBLOCK_PERMISSIONS не перезапишут текущие значения, а допишут новыми значениями
 */
$groups = array(
    array(
        'NAME' => 'Olegpro',
        'STRING_ID' => 'OLEGPRO',
    ),
    array(
        'NAME' => 'Bitrix',
        'STRING_ID' => 'BITRIX',
    ),
    array(
        'NAME' => 'Интеграция с 1С',
        'STRING_ID' => '1C_EXCHANGE',
    ),
    array(
        'NAME' => 'Администраторы интернет-магазина',
        'MODULES_PERMISSIONS' => array(
            array('sale', 'U'),
            array('sender', 'R'),
        ),
        'IBLOCK_PERMISSIONS' => array(
            163 => 'W',
        ),
    ),
 
);
 
/**
 * Список пользователей
 * Поиск уже существующих пользователей осуществляется по логину.
 * В массиве групп указываем не ID групп, а их имена (потому что ID на dev/prod серверах могут отличаться)
 */
$users = array(
    array(
        'NAME' => 'Олег',
        'LAST_NAME' => '',
        'EMAIL' => 'email@site.ru',
        'LOGIN' => 'email@site.ru',
        'LID' => 'ru',
        'ACTIVE' => 'Y',
        'GROUP_ID' => array('Olegpro', 'Администраторы интернет-магазина'),
        'PASSWORD' => '123456',
        'CONFIRM_PASSWORD' => '123456',
    ),
 
    array(
        'LOGIN' => 'admin',
        'GROUP_ID' => array('Olegpro'),
    ),
 
    array(
        'LOGIN' => 'test',
        'GROUP_ID' => array('Bitrix'),
    ),
 
);
 
\Bitrix\Main\Loader::includeModule('iblock');
 
foreach ($groups as $key => $groupFields) {
 
    if(!isset($groupFields['NAME'])) continue;
 
    $groupPermissions = array();
    if(isset($groupFields['MODULES_PERMISSIONS']) && is_array($groupFields['MODULES_PERMISSIONS'])) {
        $groupPermissions = $groupFields['MODULES_PERMISSIONS'];
        unset($groupFields['MODULES_PERMISSIONS']);
    }
 
    $iblockPermissions = array();
    if(isset($groupFields['IBLOCK_PERMISSIONS']) && is_array($groupFields['IBLOCK_PERMISSIONS'])) {
        $iblockPermissions = $groupFields['IBLOCK_PERMISSIONS'];
        unset($groupFields['IBLOCK_PERMISSIONS']);
    }
 
    $g = new CGroup();
 
    $newGroupId = 0;
    $groupIterator = CGroup::GetList(
        ($by = ''),
        ($order = ''),
        array(
            'NAME' => $groupFields['NAME']
        )
    );
    if($group = $groupIterator->Fetch()) {
        $newGroupId = $group['ID'];
 
        if(!($g->Update($newGroupId, $groupFields))) {
            $errors[] = sprintf('Ошибка обновления группы пользователей [%s]: %s', $groupFields['NAME'], $g->LAST_ERROR);
        }
    }else{
        if(!($newGroupId = $g->Add($groupFields))) {
            $errors[] = sprintf('Ошибка добавления группы пользователей [%s]: %s', $groupFields['NAME'], $g->LAST_ERROR);
        }
    }
 
    // Устанавливаем права к административным частям модулей
    if(is_array($groupPermissions)) {
        foreach($groupPermissions as $groupPermission) {
            $oldPermission = CGroup::GetModulePermission($newGroupId, $groupPermission[0]);
 
            if($oldPermission !== $groupPermission[1]) {
                CGroup::SetModulePermission($newGroupId, $groupPermission[0], $groupPermission[1]);
            }
        }
    }
 
    // Устанавливаем права доступа к инфоблокам
    if(is_array($iblockPermissions)) {
        foreach($iblockPermissions as $iblockId => $permission) {
            $oldPermissions = $newPermissions = CIBlock::GetGroupPermissions($iblockId);
 
            $newPermissions[$newGroupId] = $permission;
 
            if($oldPermissions !== $newPermissions) {
                CIBlock::SetPermission($iblockId, $newPermissions);
            }
        }
    }
 
    $groups[$key] = false;
    unset($groups[$key]);
 
    $groupFields['ID'] = $newGroupId;
 
    $groups[$groupFields['NAME']] = $groupFields;
 
}
unset($key, $groupFields);
 
if(!empty($errors)) {
    echo '<pre>';print_r($errors);echo '</pre>';
    return '';
    die();
}
 
foreach ($users as $key => $userFields) {
 
    if(!isset($userFields['LOGIN'])) continue;
 
    $u = new CUser();
 
    $newUserId = 0;
    $userIterator = CUser::GetList(
        ($by = ''),
        ($order = ''),
        array(
            'LOGIN_EQUAL' => $userFields['LOGIN']
        ),
        array(
            'SELECT' => array('UF_*'),
            'FIELDS' => array('ID', 'EMAIL', 'LOGIN')
        )
    );
    if($user = $userIterator->Fetch()) {
        $newUserId = $user['ID'];
    }else{
        if(!($newUserId = $u->Add($userFields))) {
            $errors[] = sprintf('Ошибка добавления пользователя [%s]: %s', $userFields['LOGIN'], $u->LAST_ERROR);
        }
    }
 
 
    if($newUserId > 0) {
 
        $userGroups = CUser::GetUserGroup($newUserId);
        foreach ($userFields['GROUP_ID'] as $keyGroupId => $groupName) {
            if(isset($groups[$groupName])) {
                $userGroups[] = $groups[$groupName]['ID'];
            }
        }
 
        $userFields['GROUP_ID'] = array_unique($userGroups);
 
        if(!($u->Update($newUserId, $userFields))) {
            $errors[] = sprintf('Ошибка обновления пользователя [%s]: %s', $userFields['LOGIN'], $u->LAST_ERROR);
        }
 
    }
 
    $users[$key] = $userFields;
 
}
unset($key, $userFields);
 
if(!empty($errors)) {
    echo '<pre>';print_r($errors);echo '</pre>';
}else{
    echo 'Готово.';
}

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