Реализация экспорта товаров из сайта в 1С (CommerceML)
Если импорт из 1С — это синхронизация каталога на сайт, то экспорт — обратная задача: передача заказов, остатков или данных о клиентах обратно в 1С. Часто требуется в интернет-магазинах, где 1С — система учёта, а сайт — точка продажи.
Что передаётся в 1С
Наиболее распространённые сценарии:
| Данные | CommerceML файл | Периодичность |
|---|---|---|
| Новые заказы | sale.xml |
По событию / каждые N минут |
| Изменения статусов заказов | sale.xml |
По событию |
| Остатки на сайте | offers.xml |
По расписанию |
| Клиенты (покупатели) | import.xml |
По расписанию |
Протокол обмена (сторона сайта)
1С запрашивает данные по протоколу CommerceML2:
GET /1c-exchange/?type=sale&mode=checkauth
GET /1c-exchange/?type=sale&mode=init
GET /1c-exchange/?type=sale&mode=query — получить список заказов
POST /1c-exchange/?type=sale&mode=success — подтверждение получения
GET /1c-exchange/?type=sale&mode=file&filename=sale.xml — скачать файл
Генерация sale.xml
class SaleXmlGenerator
{
public function generate(Collection $orders): string
{
$xml = new \DOMDocument('1.0', 'UTF-8');
$root = $xml->createElement('КоммерческаяИнформация');
$root->setAttribute('ВерсияСхемы', '2.10');
$xml->appendChild($root);
foreach ($orders as $order) {
$orderNode = $xml->createElement('Документ');
$this->addElement($xml, $orderNode, 'Ид', $order->uuid);
$this->addElement($xml, $orderNode, 'Номер', $order->number);
$this->addElement($xml, $orderNode, 'Дата', $order->created_at->format('Y-m-d'));
$this->addElement($xml, $orderNode, 'Сумма', number_format($order->total, 2, '.', ''));
$this->addElement($xml, $orderNode, 'Валюта', 'RUB');
// Контрагент
$client = $xml->createElement('Контрагенты');
$agent = $xml->createElement('Контрагент');
$this->addElement($xml, $agent, 'Наименование', $order->customer_name);
$this->addElement($xml, $agent, 'Роль', 'Покупатель');
$client->appendChild($agent);
$orderNode->appendChild($client);
// Товары
$products = $xml->createElement('Товары');
foreach ($order->items as $item) {
$product = $xml->createElement('Товар');
$this->addElement($xml, $product, 'Ид', $item->product->onec_guid);
$this->addElement($xml, $product, 'Наименование', $item->product->name);
$this->addElement($xml, $product, 'Количество', $item->quantity);
$this->addElement($xml, $product, 'ЦенаЗаЕдиницу', number_format($item->price, 2, '.', ''));
$this->addElement($xml, $product, 'Сумма', number_format($item->total, 2, '.', ''));
$products->appendChild($product);
}
$orderNode->appendChild($products);
$root->appendChild($orderNode);
}
return $xml->saveXML();
}
}
Подтверждение получения заказов
1С после успешного получения отправляет список GUID обработанных заказов. Сайт помечает их как переданные в 1С:
public function markAsSent(Request $request): Response
{
$guids = explode("\n", $request->getContent());
Order::whereIn('uuid', array_filter($guids))
->update(['sent_to_1c' => true, 'sent_to_1c_at' => now()]);
return response('success');
}
Обновление статусов из 1С
1С может возвращать статусы обработки заказов (оплачен, отгружен, отменён). Сайт принимает обновлённые заказы через POST /1c-exchange/?type=sale&mode=file:
public function processSaleResponse(string $xmlPath): void
{
$xml = simplexml_load_file($xmlPath);
foreach ($xml->Документ as $doc) {
$guid = (string) $doc->Ид;
$status = (string) $doc->Статус;
Order::where('uuid', $guid)->update([
'status' => $this->mapOnecStatus($status),
'onec_status' => $status,
'status_updated_at' => now(),
]);
}
}
private function mapOnecStatus(string $onecStatus): string
{
return match($onecStatus) {
'Оплачен' => 'paid',
'Передан на склад' => 'processing',
'Отгружен' => 'shipped',
'Отменён' => 'cancelled',
default => 'unknown',
};
}
Типичные сложности
- Пустые GUID товаров — если товар создан на сайте, а не импортирован из 1С, его GUID в 1С неизвестен. Нужна логика создания нового товара в 1С или сопоставление по артикулу
- Кодировка — некоторые версии 1С требуют файлы в Windows-1251
- Тестирование — нужен доступ к тестовой базе 1С клиента на этапе разработки
Сроки
Экспорт заказов в 1С с подтверждением получения и обновлением статусов: 8–14 рабочих дней.







