Назад

1C-Битрикс как создать много заказов

Главная
Блог
1C-Битрикс как создать много заказов

Когда может понадобиться создание пустых заказов?

При работе с интернет-магазинами на 1С-Битрикс иногда возникают ситуации, когда требуется искусственно увеличить нумерацию заказов. Это может быть полезно в следующих случаях:

1. Миграция с другой CMS (WordPress, OpenCart, WooCommerce и др.)

  • Если вы переносите заказы из старой системы, их ID могут конфликтовать с существующими записями в Битрикс.

  • Чтобы избежать дублирования номеров, можно заранее создать резерв пустых заказов, сдвинув автоинкремент.

2. Тестирование интеграций с CRM, маркетплейсами или ERP

  • При настройке синхронизации с 1С, CRM (AmoCRM, Битрикс24) или другими сервисами важно проверить обработку заказов с разными ID.

  • Пустые заказы помогают имитировать реальные данные без создания реальных покупок.

3. Исправление сбитой нумерации заказов

  • Иногда после удаления заказов или сбоев в базе данных возникает разрыв в нумерации.

  • Создание пустых записей позволяет восстановить последовательность.

4. Подготовка к нагрузочному тестированию

  • Если нужно проверить, как система ведет себя при большом количестве заказов, можно быстро сгенерировать тестовые данные.

Почему нельзя просто изменить ID в базе данных?

Прямое редактирование auto_increment в MySQL может:

  • Нарушить целостность данных (если заказы связаны с оплатами, доставками, корзинами).

  • Привести к ошибкам в работе Битрикс, так как система использует внутренние механизмы генерации ID.

Решение: Использовать API Битрикс (CSaleOrder::Add), чтобы безопасно создать заказы, не вмешиваясь в базу вручную.

Как работает предложенный скрипт?

  1. Подключает модуль интернет-магазина (sale) – без него работа с заказами невозможна.

  2. Создает 100 (или больше) отмененных заказов с нулевой стоимостью.

  3. Автоматически увеличивает счетчик ID, позволяя избежать конфликтов при импорте.

  4. Отключает уведомления, чтобы не спамить клиентов и не вызвать блокировку почты на хостинге.

Важные нюансы:

✔ Резервная копия базы – на случай ошибок.
✔ Отключение почтовых событий – чтобы не отправлялись письма о "новых заказах".
✔ Гибкая настройка – можно менять количество, статусы и параметры заказов.

Подготовительный этап

1. Настройка окружения

// Отключаем почтовые события
CEvent::SetEventActive('SALE_NEW_ORDER', false);
CEvent::SetEventActive('SALE_ORDER_CANCEL', false);

// Отключаем обработчики событий
$eventManager = Bitrix\Main\EventManager::getInstance();
$eventManager->unRegisterEventHandler('sale', 'OnSaleOrderSaved', 'main', 'CEventMain');

2. Создание резервных копий

# Резервное копирование базы данных
mysqldump -u user -p database > backup_$(date +%Y-%m-%d).sql

# Резервное копирование файлов
tar -czvf bitrix_backup_$(date +%Y-%m-%d).tar.gz /path/to/bitrix/

Оптимизированные методы создания заказов

1. Базовый пакетный метод (до 1000 заказов)

$totalOrders = 1000;
$batchSize = 100;
$delay = 2; // секунды между пакетами

for ($batch = 0; $batch < ceil($totalOrders/$batchSize); $batch++) {
    $startTime = microtime(true);
    
    for ($i = 0; $i < $batchSize; $i++) {
        $orderNumber = $batch * $batchSize + $i;
        if ($orderNumber >= $totalOrders) break;
        
        $orderFields = [
            "LID" => "s1",
            "PERSON_TYPE_ID" => 1,
            "STATUS_ID" => "N",
            "CANCELED" => "Y",
            "PRICE" => 0,
            "CURRENCY" => "RUB",
            "USER_ID" => 1,
            // Другие обязательные поля
        ];
        
        $orderId = CSaleOrder::Add($orderFields);
        echo "Создан заказ #$orderId\n";
    }
    
    $executionTime = microtime(true) - $startTime;
    $remainingDelay = max(0, $delay - $executionTime);
    sleep($remainingDelay);
}

2. Продвинутый метод с транзакциями (1000-10 000 заказов)

$db = Bitrix\Main\Application::getConnection();
$totalOrders = 5000;
$batchSize = 250;

for ($batch = 0; $batch < ceil($totalOrders/$batchSize); $batch++) {
    $db->startTransaction();
    
    try {
        for ($i = 0; $i < $batchSize; $i++) {
            $orderNumber = $batch * $batchSize + $i;
            if ($orderNumber >= $totalOrders) break;
            
            $orderFields = [/* ... */];
            $orderId = CSaleOrder::Add($orderFields);
            
            if (!$orderId) {
                throw new Exception("Ошибка создания заказа");
            }
        }
        $db->commitTransaction();
    } catch (Exception $e) {
        $db->rollbackTransaction();
        AddMessage2Log("Ошибка: ".$e->getMessage(), "sale");
        break;
    }
    
    sleep(1);
}

3. Консольный метод для больших объемов (10 000+ заказов)

#!/usr/bin/php
<?php
// Настройка окружения
$_SERVER["DOCUMENT_ROOT"] = realpath(dirname(__FILE__)."/../../..");
require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");

// Параметры командной строки
$options = getopt("", [
    "count:",
    "batch-size:",
    "delay:",
    "log-file:"
]);

$config = [
    'total' => $options['count'] ?? 10000,
    'batch_size' => $options['batch-size'] ?? 500,
    'delay' => $options['delay'] ?? 3,
    'log_file' => $options['log-file'] ?? '/tmp/orders_creation.log'
];

// Инициализация
$db = Bitrix\Main\Application::getConnection();
$logger = new \Bitrix\Main\Diag\FileLogger($config['log_file']);

// Основной цикл обработки
for ($batch = 0; $batch < ceil($config['total']/$config['batch_size']); $batch++) {
    $startTime = microtime(true);
    $db->startTransaction();
    
    try {
        for ($i = 0; $i < $config['batch_size']; $i++) {
            $current = $batch * $config['batch_size'] + $i;
            if ($current >= $config['total']) break;
            
            $orderId = createOrder($current);
            $logger->info("Создан заказ #$orderId");
        }
        
        $db->commitTransaction();
    } catch (Exception $e) {
        $db->rollbackTransaction();
        $logger->error($e->getMessage());
        exit(1);
    }
    
    $executionTime = microtime(true) - $startTime;
    $remainingDelay = max(0, $config['delay'] - $executionTime);
    sleep($remainingDelay);
}

function createOrder($number) {
    // Логика создания одного заказа
    $orderFields = [/* ... */];
    $orderId = CSaleOrder::Add($orderFields);
    
    if (!$orderId) {
        throw new Exception("Ошибка создания заказа #$number");
    }
    
    return $orderId;
}
?>

Оптимизация производительности

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

; php.ini
max_execution_time = 0
memory_limit = 1024M

2. Оптимизация запросов

// Отключаем логирование SQL
Bitrix\Main\Application::getConnection()->disableQueryExecuting();

// Кешируем данные пользователя
$userData = Bitrix\Main\UserTable::getById(1)->fetch();

3. Параллельная обработка

# Запуск нескольких процессов
for i in {1..4}; do
    php create_orders.php --count=2500 --batch-size=200 --delay=2 &
done
wait

Постобработка и проверка

1. Включение обратно почтовых событий

CEvent::SetEventActive('SALE_NEW_ORDER', true);
CEvent::SetEventActive('SALE_ORDER_CANCEL', true);

2. Проверка целостности данных

-- Проверка количества заказов
SELECT COUNT(*) FROM b_sale_order;

-- Проверка максимального ID
SELECT MAX(ID) FROM b_sale_order;

3. Очистка тестовых данных (при необходимости)

$res = CSaleOrder::GetList([], ["CANCELED" => "Y", "PRICE" => 0]);
while ($order = $res->Fetch()) {
    CSaleOrder::Delete($order["ID"]);
}

Рекомендации по масштабированию

Объем заказов Метод Оптимальные параметры Время выполнения
100-1 000 Веб-интерфейс Пакеты по 50-100, задержка 1с 2-10 минут
1 000-10 000 Консольный скрипт Пакеты по 200-500, задержка 2с 10-60 минут
10 000+ Фоновые workers/очереди Параллельная обработка 1-5 часов

Заключение

Представленные методы позволяют безопасно создавать любое количество тестовых заказов в Битрикс, от десятков до сотен тысяч. Для максимальной производительности:

  1. Используйте консольные скрипты для больших объемов

  2. Оптимизируйте настройки сервера и базы данных

  3. Регулярно проверяйте целостность данных

  4. Всегда делайте резервные копии перед массовыми операциями

Для сложных сценариев рекомендуется использовать специализированные модули или обращаться к сертифицированным партнерам Битрикс.

Нужен надежный исполнитель?
Разрабатываем сайты, выполняем миграцию на Битрикс, дорабатываем функционал, сопровождаем проекты, а также занимаемся поисковым продвижением и комплексным маркетингом
Получить консультацию
Читайте по теме
Все статьи
Нужен надежный исполнитель?
Разрабатываем сайты, выполняем миграцию на Битрикс, дорабатываем функционал, сопровождаем проекты, а также занимаемся поисковым продвижением и комплексным маркетингом
Получить консультацию
Все статьи