Генерация тестовых пользователей в Битрикс

<?php
require_once($_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_admin.php');

/**
 * Фабрика тестовых пользователей для Bitrix CMS
 * Генерирует массив пользователей с рандомизированными характеристиками
 */
class UserFactory
{
    // Конфигурация генерации
    const DEFAULT_USER_COUNT = 10;
    const DEFAULT_EMAIL_PREFIX = 'test_user_';
    const DEFAULT_PASSWORD = 'securePass123!';
    const DEFAULT_GROUPS = [2]; // Группа "Все пользователи"

    /**
     * Генерирует массив пользователей
     * 
     * @param int $count - количество пользователей
     * @return array - массив объектов CUser
     */
    public static function generate(int $count = self::DEFAULT_USER_COUNT): array
    {
        $users = [];

        // Демографические данные для рандомизации
        $namePool = ['Иван', 'Алексей', 'Дмитрий', 'Сергей', 'Андрей', 'Михаил'];
        $lastNamePool = ['Иванов', 'Петров', 'Сидоров', 'Смирнов', 'Кузнецов', 'Попов'];
        $patronymicPool = ['Иванович', 'Алексеевич', 'Дмитриевич', 'Сергеевич', 'Андреевич', 'Михайлович'];
        $eyeColorPool = ['карий', 'голубой', 'зеленый', 'серый'];
        $hairColorPool = ['черный', 'русый', 'рыжий', 'белый', 'каштановый'];

        for ($i = 1; $i <= $count; $i++) {
            $user = new CUser;
            $email = self::DEFAULT_EMAIL_PREFIX . $i . '@example.com';

            $userData = [
                "NAME" => $namePool[array_rand($namePool)],
                "LAST_NAME" => $lastNamePool[array_rand($lastNamePool)],
                "SECOND_NAME" => $patronymicPool[array_rand($patronymicPool)],
                "EMAIL" => $email,
                "LOGIN" => $email,
                "PASSWORD" => self::DEFAULT_PASSWORD,
                "CONFIRM_PASSWORD" => self::DEFAULT_PASSWORD,
                "GROUP_ID" => self::DEFAULT_GROUPS,
                "ACTIVE" => "Y",
                "UF_DEPARTMENT" => [rand(1, 5)], // Подразделения
                "UF_HEIGHT" => rand(155, 195),   // Рост в см
                "UF_WEIGHT" => rand(50, 100),    // Вес в кг
                "UF_EYES_COLOR" => $eyeColorPool[array_rand($eyeColorPool)],
                "UF_HAIR_COLOR" => $hairColorPool[array_rand($hairColorPool)],
                "UF_EMPLOYEE_ID" => "ID" . str_pad($i, 6, '0', STR_PAD_LEFT),
                "WORK_COMPANY" => "Тестовая компания",
                "LID" => SITE_ID
            ];

            $users[] = [
                'object' => $user,
                'data' => $userData
            ];
        }

        return $users;
    }

    /**
     * Создает пользователей в системе
     * 
     * @param array $users - массив пользователей
     * @return array - результаты операции
     */
    public static function createUsers(array $users): array
    {
        $results = [
            'success' => 0,
            'errors' => [],
            'user_ids' => []
        ];

        foreach ($users as $user) {
            $userId = $user['object']->Add($user['data']);

            if ($userId) {
                $results['success']++;
                $results['user_ids'][] = $userId;
            } else {
                $results['errors'][] = [
                    'email' => $user['data']['EMAIL'],
                    'message' => $user['object']->LAST_ERROR
                ];
            }
        }

        return $results;
    }
}

// ===== ИСПОЛЬЗОВАНИЕ =====
try {
    // Генерация 15 тестовых пользователей
    $users = UserFactory::generate(15);

    // Создание пользователей в БД
    $creationResults = UserFactory::createUsers($users);

    // Вывод результатов
    echo "<h2>Результаты генерации:</h2>";
    echo "<p>Успешно создано: {$creationResults['success']} пользователей</p>";

    if (!empty($creationResults['errors'])) {
        echo "<h3>Ошибки:</h3>";
        foreach ($creationResults['errors'] as $error) {
            echo "<p>Пользователь {$error['email']}: {$error['message']}</p>";
        }
    }

    echo "<h3>Созданные ID:</h3>";
    echo "<pre>" . print_r($creationResults['user_ids'], true) . "</pre>";

} catch (Exception $e) {
    echo "<div class='alert alert-danger'>Ошибка: " . $e->getMessage() . "</div>";
}

require_once($_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/epilog_admin.php');

Ключевые особенности реализации:

  1. Объектно-ориентированный подход

    • Инкапсуляция логики в класс UserFactory
    • Разделение генерации данных и создания записей
  2. Конфигурируемые параметры

    const DEFAULT_USER_COUNT = 10;
    const DEFAULT_EMAIL_PREFIX = 'test_user_';
    const DEFAULT_GROUPS = [2]; // Группа "Все пользователи"
  3. Расширенные пользовательские поля (UF)

    "UF_HEIGHT" => rand(155, 195),   // Рост в см
    "UF_WEIGHT" => rand(50, 100),    // Вес в кг
    "UF_EYES_COLOR" => $eyeColorPool[array_rand($eyeColorPool)],
    "UF_EMPLOYEE_ID" => "ID" . str_pad($i, 6, '0', STR_PAD_LEFT),
  4. Комплексная обработка ошибок

    • Поэлементный учет ошибок создания
    • Структурированный вывод проблемных записей
    • Глобальная обработка исключений
  5. Безопасность

    • Использование защищенного пароля по умолчанию
    • Привязка к текущему сайту (LID => SITE_ID)
    • Административный контекст выполнения

Рекомендации по использованию:

  1. Настройка параметров

    // Пример кастомизации
    $customUsers = UserFactory::generate(5);
    foreach ($customUsers as &$user) {
       $user['data']['GROUP_ID'] = [2, 5]; // Назначение доп. групп
       $user['data']['UF_DEPARTMENT'] = [10]; // Конкретное подразделение
    }
  2. Расширение функционала

    // Добавление кастомных полей
    public static function generate(int $count): array
    {
       // ...
       $userData['UF_CUSTOM_FIELD'] = self::generateCustomValue();
       // ...
    }
  3. Интеграция с D7

    use Bitrix\Main\UserTable;
    // ...
    UserTable::add([
       'LOGIN' => $email,
       'EMAIL' => $email,
       // ...
    ]);
  4. Безопасное выполнение

    • Запуск только через административный раздел
    • Ограничение прав доступа
    • Удаление после использования

Важные замечания:

  1. Тестовые данные

    • Скрипт генерирует только тестовых пользователей
    • Не использовать в production без модификации
    • Рекомендуется удалять пользователей после тестирования
  2. Производительность

    • Для генерации >100 пользователей используйте пакетную обработку
    • Рассмотрите использование CUser::Register()
  3. Кастомизация

    • Реализация поддерживает добавление любых стандартных полей
    • Может быть расширена для работы с кастомными UF-полями

Данная реализация предоставляет гибкий инструмент для генерации тестовых пользователей в Bitrix, что особенно полезно при:

  • Разработке модулей
  • Тестировании прав доступа
  • Наполнении демо-сайтов
  • Отладке интеграций