Когда может понадобиться создание пустых заказов?
При работе с интернет-магазинами на 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), чтобы безопасно создать заказы, не вмешиваясь в базу вручную.
Как работает предложенный скрипт?
-
Подключает модуль интернет-магазина (
sale) – без него работа с заказами невозможна. -
Создает 100 (или больше) отмененных заказов с нулевой стоимостью.
-
Автоматически увеличивает счетчик ID, позволяя избежать конфликтов при импорте.
-
Отключает уведомления, чтобы не спамить клиентов и не вызвать блокировку почты на хостинге.
Важные нюансы:
✔ Резервная копия базы – на случай ошибок.
✔ Отключение почтовых событий – чтобы не отправлялись письма о "новых заказах".
✔ Гибкая настройка – можно менять количество, статусы и параметры заказов.
Подготовительный этап
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 = 1024M2. Оптимизация запросов
// Отключаем логирование 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 часов |
Заключение
Представленные методы позволяют безопасно создавать любое количество тестовых заказов в Битрикс, от десятков до сотен тысяч. Для максимальной производительности:
-
Используйте консольные скрипты для больших объемов
-
Оптимизируйте настройки сервера и базы данных
-
Регулярно проверяйте целостность данных
-
Всегда делайте резервные копии перед массовыми операциями
Для сложных сценариев рекомендуется использовать специализированные модули или обращаться к сертифицированным партнерам Битрикс.