Как ускорить обмен между 1С и сайтом на «1С-Битрикс»

Схема ускорения обмена между 1С и сайтом на Битрикс
Содержание 22 разделов

Разбираем, почему штатный CommerceML-обмен замедляется на больших каталогах и как это исправить — от настройки регламента до перехода на REST API

В чём проблема и кому полезна статья

Интернет-магазин на «1С-Битрикс» получает из 1С почти всё: цены, остатки, структуру каталога, статусы заказов, контрагентов. Когда обмен настроен «по умолчанию» и без разбора работает по несколько часов, это не абстрактная техническая деталь — это устаревшие цены во время акции, минус на складе, зависший сайт в момент, когда 1С забирает или отдаёт большой пакет данных. Материал будет полезен владельцам интернет-магазинов на «1С-Битрикс», техническим руководителям, которые получили жалобу «сайт тормозит после обмена», и разработчикам, которым предстоит разобраться в чужой интеграции.

Как устроен обмен 1С и Битрикс

CommerceML 2: кто кого опрашивает и какими файлами

Обмен данными сайта с 1С выполняется в соответствии с правилами и форматами, описанными в стандарте CommerceML 2, а инициатором обмена всегда выступает система «1С:Предприятие» [1]. Это значит, что сайт не «ходит» в 1С — он лишь отвечает на запросы, которые присылает 1С по расписанию или вручную. Технически это HTTP-обмен, где существует два формата: текстовые HTTP-запросы для служебных команд и CommerceML2 — обмен xml-подобными файлами [2].

Полный обмен состоит из последовательности файлов: описание структуры каталога и свойств (import.xml), торговые предложения (offers.xml), цены (prices.xml), остатки (rests.xml) и справочники — для каждого типа файла есть отдельная официальная спецификация с примером [3]. Если каталог большой, заголовочные описания свойств и типов цен выносятся в отдельные файлы, которые обрабатываются один раз в начале обмена, а не при каждой передаче [4].

Есть три режима выгрузки, которые часто путают:

  • полная выгрузка — происходит при первом обмене или ручном запуске, выгружает весь каталог;
  • краткая (дифференциальная) выгрузка — происходит между полными сессиями и передаёт только изменения по ценам и остаткам;
  • полная принудительная выгрузка — как полная, но обязательно перегружает картинки всех товаров; обычно используется только при отладке [4].

Файлы 1С загружает либо архивом (если включено zip-сжатие в настройках обмена на сайте — по умолчанию включено), либо по отдельности; при обмене также передаются изображения товаров [4]. Все полученные файлы кладутся в служебную папку на сайте, которая очищается перед каждым новым обменом, что удобно держать в уме при отладке.

Режим реального времени для заказов

Отдельно от файлового CommerceML-обмена в 1С есть режим реального времени для заказов: в 1С постоянно висит один сеанс, который ждёт сообщения с сайта; если на сайте создали или отредактировали заказ, в 1С посылается сигнал, чтобы 1С выполнила обмен заказами, а каждые 40 секунд по умолчанию соединение с сайтом обрывается и происходит новое подключение [5]. Технически это реализовано через постоянный long-poll запрос к сайту с параметром ?type=listen, на который сайт отвечает кодом 200, когда есть данные для передачи [6]. Этот механизм закрывает главную проблему обычного расписания — задержку между появлением заказа на сайте и его обработкой в 1С, но требует, чтобы 1С работала в клиент-серверном варианте или держала активный сеанс — в файловой базе для этого нужен отдельный компьютер с постоянно открытой сессией [6].

Почему обмен становится медленным

Регулярная полная выгрузка вместо дифференциальной

Официальная позиция вендора однозначна: обмен способен серьёзно нагрузить 1С только в одном случае — при полной выгрузке очень большого перечня номенклатурных позиций в каталог интернет-магазина, и именно поэтому предусмотрен дифференциальный режим, при котором выгружаются только позиции, изменённые с момента последнего сеанса обмена, обычно это единицы-десятки, максимум сотни позиций, и такая выгрузка производится очень быстро [2]. На практике же одна из самых распространённых ошибок интеграторов — запускать регулярную полную выгрузку «на всякий случай», из-за чего система каждый раз пересчитывает весь каталог заново, вместо того чтобы обрабатывать только изменения [7]. При каталоге в 30–50 тысяч позиций такая схема способна занимать десятки минут и блокировать ресурсы сервера на всё это время [7].

Синхронная обработка на пиках нагрузки

Если тяжёлые операции обмена (массовое обновление цен или остатков) выполняются синхронно и совпадают по времени с рекламной активностью или пиком заказов, сайт вынужден одновременно обслуживать посетителей и переваривать импорт — это создаёт заметный нагрузочный пик именно в тот момент, когда сайту нужна максимальная отзывчивость [8]. Корректная архитектура предполагает вынос тяжёлых операций в очередь и разнесение по времени с пиками трафика, а не игнорирование расписания обмена относительно бизнес-активности [8].

Кастомные обработчики событий без оптимизации

Модуль обмена 1С-Битрикс поддерживает произвольный алгоритм и события импорта (OnBeforeCatalogImport1C и другие), позволяющие менять поведение при загрузке документов [9]. Это гибкий инструмент, но именно кастомные обработчики, повешенные без учёта пакетного режима импорта, — частая причина многократного замедления: если обработчик на каждый товар делает дополнительный SQL-запрос, отсутствие индексов на используемых полях и блокировки транзакций превращают импорт из операции на минуты в операцию на часы [10]. Практический пример такой оптимизации из блога одного из интеграторов: импорт 80 000 товаров сократился с 6 часов до 40 минут после профилирования и устранения узких мест в обработчиках, индексах и блокировках [10] — конкретные цифры относятся к одному проекту и не гарантируют такой же прирост в другом, но иллюстрируют порядок эффекта от профилирования вместо угадывания.

Проблемы мэппинга свойств и структуры каталога

Отдельная категория проблем не связана с нагрузкой напрямую, но накапливается как технический долг и затем усложняет диагностику. При первом обмене Битрикс автоматически создаёт свойства инфоблока с кодами вида PROP_12345 или латинизированными именами из 1С, что даёт нечитаемую структуру [11]. Рекомендованный подход — заранее создать свойства вручную с понятными кодами и прописать явный мэппинг в обработчике события до первого запуска обмена, а не разбирать нагромождение автогенерированных полей постфактум [11].

Ограничения по времени шага и памяти

Этапы обмена — загрузка, чтение, обработка — выполняются пошагово, и длительность каждого шага задаётся в настройках на стороне сайта, при этом на стороне 1С должно быть выставлено согласованное ограничение [12]. Слишком короткий тайм-аут шага при большом каталоге приводит к обрывам и повторным попыткам, а не к ускорению. Отдельно вендор фиксирует, что в новых версиях интеграции расход памяти при генерации CommerceML-файлов на стороне 1С строго регулируется — до 256 Мб — и процедура всегда доходит до завершения при любых объёмах справочника номенклатуры, тогда как раньше при выгрузке 10–15 тыс. позиций память могла разрастаться до 2 Гб и обмен останавливался из-за её нехватки [2]. Если используется старая версия типовой конфигурации без этой оптимизации, часть «тормозов» устраняется банальным обновлением модуля обмена, а не архитектурными изменениями.

Российская специфика

CommerceML — открытый стандарт, разработанный совместно фирмами «1С» и «1С-Битрикс», и оба продукта включены в реестр российского программного обеспечения, что снимает вопрос совместимости с требованиями к отечественному ПО для большинства коммерческих организаций. Отдельный момент, который стоит учитывать при проектировании обмена: через CommerceML-файлы передаются персональные данные покупателей (контрагенты, адреса, телефоны), поэтому канал обмена и место хранения выгруженных XML-файлов подпадают под требования 152-ФЗ — доступ к служебной папке обмена и передаваемым архивам стоит ограничивать так же, как доступ к базе с персональными данными клиентов, а не считать это «просто техническим кэшем». Отдельно для интернет-магазинов, работающих с онлайн-кассами, важно, что обмен с 1С и передача фискальных данных — разные контуры интеграции, которые не стоит путать при планировании доработок.

Варианты ускорения обмена

Настройка штатного CommerceML-обмена

Для большинства каталогов до нескольких тысяч–десятков тысяч позиций разумной отправной точкой остаётся корректная настройка штатного механизма: включить дифференциальную выгрузку вместо полной на регулярной основе, развести расписание обмена с пиками трафика, согласовать тайм-ауты шага на обеих сторонах, обновить типовую конфигурацию до версии с оптимизированной генерацией CommerceML, а для крупных справочников — использовать более быстрые профили импорта, предусмотренные модулем обмена на стороне сайта [13].

Переход на REST API

Когда требования выходят за рамки того, что умеет CommerceML — обновления быстрее, чем раз в 15–30 минут, обмен нестандартными данными (нет в стандартной схеме каталога и заказов), несколько сайтов или сервисов на одной базе 1С, самописная конфигурация без штатной обработки обмена — интеграторы переходят на событийный обмен через REST API Битрикса вместо пакетного файлового обмена [14]. Разница в подходе принципиальная: CommerceML — это синхронный пакетный обмен файлами по расписанию, а REST API — точечные запросы в момент изменения конкретной сущности, без пересчёта всего каталога [14]. Например, для обновления остатка по одному товару на конкретном складе достаточно одного запроса к методу catalog.storeproduct.update, а не выгрузки всех 50 000 позиций [14]. Для передачи заказов в 1С без ожидания следующего сеанса обмена используется исходящий вебхук на событие создания заказа, а не опрос по расписанию [14]. Доступ к REST API организуется через входящие и исходящие вебхуки с ограниченными правами (только catalog, sale — без прав администратора), что также снижает риски по сравнению с широким доступом, который иногда выдают для CommerceML [14].

Такой переход требует больше разработки: нужен HTTP-сервис на стороне 1С, который умеет принимать и отправлять запросы, обработка идемпотентности (чтобы повторный запрос не задвоил заказ), логирование для отладки [14][15]. Это оправдано не для каждого проекта — небольшому магазину с редкими изменениями цен CommerceML обычно достаточно.

Гибридная схема

Часто на практике выигрышной оказывается гибридная схема: каталог и справочники по-прежнему обмениваются через CommerceML (структура каталога меняется не так часто, а стандарт хорошо описывает именно эти сущности), а критичные по скорости сущности — остатки, цены на акционные позиции, статусы заказов — переводятся на REST API или на режим реального времени, уже встроенный в типовую конфигурацию для заказов.

Практические этапы

  1. Замерить, а не гадать. Прежде чем менять настройки, зафиксировать текущее время каждого этапа обмена (выгрузка из 1С, приём файлов на сайте, импорт в инфоблок) — без цифр любое изменение архитектуры превращается в угадывание [10].
  2. Проверить тип выгрузки. Убедиться, что регулярный обмен использует дифференциальный, а не полный режим, и что полная выгрузка запускается только вручную или по явному триггеру.
  3. Согласовать тайм-ауты и расписание. Свести время шага обмена на 1С и сайте, развести тяжёлые операции с пиками посещаемости.
  4. Проверить кастомные обработчики. Выяснить, какие события импорта задействованы, есть ли в обработчиках дополнительные запросы без индексов и без пакетной обработки.
  5. Навести порядок в свойствах. Проверить, не накопились ли автогенерированные коды свойств инфоблока, и при необходимости перейти на явный мэппинг.
  6. Выбрать целевую архитектуру. Оценить, достаточно ли донастройки CommerceML или нужен переход части сущностей на REST API — с тестированием на тестовом стенде перед боевым запуском.
  7. Настроить мониторинг. Логировать длительность и результат каждого обмена, чтобы деградацию было видно сразу, а не по жалобам пользователей.

Ограничения, ошибки и риски

  • Обновление модулей. Кастомные доработки обмена могут «выстрелить в ногу» при обновлении типовых конфигураций 1С или модулей сайта — штатный вариант решения задачи предпочтительнее кастомизации там, где он есть [16].
  • Гонки при полном импорте. Если во время полного импорта каталога товар был изменён администратором или сторонним скриптом на cron, сайт не может определить, входил ли он в текущую выгрузку, — это может привести к ошибочной деактивации или, наоборот, «зависанию» устаревших данных [17].
  • Ложное чувство безопасности от REST API. Переход на REST API снимает часть ограничений CommerceML, но добавляет новую поверхность: вебхуки с избыточными правами, отсутствие проверки идемпотентности, незащищённые эндпоинты HTTP-сервиса в 1С [14].
  • Данные — не гарантия архитектуры. Конкретные цифры ускорения (например, «6 часов → 40 минут») получены на конкретных проектах с конкретными объёмами данных; переносить их как обещание на свой проект без замера некорректно.

Как выбрать решение

Если каталог небольшой (до нескольких тысяч позиций), обновления происходят не чаще, чем раз в 15–30 минут, а обмен работает на актуальной версии типовой конфигурации — обычно достаточно аудита и донастройки штатного CommerceML-обмена: включить дифференциальный режим, развести расписание, обновить модули. Если нужны обновления почти в реальном времени, нестандартные сущности или несколько систем на одной базе 1С — оправдана разработка REST API интеграции, частично или полностью заменяющей CommerceML. Когда обмен уже кастомизирован предыдущими подрядчиками и работает нестабильно, разумный первый шаг — не переписывать всё с нуля, а провести технический аудит существующей интеграции, чтобы понять, где именно теряется время.

Как может помочь «Пятый фактор»

Задачи по интеграции 1С и сайта редко сводятся к одной настройке — обычно нужно разобраться в конкретной архитектуре обмена, оценить, где узкое место, и решить, достаточно ли донастройки штатного механизма или требуется отдельная разработка на REST API.

Практический ориентир. Ускорение обмена начинают с замера времени полной выгрузки и обмена изменениями. Затем проверяют размер пакетов, журнал ошибок, обработку изображений и нагрузку на базу. Такой порядок помогает исправить реальное узкое место, а не просто увеличить ресурсы сервера.

Вывод

Штатный обмен 1С и «1С-Битрикс» через CommerceML 2 спроектирован так, чтобы не нагружать 1С сверх меры — при условии, что используется дифференциальная выгрузка, а не регулярная полная. Большинство реальных тормозов возникает не из-за ограничений самого протокола, а из-за отклонений от рекомендованного режима: полной выгрузки «на всякий случай», синхронной обработки в пиковые часы, неоптимизированных кастомных обработчиков и разросшегося технического долга в мэппинге свойств. Для сценариев, где нужна скорость обновления выше, чем позволяет пакетный XML-обмен, существует альтернатива — событийный обмен через REST API, который стоит внедрять точечно, для конкретных сущностей, а не как замену всей интеграции.

Источники

[1] v8.1c.ru — Протокол обмена с сайтом (CommerceML 2) — https://v8.1c.ru/tekhnologii/obmen-dannymi-i-integratsiya/standarty-i-formaty/protokol-obmena-s-saytom/

[2] 1c.1c-bitrix.ru — Технологические особенности интеграции — https://1c.1c-bitrix.ru/ecommerce/technology.php

[3] intervolga.ru — Что нужно знать программисту про интеграцию сайта и 1С — https://www.intervolga.ru/blog/1C/chto-nuzhno-znat-programmistu-pro-integratsiyu-sayta-i-1s/

[4] dermanov.ru — Битрикс и интеграция с 1С: краткий ликбез — https://dermanov.ru/exp/bitrix-integration-with-1c-brief-introduction/

[5] dev.1c-bitrix.ru — Обмен в режиме реального времени (курс) — https://dev.1c-bitrix.ru/learning/course/index.php?COURSE_ID=131&LESSON_ID=6350&LESSON_PATH=10211.4923.6334.6350

[6] dev.1c-bitrix.ru — Обмен с 1С: типовые операции — https://dev.1c-bitrix.ru/community/blogs/product_features/exchange-with-1c-analyze-typical-operations.php

[7] monoplan.team — Ошибки обмена 1С и 1С-Битрикс, снижающие производительность — https://monoplan.team/blog/publications/oshibki-obmena-1s-i-bitriks-kotorye-snizhayut-proizvoditelnost-sayta/

[8] workspace.ru — Ошибки обмена 1С и Битрикс, снижающие производительность — https://workspace.ru/blog/oshibki-obmena-1s-i-bitriks-kotorye-snizhayut-proizvoditelnost-sayta/

[9] is1c.ru — Произвольный алгоритм в модуле обмена — https://is1c.ru/about/pc/article/proizvolnyy-algoritm-v-module-obmena-1s-bitriks-upravlenie-saytom-kak-eto-ustroeno/

[10] paradigmadev.com — Тормозит обмен 1С с Битрикс: 5 причин и как ускорить — https://paradigmadev.com/blog/tormozit-obmen-1s-s-bitriks-5-prichin-zamer-cherez-sobytiya-i-kak-uskorit/

[11] truetech.by — Настройка обмена 1С и 1С-Битрикс через CommerceML — https://truetech.by/websites-bitrix-bitrix24/services/1c-integration/nastrojka-obmena-dannymi-1s-i-1s-bitriks-cherez-commerceml.html

[12] dermanov.ru — Битрикс и интеграция с 1С: краткий ликбез (этапы шагов обмена) — https://dermanov.ru/exp/bitrix-integration-with-1c-brief-introduction/

[13] dev.1c-bitrix.ru — Импорт из 1С (загрузка данных), профили импорта — https://dev.1c-bitrix.ru/user_help/store/sale/settings/import/1c.php

[14] truetech.dev — Настройка обмена 1С и 1С-Битрикс через REST API — https://truetech.dev/ru/websites-bitrix-bitrix24/services/1c-integration/nastrojka-obmena-1s-i-1s-bitriks-cherez-rest-api.html

[15] it-lampa.ru — Интеграция 1С и Битрикс через REST API: произвольные справочники — https://it-lampa.ru/blog/integratsiya-1s-i-bitriks-upravlenie-saytom-cherez-rest-api/

[16] habr.com (intervolga) — Tutorial по обмену с 1С. Часть пятая — https://habr.com/ru/companies/intervolga/articles/708698/

[17] blog.budagov.ru — Как работает обмен Битрикс с 1С. Часть 1 — https://blog.budagov.ru/obmen-s-1s-vvedenie/

Нужна помощь по этой задаче?
На странице услуги «Ускорение обмена 1С и 1С-Битрикс для большого каталога» указаны состав работ, результат и фиксированная цена.