Интеграция со СБИС (Retail)
От: Винтра
14 900 ₽
Дата публикации:
08.05.2026
Число установок:
Менее 50 раз
Дата обновления:
10.06.2026
Включает в себя:
Array
Последняя версия:
1.2.12
# Интеграция со СБИС (Retail)
Модуль связывает интернет-магазин на 1С-Битрикс с СБИС-Retail (Saby).
## Что делает
- Выгружает каталог товаров и иерархию категорий из СБИС в `import.xml` (YML, для импорта в инфоблок «Каталог» Битрикса).
- Выгружает остатки в `stocks.xml` с полями: общий остаток, в резерве, свободный, срок резерва.
- Отправляет оплаченные заказы с сайта в кассу СБИС-Retail.
- Подтягивает «внешний код товара» — код из системы клиента-сайта, который СБИС хранит на карточке товара.
- Синхронизирует номенклатуру СБИС с CRM Битрикс24 по входящему вебхуку.
- Регулярно обновляет каталог, остатки и резервы по расписанию (cron-агенты Битрикса).
## Что выгружает в `import.xml`
```xml
<offer id="3052" available="true">
<name>Дейтериевая лампа</name>
<price>2500</price>
<currencyId>RUR</currencyId>
<categoryId>484</categoryId>
<description>описание...</description>
<nomNumber>X2831985</nomNumber>
<external_id>c2045fe6-75ed-42d0-a9b5-fc6c345439f0</external_id>
<external_code>123456</external_code>
<unit>шт</unit>
<barcode>4620532580038</barcode>
<pictures>
картинка 1,2,3</pictures>
<attributes>
<attribute>
<name>weight</name>
<value>1</value>
</attribute>
...
</attributes>
</offer>
```
## Что выгружает в `stocks.xml`
```xml
<offer id="3052">
<stock>2</stock>
<total>2</total>
<reserve>1</reserve>
<reserve_until>05.07.26</reserve_until>
<free>1</free>
</offer>
Модуль связывает интернет-магазин на 1С-Битрикс с СБИС-Retail (Saby).
## Что делает
- Выгружает каталог товаров и иерархию категорий из СБИС в `import.xml` (YML, для импорта в инфоблок «Каталог» Битрикса).
- Выгружает остатки в `stocks.xml` с полями: общий остаток, в резерве, свободный, срок резерва.
- Отправляет оплаченные заказы с сайта в кассу СБИС-Retail.
- Подтягивает «внешний код товара» — код из системы клиента-сайта, который СБИС хранит на карточке товара.
- Синхронизирует номенклатуру СБИС с CRM Битрикс24 по входящему вебхуку.
- Регулярно обновляет каталог, остатки и резервы по расписанию (cron-агенты Битрикса).
## Что выгружает в `import.xml`
```xml
<offer id="3052" available="true">
<name>Дейтериевая лампа</name>
<price>2500</price>
<currencyId>RUR</currencyId>
<categoryId>484</categoryId>
<description>описание...</description>
<nomNumber>X2831985</nomNumber>
<external_id>c2045fe6-75ed-42d0-a9b5-fc6c345439f0</external_id>
<external_code>123456</external_code>
<unit>шт</unit>
<barcode>4620532580038</barcode>
<pictures>
картинка 1,2,3</pictures>
<attributes>
<attribute>
<name>weight</name>
<value>1</value>
</attribute>
...
</attributes>
</offer>
```
## Что выгружает в `stocks.xml`
```xml
<offer id="3052">
<stock>2</stock>
<total>2</total>
<reserve>1</reserve>
<reserve_until>05.07.26</reserve_until>
<free>1</free>
</offer>
Характеристики
|
Дата публикации
|
08.05.2026 |
|
Число установок
|
Менее 50 раз |
|
Дата обновления
|
10.06.2026 |
|
Включает в себя
|
Array |
|
Последняя версия
|
1.2.12 |
|
Адаптивность
|
Нет |
|
Поддержка композита
|
Нет |
|
Совместимо с Сайты24
|
Нет |
|
Подходящие редакции 1С-Битрикс
|
3373 3380 3381 3382 3383 |
|
Наличие демо-режима
|
Да |
|
Продолжительность демо-периода
|
7 |
- Фикс: рекурсивный обход иерархии разделов в «enrichReserves()». 1.2.11 делал drill-down только верхнего уровня — если каталог СБИС иерархичный глубже 1 уровня, товары на 2+ уровне молча пропускались («matched=0»). Прецедент chromart.ru: после добавления товара в новую подпапку структура каталога СБИС перестроилась (ROOT ? 2 раздела ? подразделы ? товары), все 18 резервных позиций пропали из «stocks.xml». Теперь BFS-обход по очереди: parseFlat() выдёргивает строки «ТипЗаписи=Номенклатура», оставшиеся «Раздел» кладутся в очередь как «depth+1». Защита от циклов через «visited», ограничение глубины «max_depth=5». В лог пишется каждая ступень: «drill <DBId> d=<depth> rows=<n> matched=<k> sub=<m>».
- Затронут файл: «src/lib/stocks.php» («enrichReserves()» — добавлен BFS через очередь вместо одного прохода).
- Фикс: резервы через «ReserveBalancesReport.GetData» (UI-отчёт «Остатки в резерве») вместо «ДвиженияПоРезервам.ПолучитьДанные». До 1.2.10 — поштучный rpc на каждый id товара. СБИС на каталоге >100 товаров включал rate-limit, блокировал метод на 86400 сек (саппорт подтвердил лимит: 60 запросов/мин). Новый метод одной prefetch-сессией охватывает весь каталог: INIT (получаем «PrefetchSessionId») ? READ корня (список разделов) ? drill-down по каждому разделу (плоский список товаров). На каталоге 200 товаров укладываемся в ~1 сек, никакого rate-limit. Контракт «enrichReserves($rows)» сохранён.
- Фикс: кракозябры в селекте «Тип выгрузки» расписания — удалён hardcoded русский в cp1251 PHP. Тип расписания «reserves» (отдельный канал через «runReserves()») выпилен полностью: резервы теперь обогащают «stocks.xml» напрямую в «WintraSbisStocks::run()», отдельное расписание не нужно. Удалены: «WintraSbisStocks::runReserves()», обработчик «type=reserves» в «WintraSbisSchedule::runById», опция «reserve_doc_type» (поле «Где хранятся резервы» — стало не нужно, новый метод RBR отдаёт резервы независимо от типа документа).
- Защита от rate-limit при обогащении «<external_code>». «Nomenclature.NomenclatureRead» массив id не принимает, дёрганье поштучное. Default throttle 1100мс между rpc (?54 req/min, ниже лимита 60). Адаптивный backoff при ошибках «слишком часто» / «не найден или недоступен». Прогресс-маркеры в «/upload/sbis/stocks-debug.log» каждые 50 товаров. Throttle настраивается опцией «enrich_ext_sleep_ms» (default 1100).
- Чекбокс «Получать внешние коды маркетплейса» в настройках. На каталоге 200 товаров обогащение занимает ~3.7 мин (60 req/min лимит). Не всем клиентам этот код нужен — теперь явная opt-in галка «enrich_ext_codes_enabled». По умолчанию выключена ? запросы вообще не идут.
- Файловый отладочный лог «/upload/sbis/stocks-debug.log» (а не «CEventLog»). Многие клиентские сайты держат «log_filename = null» в «.settings.php», «AddMessage2Log» тихо игнорирует. Свой файловый лог гарантирует диагностику. Ротация при >500KB.
- Затронутые файлы: «lib/stocks.php», «lib/nomenclature.php», «lib/schedule.php», «lang/ru/lib/stocks.php», «install/admin/sbis_schedules.php», «install/admin/sbis_settings.php», «install/version.php».
- Фикс: кракозябры в UI модуля на UTF-8-сайтах клиента. В 1.2.9 lang-файлы конвертились в cp1251 при сборке вместе с PHP-кодом. На UTF-8 клиентском сайте Bitrix отдавал cp1251-байты в HTML без конвертации ? русские строки в админке кракозябры. Lang-файлы теперь остаются UTF-8 в архиве — Bitrix «Loc::loadLanguageFile» сам конвертит под LANG_CHARSET сайта. PHP-код (lib/install/admin) по-прежнему cp1251 (требование Marketplace). Подтверждено прецедентом на wintramedia.ru.
- Фикс: резерв в «stocks.xml» теперь приходит на UTF-8-сайтах клиентов. Корень: hard-coded русские строки в коде модуля («'СБИС.Аутентифицировать'», «'ДвиженияПоРезервам.ПолучитьДанные'», «'ФильтрНоменклатура'», имена полей фильтра/навигации, имена колонок ответа). При публикации модуля файлы переводятся в Windows-1251 (требование Marketplace), и на UTF-8-сайте «json_encode» ломает такие строки ? СБИС видит пустое тело ? «Parse error: document is empty». Все runtime-литералы вынесены в «lang/ru/<тот же путь>.php» через «Loc::loadMessages» + «Loc::getMessage». Bitrix автоматически отдаёт строку в кодировке текущего сайта (cp1251 на cp1251, UTF-8 на UTF-8) — работает в обе стороны.
- Затронуты файлы: «lib/auth.php», «lib/stocks.php», «lib/nomenclature.php», «lib/bitrix24.php», «lib/orders.php», «lib/schedule.php», «lib/menu-helper.php», «lib/trial-notice.php», «ajax/get_marketplace_connections.php», «install/admin/sbis_ajax.php», «install/admin/sbis_schedules.php», «install/admin/sbis_help.php», «install/admin/sbis_settings.php» + соответствующие lang/ru/<path>.php.
- Также удалены дубли inline auth-кода в «ajax/get_marketplace_connections.php» и «install/admin/sbis_ajax.php» (case «marketplace_connections») — оба теперь используют единый «WintraSbisAuth::sabySessionAuth()» / «sabyRpc()».
- Технический релиз: переподписка delta-update с правильной структурой архива. В 1.2.7 по ошибке попала вся папка «install/» + «lang/*/install/» (намеренное исключение в «mp-build.php», противоречившее правилу Marketplace «только изменённые файлы»). Исключение снято. Архив 1.2.8 содержит ровно «lib/stocks.php» + «install/version.php» + «updater.php» + «description.ru».
- Без функциональных изменений сверх 1.2.7 (фикс хардкода «[170]» в «ДвиженияПоРезервам.ПолучитьДанные» уже в коде).
- Убран хардкод «ФильтрКатегорияТовара = [170]» в запросе «ДвиженияПоРезервам.ПолучитьДанные» («src/lib/stocks.php» — «runReserves()» и «enrichReserves()»). Это был chromart-специфичный id категории «Товары», на других сайтах СБИС метод молча возвращал пустоту ? в «stocks.xml» всегда «reserve=0», без ошибок в логе. Теперь фильтр по категории пуст — резерв подтягивается по любой номенклатуре. Прецедент: wintramedia.ru, товар id=195, резерв в счёте не отображался в выгрузке.
- Что в версии 1.2.6:
- Возвращена кнопка «Загрузить» рядом с полем «Подключение сайта» в настройках модуля. Подгружает список маркетплейс-подключений SABY по логину/паролю.
- Возвращён двухшаговый диалог удаления модуля с выбором «Сохранить настройки» / «Удалить всё».
- Полное удаление настроек теперь действительно очищает все опции модуля и сбрасывает кэш Битрикса.
Обновление рекомендуется всем, кто пользуется блоком «Для получения резервов и внешних кодов» или планирует переустановку модуля.
