Интеграция со СБИС (Retail)
От: Винтра
14 900 ₽
Подарки при покупке — выберите 2 из 3
Действует при покупке лицензии модуля через DataKit
Купить с подарками
Условия акции
Подарки предоставляются при покупке лицензии модуля через DataKit. Можно выбрать два подарка из трёх. Бесплатная установка — установка модуля на сайт клиента и проверка работы, без настройки под бизнес-процессы и доработок; нужен доступ к сайту или хостингу. Запуск за 1 рабочий день отсчитывается с момента оплаты и получения доступов. Первые 3 месяца VPS для 1С-Битрикс оплачивает DataKit при заказе хостинга через DataKit. Подарки не заменяются деньгами.
Дата публикации:
08.05.2026
Число установок:
Менее 50 раз
Дата обновления:
11.10.2026
Включает в себя:
Модуль
Последняя версия:
1.8.0
# Интеграция со СБИС (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.7.0
Модуль связывает интернет-магазин на 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.7.0
- Счёт покупателю. Счёт выставляется в СБИС по заказу магазина: цены, НДС и реквизиты берутся из учётной системы, а не с сайта. Счёт создаётся ОДИН раз — повторное нажатие отдаёт уже выставленный, а не делает второй.
- Резервирование товара. Товар счёта резервируется на складе СБИС сразу после выставления. Резерв держит товар и не даёт продать его другому покупателю, поэтому включается осознанно. Публичного API резервирования у СБИС нет — работаем внутренними методами интерфейса, и при их отказе счёт всё равно остаётся выставленным.
Характеристики
|
Дата публикации
|
08.05.2026 |
|
Число установок
|
Менее 50 раз |
|
Дата обновления
|
11.10.2026 |
|
Включает в себя
|
Модуль |
|
Последняя версия
|
1.8.0 |
|
Адаптивность
|
Нет |
|
Поддержка композита
|
Нет |
|
Совместимо с Сайты24
|
Нет |
|
Подходящие редакции 1С-Битрикс
|
3373 3380 3381 3382 3383 |
|
Наличие демо-режима
|
Да |
|
Продолжительность демо-периода
|
7 |
- УБРАНА быстрая довыгрузка изменённых позиций (сторож каталога и файл дельты). Прочитайте до обновления: позиция, заведённая или исправленная в СБИС, больше не приедет на сайт через несколько минут — она приедет ближайшим полным обменом. Причина честная: у СБИС нет способа спросить «что изменилось с такого-то часа», и механику приходилось строить обходным путём — сравнивать слепки каталога и добирать каждую позицию отдельным запросом. Это упиралось в ограничение частоты обращений и грозило блокировкой канала обмена, а на стороне сайта требовало отдельной стыковки расписаний. Мы продолжаем искать способ довозить изменения быстро и вернём его, когда он будет надёжным.
- Модуль молча терял товары при обмене — до 39 процентов прайс-листа. СБИС ограничивает частоту обращений: не более 50 запросов в минуту, при превышении отвечает отказом и блокирует на две минуты. Отказ приходит обычным ответом, и модуль читал его как «в этой папке ничего нет» — папка пропускалась целиком, без единой ошибки в отчёте. Замер на живой базе: вместо 3844 позиций до сайта доезжало 2326, и каждый раз разные. Теперь отказ распознаётся, обмен идёт в разрешённом темпе, а в отчёте прогона видно число запросов.
- Товары без раздела больше не выбрасываются. Раньше раздел определялся окольно: товары брались из прайс-листа, а раздел подбирался по каталожной выгрузке. Позиция, которой в той выгрузке не оказалось, теряла раздел и исчезала с сайта; если в выгрузку не попадала вся папка, пропадала и она. На живой базе так пропала ветка «Подшипники» — 31 позиция с ценой и остатком. Теперь раздел берётся прямо из каталога, и терять его неоткуда.
- Два честных режима работы, и выбор между ними — первый вопрос в настройках. «Из каталога СБИС» — товары, дерево и характеристики берутся прямо из каталога, прайс-лист не нужен вовсе: приезжает всё, что лежит в указанной папке, и вести вторую копию ассортимента больше не требуется. «Из прайс-листа» — прежний порядок для тех, кто собирает витрину вручную и назначает в ней свои цены. Форма показывает только те поля, которые нужны выбранному режиму.
- В отчёте о выгрузке появилось число запросов к СБИС и число ожиданий.
- Остатки берутся из каталога при любом режиме. Раньше они обходили прайс-лист, и позиции, не попавшие в прайс, оставались без остатка вовсе. Остаток есть у товара независимо от того, продаётся он через прайс или нет.
- Код папки каталога нужен теперь при любом режиме: он ограничивает обход одной веткой. Без него обход уходит по всей номенклатуре организации.
- При установке модуля по умолчанию включается режим «из прайс-листа». Переключение на каталог меняет и состав выгрузки, и цены, поэтому включать его должен владелец осознанно.
- Счёт покупателю по заказу магазина. Заказ оформлен — счёт выставляется в СБИС сам: цены, НДС и реквизиты берутся из учётной системы, номер счёта — её же, своей нумерации сайт не ведёт. Печатная форма кладётся в заказ и уходит покупателю письмом с вложением. Счёт выставляется ровно один раз: повторное нажатие отдаёт уже выставленный, а не создаёт второй — два счёта на один заказ означают, что кто-то заплатит по отменённому.
- Состав заказа сверяется со складом до выставления. Не хватает позиции или нет цены — счёт не выставляется, заказ переводится в стадию согласования с менеджером, а покупателю показывается, какие именно позиции держат заказ. Счёт по составу, которого нет на складе, опаснее отсутствия счёта: по нему сразу платят.
- Резервирование товара под выставленный счёт. Товар резервируется на складе СБИС сразу после выставления, срок задаётся настройкой. Резерв уменьшает остаток, который приезжает на сайт, — товар перестаёт предлагаться другим покупателям.
- Вкладка «Счета» в настройках модуля. Выставление, стадии заказа, резерв, банковские реквизиты и подразделение — всё в одном месте, стадии выбираются списком с их названиями, а не кодом.
- В печатной форме не было ни банковских реквизитов, ни НДС. Причин оказалось три, и каждая ломалась молча — документ создавался, сумма верная, ошибок ноль. Вложение уходило в формате 3.01, где налог задаётся тегами, а не атрибутами; вместе с файлом не передавались его реквизиты — тип, подтип и версия, — и документ оставался неформализованным; печатная форма бралась по ссылке самого документа, а это служебный бланк, тогда как готовый счёт лежит отдельным вложением.
- Счёт выходил с посторонним складом. Своя организация теперь называется явно: без этого СБИС выбирает её сам, по учётной записи автора документа, и вместе с ней подставляет её склад — бухгалтерия такой документ не узнаёт, а остатки расходятся.
- Номер счёта начинался с единицы. Пустой номер СБИС заполняет сам; теперь номер запрашивается у учётной системы заранее, и нумерация остаётся сквозной.
- Причина отказа СБИС больше не теряется. В фоновых задачах перевод недоступен, и вместе с оболочкой сообщения исчезал сам текст ответа сервиса — наружу уходило «учётная система не приняла документ» без единого слова о том, почему.
- Пошаговая выгрузка номенклатуры и остатков. Кнопки на странице «Выгрузка» больше не ждут результата одним запросом: работа идёт отрезками по 20 секунд, на странице видно, сколько собрано и сколько разделов осталось. Обрыв связи ничего не теряет — следующее нажатие продолжает с того же места. Зачем: каталог в три тысячи позиций выгружается 5–10 минут, а веб-сервер обычного хостинга рвёт запрос примерно на минуте и отдаёт 504. Из админки такая выгрузка не заканчивалась никогда, и выглядело это как «ошибка подключения» при живом СБИС. Проверено 23.09.2026 на reg.ru: пошагово каталог 3226 товаров и 110 категорий собрался за 19 шагов.
- Методы «Nomenclature::runStep()» / «Stocks::runStep()» и сброс «resetStep()»; действие «export_step» в админском AJAX-эндпоинте.
- Расписание (крон) пока запускает прежний однозаходный путь — см. «DEBT.md».
- Габариты доезжают на сайт тремя разными числами, а не одной длиной трижды. Формат YML держит все три размера в одной строке «<dimensions>60.000/2.000/3.000</dimensions>», а в Битриксе длина, ширина и высота — три отдельных поля. Один тег на три поля не раскладывается: импорт приводил строку к числу и каждый раз получал 60 — длина ложилась верно, а ширина с высотой молча повторяли её. Ошибки нигде не было: файл верный, просто сопоставление не могло выразить нужное. Теперь рядом со старыми тегами выгружаются «<length_mm>», «<width_mm>» и «<height_mm>».
- Вес и размеры сразу в тех единицах, в каких их хранит Битрикс. YML считает вес в килограммах, а габариты в сантиметрах; Битрикс — в граммах и миллиметрах. Раньше пересчёт приходилось задавать в профиле импорта руками. Появился «<weight_g>» в граммах, а три новых тега габаритов сразу в миллиметрах — сопоставлять поля можно напрямую, без преобразований. Старые «<weight>» и «<dimensions>» остались как были, уже настроенные профили не тронуты.
- Незаполненный размер не превращается в ноль. Если в карточке СБИС задана только длина, в файл уедет только она, а ширина и высота останутся без тега — иначе импорт затёр бы нулями то, что уже стоит на сайте.
- У расписания появилось время запуска. Раньше задавался только интервал, а первый запуск вставал на «сейчас плюс интервал», то есть в случайное время. К тому же Битрикс считал следующий запуск от окончания предыдущего, и выгрузка каждые сутки уползала вперёд на длительность обмена. Где файл забирает импорт по расписанию хостинга, это ломает порядок: выгрузка заходит за время импорта, и на сайт начинает приезжать вчерашний файл — без единой ошибки в отчётах. Теперь рядом с интервалом есть поле времени, и заданный час держится.
- В таблице расписаний видно, когда будет следующий запуск. Значение берётся у самого Битрикса, а не считается заново: показывать надо то, что сайт действительно сделает.
- Таблицы модуля больше не спорят с кодировкой базы. Кодировка была зашита в код жёстко, и на базе с другой кодировкой штатная проверка сайта «Кодировки таблиц в БД» отдавала ошибку. Теперь модуль не называет кодировку вовсе и берёт ту, что стоит у базы; уже созданные таблицы приводятся к ней при обновлении.
- Модуль больше не спорит с соседними модулями Винтры за значок меню. Обработчик общего пункта «Винтра.Хаб» носил имя, одинаковое у нескольких наших модулей: на сайте с двумя из них иконка зависела от того, кто загрузился первым. Имя разведено по своему пространству имён.
- Из поставки убраны четыре неиспользуемых адреса. Папка «ajax/» дублировала живой обработчик и не вызывалась ниоткуда, при этом оставалась четырьмя лишними точками входа на сайте. При обновлении файлы удаляются и с уже установленных сайтов.
- Русские комментарии в разметке страниц переведены на латиницу. Пользователю они не видны, но в архиве превращались в «?».
- Новые и изменённые позиции приезжают на сайт за минуты, а не на следующие сутки. Появился «сторож каталога»: раз в несколько минут он спрашивает у СБИС состав каталога, сравнивает с прошлой проверкой и складывает в отдельный небольшой файл только то, что появилось или изменилось. Полный обмен как шёл раз в сутки, так и идёт — сторож ничего не заменяет, а закрывает разрыв между «менеджер завёл позицию в СБИС» и «она видна в магазине». Человеку, работающему в СБИС, заходить в админку сайта не нужно.
- Сравнивается состав, а не количество. По числу позиций нельзя понять, какая из них новая: даты создания СБИС не отдаёт вовсе. Поэтому сторож держит отпечаток каждой позиции — имя, цена, раздел, вес, габариты — и видит поимённо, что появилось, что изменилось и что исчезло. Одним запросом на всю проверку.
- Дельта копится до полной выгрузки. Файл не переписывается каждый раз, а дополняется: иначе позиция, которую импорт не успел забрать, потерялась бы при следующей проверке. Суточный обмен забирает всё разом и очищает накопитель.
- Важно: для файла дельты нужен отдельный профиль импорта — копия основного, но с выключенными действиями при отсутствии элемента в файле. Файл содержит несколько позиций, и обычные настройки деактивировали бы по нему весь каталог. В подсказке к настройке об этом сказано прямо.
- Предохранитель на размер дельты. Если изменилось больше позиций, чем задано в настройке (по умолчанию сто), точечная догрузка пропускается — такие изменения заберёт полная выгрузка. Это защита от лавины запросов после пересборки прайс-листа, когда отпечатки меняются у всех позиций разом.
- Замок от одновременных обменов. Его не было вовсе: пока обмен шёл раз в сутки, это не мешало, а со сторожем пересечение стало вопросом времени. Теперь полная выгрузка и сторож не наступают друг другу на ноги, а замок сам снимается по сроку годности, чтобы упавший процесс не запер обмен навсегда.
- Файл дельты создаётся сразу, даже пустым. Профиль импорта, натравленный на несуществующий файл, не падает, а зависает: проверено на живом сайте — процесс прожил десять минут с пустым журналом. При запуске раз в несколько минут такие процессы копились бы до исчерпания памяти.
- Товары с ценой больше не пропадают из выгрузки. При привязке разделов к каталогу модуль выбрасывал всё, чего не оказалось в каталожной выгрузке СБИС, считая это признаком «у товара нет цены». Признак неверный: каталожная выгрузка отдаёт не весь прайс-лист. На живой базе из 3598 позиций прайса в неё попали 2956, а у 68 из 642 отброшенных цена стояла — в том числе в карточке каталога. Товары молча исчезали с сайта: файл собирался без ошибок, отчёт импорта был чистым, а заметить пропажу можно было только поиском конкретного штрихкода. Теперь раздел для таких товаров достраивается по карте соответствия категорий прайс-листа каталожным, собранной по товарам, которые нашлись в обоих источниках. Отбрасываются только те, для кого раздела не существует вовсе.
- Отсев товаров без цены стал настройкой. Раньше он существовал лишь как побочный эффект предыдущего пункта и утаскивал за собой лишнее. Теперь это явное правило «Товары без цены: не выгружать / выгружать вместе с остальными». Умолчание сохраняет прежнее поведение каждой установки: при привязке разделов к каталогу такие товары не выгружались и раньше, при привязке к прайс-листу — выгружались.
- Страница «Запуск вручную» показывает, что отсеялось. После обмена рядом с числом выгруженных товаров выводится, сколько не попало в файл без цены, сколько — без раздела в каталоге СБИС, и скольким раздел был достроен. Молчаливая потеря части каталога — ровно то, из-за чего понадобилась эта версия.
- Текст ошибки «в каталожной выгрузке нет ни одного товара» больше не врёт. Он называл причиной отсутствие цен у товаров; настоящая частая причина — код папки каталога в настройках указывает не на ту ветку.
- Плашка о прайс-листе больше не спорит с настройкой, стоящей под ней. Она советовала заливать прайс поверх и не пересоздавать его. Для привязки разделов к прайс-листу это верно, а для привязки к каталогу — вредно: номера каталога пересборку переживают, зато накат поверх копит в прайсе то, чего в каталоге давно нет. На живой базе пересборка начисто убрала восемь папок, где вперемешку лежали товары из разных категорий каталога. Теперь текст плашки зависит от выбранного режима.
- Модуль больше не может уронить соседний модуль Винтры. Класс плашки демо-режима носил общее имя «WintraTrialNotice» — такое же, как в других наших модулях. Если рядом стоял ещё один, второй объявлял класс повторно и падал с фатальной ошибкой, причём падал именно сосед, а не виновник. Класс переименован в «WintraSbisTrialNotice».
- Страница «Сопоставление с Б24» больше не меняет данные при простом открытии. Она молча удаляла из базы решения по позициям, которых не стало в снимке СБИС, — прямо на загрузке страницы, без проверки токена сессии. Открытая по чужой ссылке администратором, она сработала бы так же. Удаление было лишним: настоящая уборка выполняется при пересчёте плана и токеном защищена. Теперь страница только скрывает устаревшие записи из выборки.
- Сообщения об ошибках больше не показывают внутренние подробности. В трёх местах — на страницах сопоставления и сравнения с Битрикс24 и при проверке вебхука — печатался текст исключения, а туда попадают адрес вебхука и ответ портала. Вместо него выводится понятное объяснение, что проверить.
- Обновление модуля больше не рискует зависнуть. Скрипт обновления подключал модуль в тот момент, когда его файлы скопированы наполовину. Подключение убрано, регистрация обработчика меню в нём не нуждается.
- Разделы можно привязывать к каталогу СБИС, а не к прайс-листу. До этой версии разделы сайта связывались с номером папки в дереве прайс-листа. Этот номер выдаётся заново при каждой пересборке прайса: на живой базе после полной пересборки из 3510 товаров номер позиции сменился у всех, а каталожный код — ни у одного. В результате обмен создавал дерево разделов заново, а прежние разделы оставались пустыми, и происходило это молча — импорт отрабатывал без ошибок. Теперь в настройках есть выбор «Разделы привязывать к: каталогу СБИС / прайс-листу». Структура берётся одним дополнительным запросом, поштучных обращений не добавилось.
- Обновление ничего не ломает. У сайтов, которые обновляются с прежних версий, привязка остаётся прежней — прайс-листовой. Каталожная включается только вручную и предупреждает о последствиях. Новые установки сразу получают привязку к каталогу.
- Ограничение выгрузки одной папкой каталога. В каталоге СБИС рядом с торговыми папками обычно лежат учётные — «Архив», «Не для продажи», «НЕ индексируется». Без ограничения они попадали в файл и создавались на сайте пустыми разделами. Появилось поле «Код папки каталога СБИС».
- Штрихкоды раскладываются по типам. СБИС отдаёт штрихкоды массивом в непредсказуемом порядке: у одного товара EAN13 идёт первым, у соседнего — вторым, после внутреннего короткого кода. Профиль импорта берёт первый, поэтому часть товаров молча меняла символьный код, а вместе с ним и адрес страницы: на живом каталоге так пострадали 27 товаров из 2854, их прежние ссылки стали отдавать 404. Теперь рядом с общим тегом выгружается тег на каждый тип — «barcode_ean13», «barcode_shortcode» и так далее, — и в профиле импорта каждый тип раскладывается в своё поле. Общий тег сохранён, настроенные профили не затронуты.
- Вес, габариты и страна происхождения. Раньше не выгружались вовсе: список номенклатуры этих полей не отдаёт. Теперь берутся из каталожной выгрузки тем же запросом. На проверочной базе вес заполнился у 736 товаров.
- Кнопка «Загрузить из СБИС» у фильтра по характеристике снова работает. Список характеристик собирался с первой страницы номенклатуры от корня каталога. Если в корне лежат только папки — а так устроен любой обычный каталог, — товаров в выборке не оказывалось, и модуль отвечал «в номенклатуре нет характеристик». Сообщение звучало как факт о данных пользователя. Теперь модуль спускается по дереву и останавливается, набрав достаточно товаров; отдельно различаются «характеристик нет» и «товаров в выборке нет».
- Панель «Сохранить» больше не прячется под сгибом. Форма настроек длинная, и кнопку приходилось искать прокруткой. Панель действий прибита к нижней части формы и видна всегда.
- Секреты в настройках скрыты. Защищённый ключ, сервисный ключ и адрес вебхука Битрикс24 выводились открытым текстом и читались с экрана. Теперь скрыты, как и пароль сотрудника.
- Блок «Резервы и внешние коды» разделён на два. Четыре поля шли одним списком, хотя работают независимыми парами: логин с паролем дают резервы, подключение с галочкой — внешние коды маркетплейса. Настраивающий читал блок сверху вниз и выбирал подключение, которое резервам не нужно. Теперь это два блока со своими заголовками и пояснениями, второй помечен как редко нужный.
- Понятно, что такое «external_id». Сквозной код товара выгружается всегда и никаких настроек не требует — это отдельный тег, не связанный с галочкой «внешние коды». В блоке настроек об этом сказано прямо, и там же названа цена включения внешних кодов в минутах.
- Страница «Запуск вручную» приведена в порядок. Блоки идут по ходу дела: номенклатура, остатки, Битрикс24. Все кнопки выглядят одинаково и показывают, что работа идёт, — раньше у выгрузки остатков не было ни того, ни другого, и нажатие выглядело как «не сработало». Блок Битрикс24 показывается, только когда интеграция настроена. Уточнено описание выгрузки остатков: она не быстрее выгрузки номенклатуры, каталог обходится целиком.
- Убраны искажённые символы в интерфейсе. Тире, стрелки и разделители были записаны в разметке напрямую и на сайтах в UTF-8 отображались ромбиками — например, в колонках «Размер» и «Обновлён» таблицы текущих файлов.
- Текст на странице настроек больше не превращается в «?????» на UTF-8-сайтах. Блок «Для получения резервов и внешних кодов» был написан прямо в разметке страницы. Архив маркетплейса собирается в кодировке cp1251, и такой текст на сайте в UTF-8 отображался вопросительными знаками. Все подписи блока перенесены в языковой файл — Битрикс отдаёт их в кодировке сайта.
- Починены два тихих отказа по той же причине. Имя параметра запроса к API СБИС и признаки временной блокировки в ответе сервиса тоже были записаны в коде по-русски: после сборки они переставали совпадать, из-за чего постраничная навигация и повтор при ограничении частоты запросов молча не срабатывали.
- Демонстрационный режим виден в модуле. На страницах модуля появилась штатная плашка Битрикса с обратным отсчётом: «Демонстрационный режим работы модуля. Осталось дней: N» и ссылкой на покупку.
- Понятное сообщение после окончания демо. Когда демонстрационный период истёк, страницы модуля показывают причину и ссылку на активацию вместо пустой страницы или ошибки.
- Безопасность. Технические детали ошибок (проверка подключения, обмен с СБИС и Битрикс24, повторная отправка заказа, выгрузки) больше не выводятся наружу — пользователю показывается обобщённое сообщение. Отладочный лог выгрузки остатков убран из поставки: раньше он писался в общедоступную папку сайта.
- Кодировка интерфейса. Стрелки, галочки и значки статусов оформлены HTML-сущностями — больше не искажаются на сайтах в кодировке UTF-8.
- Фикс: рекурсивный обход иерархии разделов в «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 по логину/паролю.
- Возвращён двухшаговый диалог удаления модуля с выбором «Сохранить настройки» / «Удалить всё».
- Полное удаление настроек теперь действительно очищает все опции модуля и сбрасывает кэш Битрикса.
Обновление рекомендуется всем, кто пользуется блоком «Для получения резервов и внешних кодов» или планирует переустановку модуля.
