Модуль связывает интернет-магазин на 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>
- Фикс: рекурсивный обход иерархии разделов в «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, резерв в счёте не отображался в выгрузке.
- Возвращена кнопка «Загрузить» рядом с полем «Подключение сайта» в настройках модуля. Подгружает список маркетплейс-подключений SABY по логину/паролю.
- Возвращён двухшаговый диалог удаления модуля с выбором «Сохранить настройки» / «Удалить всё».
- Полное удаление настроек теперь действительно очищает все опции модуля и сбрасывает кэш Битрикса.
Обновление рекомендуется всем, кто пользуется блоком «Для получения резервов и внешних кодов» или планирует переустановку модуля.
Разработчик: Винтра Сайт: https://wintramedia.ru Email: support@wintramedia.ru
Перед обращением в поддержку, пожалуйста, подготовьте:
- Версию модуля (указана в /bitrix/admin/partner_modules.php → установленные)
- Версию PHP (phpinfo() или в Bitrix: Настройки → Производительность)
- Текст ошибки полностью (скопируйте из лога Bitrix: /bitrix/admin/event_log.php)
- Описание шагов для воспроизведения проблемы
Время ответа на обращения: 1–3 рабочих дня.
Для покупки товара в нашем интернет-магазине выберите понравившийся товар и добавьте его в корзину. Далее перейдите в Корзину и нажмите на «Оформить заказ» или «Быстрый заказ».
Если оформляете быстрый заказ: напишите ФИО, телефон и e-mail. Вам перезвонит менеджер и уточнит условия заказа. По результатам разговора вам придет подтверждение оформления товара на почту или через СМС. Теперь останется только ждать доставки и радоваться новой покупке.
Оформление заказа в стандартном режиме выглядит следующим образом. Заполняете полностью форму по последовательным этапам: адрес, способ доставки, оплаты, данные о себе. Советуем в комментарии к заказу написать информацию, которая поможет курьеру вас найти. Нажмите кнопку «Оформить заказ».
Оплачивайте покупки удобным способом. В интернет-магазине доступно 3 варианта оплаты:
- Наличные при самовывозе или доставке курьером. Специалист свяжется с вами в день доставки, чтобы уточнить время и заранее подготовить сдачу с любой купюры. Вы подписываете товаросопроводительные документы, вносите денежные средства, получаете товар и чек.
- Безналичный расчет при самовывозе или оформлении в интернет-магазине: карты МИР. Чтобы оплатить покупку на сайте, система перенаправит вас на сервер платежной системы. Здесь нужно ввести номер карты, срок действия и имя держателя.
- Электронные системы при онлайн-заказе: ЮMoney. Для совершения покупки система перенаправит вас на страницу платежного сервиса. Здесь необходимо заполнить форму по инструкции.
- Безналичная оплата на наш расчетный счет по выставленному счету.
Экономьте время на получении заказа. В интернет-магазине доступно 4 варианта доставки:
- Электронная поставка - все необходимые сведения о лицензии, праве пользования, кодах, ключах и др. высылаются покупателю на его e-mail.
- Курьерская доставка. Когда товар будет отправлен с нашего склада, Вам придет уведомление. В день доставки с Вами заблаговременно свяжется курьер для уточнения времени и деталей доставки. Доставка производится "до двери". Осмотрите упаковку на целостность и соответствие указанной комплектации.
- Постамат. Когда заказ поступит на точку, на Ваш телефон или e-mail придет уникальный код. Заказ нужно оплатить в терминале постамата. Срок хранения — 3 дня.
- Доставка Почтой России. Когда заказ придет в отделение, на Ваш адрес придет извещение о посылке. Перед оплатой Вы можете оценить состояние коробки: вес, целостность. Вскрывать коробку самостоятельно Вы можете только после оплаты заказа. Один заказ может содержать не больше 10 позиций и его стоимость не должна превышать 100 000 р.
Дополнительная информация.
Изучите полный алгоритм продления лицензий на модули 1С-Битрикс: Маркетплейс, включая активацию льготных купонов. Мы детально разбираем все условия: обязательный 30-дневный срок для сохранения максимальной выгоды, пропорциональное ценообразование (12,5%, 25%, 50% от цены модуля) и ограничение по минимальной сумме в 500 рублей. Этот гайд поможет вам эффективно планировать бюджет и гарантировать актуальность вашего проекта.