Обмен с 1С и интеграции в 1С-Битрикс - CommerceML, HttpClient
Граница системы: точки, где данные сайта встречаются с 1С, маркетплейсами и чужими API. Разберём обмен по CommerceML - самую частую интеграцию в проектах на 1С-Битрикс - и штатный клиент для исходящих запросов.
Как это работает
Обмен идёт между модулем на стороне 1С и сайтом. Формат данных - CommerceML, единый XML-стандарт обмена коммерческой информацией. На стороне сайта техническая точка входа одна - служебный скрипт обмена в административном разделе. Его адрес прописывают в настройке обмена в 1С вместе с логином и паролем пользователя, имеющего право на обмен.
Понятийное соответствие, без которого сложно понять, что куда попадёт: контрагенты 1С становятся пользователями сайта, справочники - highload-блоками, номенклатура - товарами, характеристики товара - торговыми предложениями.
Что умеет обмен: выгрузку каталога и прайс-листов из 1С, обновление товаров, цен и остатков по расписанию, приём и обработку заказов в 1С, передачу покупателю статусов заказа.
Направления настраиваются независимо: выгрузка номенклатуры, выгрузка справочников, обмен документами, выгрузка контрагентов. Порядок операций, число повторных попыток и интервал задаются в настройках обмена.
Три режима синхронизации: реальное время, по расписанию и только вручную. Реальное время доступно только для клиент-серверного варианта базы 1С - на файловой базе сеанс блокируется на время мониторинга.
Контроль изменений. Выгрузка бывает полной или только изменённых объектов. Отдельный флаг решает судьбу товаров, не попавших в полную выгрузку. Для ускорения включают контрольные суммы элементов - тогда обновляются только реально изменившиеся позиции.
Служебные артефакты. Логи и XML-протоколы складываются в каталог загрузок, а связка объектов между 1С и сайтом хранится в таблице идентификаторов. Эту таблицу трогать нельзя.
Примеры
1. Исходящий запрос к чужому API
use Bitrix\Main\Web\HttpClient;use Bitrix\Main\Web\Json;
$http = new HttpClient([ 'socketTimeout' => 5, 'streamTimeout' => 10,]);$http->setHeader('Content-Type', 'application/json');$http->setHeader('Authorization', 'Bearer ' . $token);
$body = $http->post($url, Json::encode(['order_id' => $orderId]));
if ($body === false) { $logger->error('Transport error', ['error' => $http->getError()]); return;}
if ($http->getStatus() !== 200) { $logger->warning('Unexpected status', ['status' => $http->getStatus()]); return;}
$data = Json::decode($body);Три обязательные вещи: явные таймауты, раздельная проверка транспортной ошибки и HTTP-статуса, и разбор ответа только после этих проверок. Непустое тело ответа успехом не является.
Если адрес запроса приходит от пользователя, включайте защиту от обращений во внутреннюю сеть.
2. Свой эндпоинт для внешней системы
Современный способ - контроллер с объявленным маршрутом: он даёт типизированные аргументы, фильтры доступа и единый формат ответа. Легаси-вариант - отдельный скрипт, но тогда проверку прав, метода и токена придётся делать вручную.
#[Authentication]#[HttpMethod([HttpMethod::METHOD_POST])]public function statusAction(int $orderId, string $status): array{ $result = $this->service->updateStatus($orderId, $status);
return ['success' => $result->isSuccess()];}Справочник
| Элемент | Назначение | Особенности |
|---|---|---|
| Служебный скрипт обмена | точка входа для 1С | адрес прописывается в настройке обмена |
| CommerceML | формат обмена | XML-стандарт коммерческой информации |
| Режимы синхронизации | реальное время, расписание, вручную | реальное время только для клиент-серверной базы |
| Полная и частичная выгрузка | контроль изменений | флаг деактивации непопавших товаров |
| Контрольные суммы элементов | ускорение импорта | обновляются только изменившиеся |
| Идентификаторы объектов | связка 1С и сайта | удалять нельзя - появятся дубли |
| Журнал ошибок обмена | диагностика | пишется только при включённом флаге |
Web\HttpClient | исходящие запросы | таймауты, статус, защита от обращений внутрь сети |
Web\Json | кодирование и разбор JSON | |
| Контроллер с маршрутом | свой эндпоинт | фильтры доступа и единый формат ответа |
Частые ошибки
Обмен не отвечает на запросы 1С. Частая причина - включённый режим правки сайта без перезагрузки страницы.
Сбой авторизации на CGI-варианте PHP. Заголовок авторизации не доходит до скрипта - нужен проброс на уровне веб-сервера.
Дубли товаров и заказов после обмена. Обычно следствие ручного удаления записей связки объектов: 1С перестаёт узнавать существующие объекты и создаёт их заново.
После обмена пропали товары. Сработал флаг деактивации товаров при неполной выгрузке.
Товар не выгружается. Позиция без цены, включая вычисляемую по формуле, не попадает в выгрузку - цену задают явно.
Журнал ошибок пустой при явных сбоях. Не включено хранение информации об ошибках.
Два обмена запущены одновременно. Процедуры конфликтуют на временных таблицах
- параллельный запуск недопустим.
Внешний запрос считают успешным по непустому ответу. Проверять нужно и транспортную ошибку, и статус ответа.
Частые вопросы
Откуда начинать диагностику обмена с 1С?
С трёх вещей: доступен ли служебный скрипт обмена по адресу, указанному в 1С; проходит ли авторизация пользователя, от имени которого идёт обмен; включено ли хранение информации об ошибках - иначе журнал будет пустым при реальных сбоях. Дальше смотрят логи и XML-протоколы, которые 1С складывает в каталог загрузок.
Почему после обмена задвоились товары?
Почти всегда потому, что потеряна связка объектов между 1С и сайтом - её хранит служебная таблица идентификаторов. Если её очистили вручную или восстановили базу частично, 1С перестаёт узнавать существующие позиции и создаёт новые. Восстановить связку постфактум сложно, поэтому таблицу идентификаторов не трогают.
Какой режим синхронизации выбрать?
Реальное время подходит только для клиент-серверного варианта базы 1С и там, где изменения должны попадать на сайт немедленно. На файловой базе сеанс блокируется на время мониторинга, поэтому обычно выбирают расписание. Ручной режим оставляют для первичной загрузки и разовых операций.
Чем делать исходящие запросы к внешним API?
Штатным HTTP-клиентом платформы, а не файловыми функциями или прямыми вызовами curl. Он даёт таймауты, работу с заголовками, скачивание в файл и режим защиты от обращений во внутреннюю сеть. Главное - задавать таймауты явно и проверять раздельно транспортную ошибку и HTTP-статус: непустой ответ не означает успех.
Связанные темы
- Обмен сообщениями - SMS и очереди
- Real-time (Pull) - мгновенные события
- Ядро D7 - контроллеры и HTTP-клиент
- Каталог и продажи - что приезжает из 1С
- Обмен: выгрузка товаров - решения по выгрузке каталога
- Выгрузка товаров из 1С на сайт - настройка узла, размер пачки и защита правок
- Выгрузка свойств товара из 1С - как реквизиты 1С становятся свойствами инфоблока
- Не выгружаются товары из 1С - что проверять, когда обмен прошёл, а товаров нет
- Структура каталога при выгрузке из 1С - как группы номенклатуры становятся разделами
- Ошибка импорта метаданных - обмен падает на первом шаге
- Выгрузка торговых предложений из 1С - предложения приезжают отдельной пачкой после товаров
- Обмен: заказы - заказы уезжают в 1С и возвращаются со статусом
- Обмен заказами с 1С - настройка, дубли и возврат статусов
- Не выгружаются цены и остатки из 1С - цены идут отдельным файлом после номенклатуры
- Статусы заказов - сопоставление статусов с учётной системой
- Картинки при обмене - изображения товаров из учётной системы
- Вебхуки и вызовы REST: настройка, права, разбор ошибок - вызовы снаружи и события наружу
- REST и вебхуки - решения по вызовам REST
- Выгрузка цен из 1С: типы цен, единицы, частичный обмен - шаг обмена с ценами и остатками
- Цены при обмене - решения по ценам в обмене
- Настройка обмена с 1С: точка обмена, доступ, порядок шагов - первый запуск обмена
- Настройка обмена - решения по запуску обмена
- Каталог с сайта в 1С: обратное направление выгрузки - пределы штатного обмена каталогом
- Раздел Интеграции