Главная » Администрирование Битрикс » Пользователи » Импорт пользователей из CSV в Битрикс

Импорт пользователей из CSV в Битрикс

Схема программного импорта пользователей из CSV-файла в 1С-Битрикс

Перенос базы клиентов из старой системы или объединение нескольких источников контактов — типовая задача при запуске нового сайта на 1С-Битрикс. Разберём, как импортировать пользователей из CSV программно, включая пароли, группы и пользовательские поля, обходя типичные грабли большого импорта.

Формат исходного CSV

login,email,name,last_name,phone
ivan.petrov,ivan@example.ru,Иван,Петров,+79991234567
anna.sidorova,anna@example.ru,Анна,Сидорова,+79997654321

Перед импортом стоит проверить кодировку файла — CSV, выгруженный из Excel на Windows, часто оказывается в Windows-1251, тогда как сайт работает в UTF-8. Несовпадение кодировки на большом импорте проявляется не сразу заметной ошибкой, а битыми символами в именах и фамилиях, которые легко пропустить при беглой проверке.

Базовый скрипт импорта

<?php

require_once $_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_before.php';

use Bitrix\Main\Loader;

Loader::includeModule('main');

$handle = fopen('/path/to/users.csv', 'r');
$header = fgetcsv($handle, 0, ',');

$imported = 0;
$errors = [];

while (($row = fgetcsv($handle, 0, ',')) !== false) {
    $data = array_combine($header, $row);

    $existing = CUser::GetList('ID', 'ASC', ['LOGIN_EQUAL_EXACT' => $data['login']])->Fetch();

    if ($existing) {
        $errors[] = 'Логин уже существует: ' . $data['login'];
        continue;
    }

    $user = new CUser;
    $fields = [
        'LOGIN' => $data['login'],
        'EMAIL' => $data['email'],
        'NAME' => $data['name'],
        'LAST_NAME' => $data['last_name'],
        'PERSONAL_PHONE' => $data['phone'],
        'ACTIVE' => 'Y',
        'GROUP_ID' => [5], // группа "Покупатели"
        'PASSWORD' => bin2hex(random_bytes(8)), // случайный, будет сброшен
        'CONFIRM_PASSWORD' => null,
    ];
    $fields['CONFIRM_PASSWORD'] = $fields['PASSWORD'];

    $userId = $user->Add($fields);

    if ($userId) {
        $imported++;
    } else {
        $errors[] = $data['login'] . ': ' . $user->LAST_ERROR;
    }
}

fclose($handle);

echo "Импортировано: $imported\n";
echo "Ошибок: " . count($errors) . "\n";
print_r($errors);

Нужна помощь с Битрикс?





    Проверка на дубли перед созданием

    Проверка существующего логина и email перед добавлением обязательна на любом импорте — без неё повторный запуск скрипта (например, после сбоя на середине) создаст дублирующихся пользователей вместо пропуска уже перенесённых записей.

    Пароли: случайные значения плюс сброс

    При переносе из системы, не хранящей пароли в открытом виде (а хешированные пароли других систем несовместимы с форматом хеширования Битрикса), единственный правильный подход — генерация случайного пароля при импорте и последующий принудительный сброс через штатный механизм восстановления, а не попытка перенести или угадать реальный пароль пользователя.

    Массовая рассылка приглашений после импорта

    <?php
    
    foreach ($importedUserIds as $userId) {
        $user = new CUser;
        $userData = CUser::GetByID($userId)->Fetch();
    
        $user->SendPassword(['LOGIN' => $userData['LOGIN']]);
    }

    После массового импорта разумно сразу инициировать отправку писем для установки пароля каждому импортированному пользователю — иначе учётные записи остаются заблокированными для реального использования до тех пор, пока пользователь сам не запросит восстановление.

    Импорт UF-полей вместе с основными

    Пользовательские поля профиля (UF-поля) импортируются тем же вызовом Add, просто как дополнительные ключи массива полей, — но только если соответствующие поля уже созданы на целевом сайте через административную панель заранее, иначе значения будут молча проигнорированы без ошибки.

    Ограничение времени выполнения на большом импорте

    Импорт тысяч записей одним запросом упирается в ограничение времени выполнения PHP-скрипта — для действительно больших объёмов стоит либо запускать импорт с консоли, где это ограничение обычно не действует, либо разбивать процесс на пакеты с промежуточным сохранением позиции, продолжая с последней обработанной строки при повторном запуске.

    Частые ошибки

    • Кодировка CSV не совпадает с кодировкой сайта. Битые символы в именах, незаметные при поверхностной проверке.
    • Нет проверки на существующий логин перед добавлением. Повторный запуск скрипта создаёт дубли пользователей.
    • Попытка перенести хешированный пароль из другой системы. Формат хеширования несовместим — учётная запись останется нерабочей без сброса пароля.
    • UF-поля из CSV не созданы заранее на целевом сайте. Значения этих полей теряются без явной ошибки при импорте.

    Итог

    Импорт пользователей из CSV в 1С-Битрикс — простой скрипт поверх CUser::Add, но с обязательными предосторожностями: проверкой дублей перед созданием, генерацией случайного пароля вместо попытки его перенести, и заранее созданными UF-полями, если они участвуют в переносе. На больших объёмах разумно запускать импорт с консоли пакетами, а не одним запросом через веб-интерфейс.

    Нужна помощь с Битрикс?

    Исправим ошибку, доработаем сайт, ускорим Битрикс или поможем разобраться с проблемой.

    Услуги
    База знаний