Выгрузка заказов в Битрикс: живой пример на PHP
Разбираем выгрузку заказов из 1С-Битрикс в CSV на конкретном сценарии: выбираем заказы за период, достаём свойства клиента, избегаем дублей и проверяем результат перед передачей в учётную систему.

Выгрузка заказов из 1С-Битрикс в CSV кажется задачей на один запрос, но на практике данные заказа разбросаны по полям самого заказа и отдельным свойствам. Ниже — рабочий сценарий для «1С-Битрикс: Управление сайтом 25.x» и PHP 8.1: выгружаем заказы за период, добавляем телефон и e-mail покупателя, сохраняем файл в UTF-8 и проверяем, что повторный запуск не создаёт путаницу.
Задача и ограничения живого проекта
Представим интернет-магазин на 1С-Битрикс. Раз в день менеджеру нужен CSV-файл с заказами за предыдущие сутки. В каждой строке должны быть номер заказа, дата, сумма, валюта, статус, идентификатор пользователя, телефон и e-mail.
Важно разделить два понятия. Мы не «выгружаем заказ» одним большим массивом: основные поля находятся в таблице заказов, а телефон и e-mail — в значениях свойств заказа. Поэтому простой выбор полей не вернёт весь набор данных.
| Подход | Когда подходит | Цена решения |
|---|---|---|
| Экспорт из административной части | Разовая выгрузка небольшого объёма | Мало автоматизации, состав колонок зависит от возможностей конкретной версии и настроек |
| D7 API в PHP | Регулярный CSV, фильтр по датам, собственный набор полей | Нужно написать и безопасно запускать скрипт |
| Прямой SQL к таблицам | Только диагностика или специальная миграция | Легко получить неполные данные и привязаться к внутренней структуре базы |
Главная проверка выгрузки — не то, что файл открылся в Excel, а то, что его сумма и количество строк совпадают с контрольной выборкой в Битрикс.
Сноска. D7 — современный слой API 1С-Битрикс. Он скрывает детали работы с таблицами и позволяет обращаться к заказам через классы ядра, а не через ручные SQL-запросы.
Что выбрать для этого сценария
Для разового файла подойдёт административный экспорт, если в нём уже есть нужные поля. Для ежедневной выгрузки лучше использовать D7 API и запускать скрипт по расписанию. Такой вариант позволяет явно задать границы периода и формат файла.
Прямой SQL здесь не используем. У заказа есть связанные сущности, свойства и зависимости от версии ядра. Запрос к одной таблице может вернуть сумму, но потерять телефон, доставку или часть пользовательских данных.
Живой пример: экспорт заказов за сутки
1. Подготовьте доступ и тестовый период
Нужен доступ к файлам сайта и возможность запустить PHP-скрипт от имени пользователя, у которого есть права на чтение файлов Битрикс. Пример рассчитан на PHP 8.1 и D7 API в ветке 1С-Битрикс 25.x. На проекте с другой версией сначала проверьте требования конкретного релиза и протестируйте код на копии сайта.
Создайте файл export-orders.php в корне сайта. Для первого запуска укажите небольшой закрытый период, например один час, чтобы не выгрузить сразу всю историю.
2. Подключите ядро и модуль интернет-магазина
Скрипт должен загрузить пролог Битрикс из корня сайта, а затем подключить модуль sale. Если путь или модуль указаны неверно, выполнение нужно остановить, а не создавать пустой CSV.
<?php
define('NO_KEEP_STATISTIC', true);
define('NOT_CHECK_PERMISSIONS', true);
require __DIR__ . '/bitrix/modules/main/include/prolog_before.php';
use Bitrix\Main\Loader;
use Bitrix\Sale\Order;
if (!Loader::includeModule('sale')) {
throw new RuntimeException('Не удалось подключить модуль sale');
}
$from = '2025-02-01 00:00:00';
$to = '2025-02-02 00:00:00';
$outputPath = __DIR__ . '/upload/orders-export.csv';
$directory = dirname($outputPath);
if (!is_dir($directory) && !mkdir($directory, 0775, true) && !is_dir($directory)) {
throw new RuntimeException('Не удалось создать каталог для выгрузки');
}
$handle = fopen($outputPath, 'wb');
if ($handle === false) {
throw new RuntimeException('Не удалось открыть CSV для записи');
}
// BOM помогает старым версиям Excel правильно распознать UTF-8.
fwrite($handle, "\xEF\xBB\xBF");
fputcsv($handle, [
'ID',
'DATE_INSERT',
'PRICE',
'CURRENCY',
'STATUS_ID',
'USER_ID',
'PHONE',
'EMAIL',
], ';', '"', '\\');
$result = Order::getList([
'select' => [
'ID',
'DATE_INSERT',
'PRICE',
'CURRENCY',
'STATUS_ID',
'USER_ID',
],
'filter' => [
'>=DATE_INSERT' => $from,
'<DATE_INSERT' => $to,
],
'order' => [
'ID' => 'ASC',
],
]);
$exported = 0;
while ($row = $result->fetch()) {
$order = Order::load((int)$row['ID']);
if ($order === null) {
continue;
}
$phone = '';
$email = '';
$propertyCollection = $order->getPropertyCollection();
foreach ($propertyCollection as $property) {
$code = (string)$property->getField('CODE');
$value = (string)$property->getValue();
if ($code === 'PHONE') {
$phone = $value;
} elseif ($code === 'EMAIL') {
$email = $value;
}
}
fputcsv($handle, [
$row['ID'],
$row['DATE_INSERT'],
$row['PRICE'],
$row['CURRENCY'],
$row['STATUS_ID'],
$row['USER_ID'],
$phone,
$email,
], ';', '"', '\\');
$exported++;
}
fclose($handle);
echo "Выгружено заказов: {$exported}\n";
Запустите файл из корня сайта командой php export-orders.php. В результате в каталоге upload появится orders-export.csv, а в консоли — количество обработанных заказов.
3. Проверьте свойства именно на вашем сайте
Коды PHONE и EMAIL — частый вариант, но не универсальное правило. В конкретном проекте свойство могло называться USER_PHONE, иметь другой код или отсутствовать в старых заказах.
Посмотрите свойства заказа в административной части или временно выведите их коды в отдельный тестовый лог. Не отправляйте такой лог в публичную папку: в нём могут оказаться персональные данные.
4. Проверьте CSV до передачи дальше
- Откройте файл в редакторе, который умеет показывать разделитель «точка с запятой» и кодировку UTF-8.
- Сверьте количество строк с числом заказов за тот же период в административной части.
- Сложите колонку
PRICEотдельно по каждой валюте. Нельзя бездумно складывать рубли, евро и доллары в одну сумму. - Проверьте несколько заказов с разными статусами и хотя бы один заказ без телефона или e-mail.
- Убедитесь, что дата окончания периода исключается. Заказ ровно в
2025-02-02 00:00:00попадёт уже в следующий интервал.
Что обычно ломается
«Не удалось подключить модуль sale»
Скрипт запущен не из той копии сайта, неверно указан путь к прологу или модуль интернет-магазина не установлен. Проверьте, что файл находится в корне проекта и рядом есть каталог bitrix.
В CSV пустые телефон и e-mail
Чаще всего не совпадают коды свойств. Проверьте их в настройках свойств заказа. Также учитывайте, что старые заказы могли быть созданы до появления этих полей.
Выгружается слишком много данных
Проверьте границы $from и $to. Для ежедневного задания используйте полузакрытый интервал: начало включается, конец исключается. Это предотвращает повторную обработку заказа на границе двух запусков.
Файл открывается кракозябрами
Обычно проблема связана с кодировкой или разделителем. В примере записывается UTF-8 с BOM и используется точка с запятой. Если файл получает другая система, уточните её требования до смены формата.
Скрипт работает медленно на большой истории
На каждый найденный заказ вызывается Order::load(), а затем читается коллекция свойств. Это удобно для небольшого дневного диапазона, но создаёт дополнительное обращение к данным на каждый заказ. Для массовой исторической выгрузки разбейте период на дни или часы, добавьте постраничную обработку и замерьте время на тестовой копии.
Как запускать выгрузку регулярно
После ручной проверки перенесите запуск в cron или планировщик хостинга. Не делайте файл доступным по обычному URL без защиты: в CSV находятся персональные данные покупателей.
Практичный вариант — запускать выгрузку в закрытый каталог, ограничить права на файл и удалять старые выгрузки по политике хранения данных магазина. Конкретное расписание зависит от того, когда внешняя система забирает файл.
Если один и тот же CSV забирает интеграция, добавьте в процесс контроль идентификатора заказа и периода. Повторный запуск за тот же день должен либо заменять файл целиком, либо передавать данные в систему, которая умеет отбрасывать уже обработанные ID.
Что делать дальше
Сначала протестируйте скрипт на одном часовом интервале и сравните результат с административной частью. Затем вынесите даты из кода в параметры запуска, добавьте журнал с количеством строк и суммой по валютам и только после этого подключайте cron. Для проекта с десятками тысяч заказов следующим шагом станет постраничная выгрузка и отдельная стратегия обработки свойств, а не один запрос за всю историю.
Проверка рекламы на риски: Что в макете вызовет вопросы ФАС: превосходные степени, сравнения, обещания результата, маркировка.
Спросить за 40 ₽Источники: Официальная документация 1С-Битрикс: класс Order, Официальная документация 1С-Битрикс: D7 и модуль sale
Частые вопросы
Можно ли выгрузить заказы без доступа к файлам сайта?
Почему в примере не используется прямой SQL-запрос?
Что делать, если у меня другая версия Битрикс или PHP?
Почему выгрузка не находит телефон, хотя он виден в заказе?
Можно ли выгружать несколько тысяч заказов одним запуском?
Материал носит информационный характер и подготовлен редакцией «Агентуры». Он не является офертой, рекламой или индивидуальной консультацией. Упомянутые продукты, компании и торговые знаки принадлежат их правообладателям. Перед принятием решений, влекущих юридические или финансовые последствия, обратитесь к профильному специалисту.