| 1.5.0 (01.09.2026) |
- Габариты доезжают на сайт тремя разными числами, а не одной длиной трижды. Формат YML держит все три размера в одной строке «<dimensions>60.000/2.000/3.000</dimensions>», а в Битриксе длина, ширина и высота — три отдельных поля. Один тег на три поля не раскладывается: импорт приводил строку к числу и каждый раз получал 60 — длина ложилась верно, а ширина с высотой молча повторяли её. Ошибки нигде не было: файл верный, просто сопоставление не могло выразить нужное. Теперь рядом со старыми тегами выгружаются «<length_mm>», «<width_mm>» и «<height_mm>».
- Вес и размеры сразу в тех единицах, в каких их хранит Битрикс. YML считает вес в килограммах, а габариты в сантиметрах; Битрикс — в граммах и миллиметрах. Раньше пересчёт приходилось задавать в профиле импорта руками. Появился «<weight_g>» в граммах, а три новых тега габаритов сразу в миллиметрах — сопоставлять поля можно напрямую, без преобразований. Старые «<weight>» и «<dimensions>» остались как были, уже настроенные профили не тронуты.
- Незаполненный размер не превращается в ноль. Если в карточке СБИС задана только длина, в файл уедет только она, а ширина и высота останутся без тега — иначе импорт затёр бы нулями то, что уже стоит на сайте.
- У расписания появилось время запуска. Раньше задавался только интервал, а первый запуск вставал на «сейчас плюс интервал», то есть в случайное время. К тому же Битрикс считал следующий запуск от окончания предыдущего, и выгрузка каждые сутки уползала вперёд на длительность обмена. Где файл забирает импорт по расписанию хостинга, это ломает порядок: выгрузка заходит за время импорта, и на сайт начинает приезжать вчерашний файл — без единой ошибки в отчётах. Теперь рядом с интервалом есть поле времени, и заданный час держится.
- В таблице расписаний видно, когда будет следующий запуск. Значение берётся у самого Битрикса, а не считается заново: показывать надо то, что сайт действительно сделает.
- Таблицы модуля больше не спорят с кодировкой базы. Кодировка была зашита в код жёстко, и на базе с другой кодировкой штатная проверка сайта «Кодировки таблиц в БД» отдавала ошибку. Теперь модуль не называет кодировку вовсе и берёт ту, что стоит у базы; уже созданные таблицы приводятся к ней при обновлении.
- Модуль больше не спорит с соседними модулями Винтры за значок меню. Обработчик общего пункта «Винтра.Хаб» носил имя, одинаковое у нескольких наших модулей: на сайте с двумя из них иконка зависела от того, кто загрузился первым. Имя разведено по своему пространству имён.
- Из поставки убраны четыре неиспользуемых адреса. Папка «ajax/» дублировала живой обработчик и не вызывалась ниоткуда, при этом оставалась четырьмя лишними точками входа на сайте. При обновлении файлы удаляются и с уже установленных сайтов.
- Русские комментарии в разметке страниц переведены на латиницу. Пользователю они не видны, но в архиве превращались в «?».
|
| 1.4.0 (24.08.2026) |
- Новые и изменённые позиции приезжают на сайт за минуты, а не на следующие сутки. Появился «сторож каталога»: раз в несколько минут он спрашивает у СБИС состав каталога, сравнивает с прошлой проверкой и складывает в отдельный небольшой файл только то, что появилось или изменилось. Полный обмен как шёл раз в сутки, так и идёт — сторож ничего не заменяет, а закрывает разрыв между «менеджер завёл позицию в СБИС» и «она видна в магазине». Человеку, работающему в СБИС, заходить в админку сайта не нужно.
- Сравнивается состав, а не количество. По числу позиций нельзя понять, какая из них новая: даты создания СБИС не отдаёт вовсе. Поэтому сторож держит отпечаток каждой позиции — имя, цена, раздел, вес, габариты — и видит поимённо, что появилось, что изменилось и что исчезло. Одним запросом на всю проверку.
- Дельта копится до полной выгрузки. Файл не переписывается каждый раз, а дополняется: иначе позиция, которую импорт не успел забрать, потерялась бы при следующей проверке. Суточный обмен забирает всё разом и очищает накопитель.
- Важно: для файла дельты нужен отдельный профиль импорта — копия основного, но с выключенными действиями при отсутствии элемента в файле. Файл содержит несколько позиций, и обычные настройки деактивировали бы по нему весь каталог. В подсказке к настройке об этом сказано прямо.
- Предохранитель на размер дельты. Если изменилось больше позиций, чем задано в настройке (по умолчанию сто), точечная догрузка пропускается — такие изменения заберёт полная выгрузка. Это защита от лавины запросов после пересборки прайс-листа, когда отпечатки меняются у всех позиций разом.
- Замок от одновременных обменов. Его не было вовсе: пока обмен шёл раз в сутки, это не мешало, а со сторожем пересечение стало вопросом времени. Теперь полная выгрузка и сторож не наступают друг другу на ноги, а замок сам снимается по сроку годности, чтобы упавший процесс не запер обмен навсегда.
- Файл дельты создаётся сразу, даже пустым. Профиль импорта, натравленный на несуществующий файл, не падает, а зависает: проверено на живом сайте — процесс прожил десять минут с пустым журналом. При запуске раз в несколько минут такие процессы копились бы до исчерпания памяти.
|
| 1.3.1 (24.08.2026) |
- Товары с ценой больше не пропадают из выгрузки. При привязке разделов к каталогу модуль выбрасывал всё, чего не оказалось в каталожной выгрузке СБИС, считая это признаком «у товара нет цены». Признак неверный: каталожная выгрузка отдаёт не весь прайс-лист. На живой базе из 3598 позиций прайса в неё попали 2956, а у 68 из 642 отброшенных цена стояла — в том числе в карточке каталога. Товары молча исчезали с сайта: файл собирался без ошибок, отчёт импорта был чистым, а заметить пропажу можно было только поиском конкретного штрихкода. Теперь раздел для таких товаров достраивается по карте соответствия категорий прайс-листа каталожным, собранной по товарам, которые нашлись в обоих источниках. Отбрасываются только те, для кого раздела не существует вовсе.
- Отсев товаров без цены стал настройкой. Раньше он существовал лишь как побочный эффект предыдущего пункта и утаскивал за собой лишнее. Теперь это явное правило «Товары без цены: не выгружать / выгружать вместе с остальными». Умолчание сохраняет прежнее поведение каждой установки: при привязке разделов к каталогу такие товары не выгружались и раньше, при привязке к прайс-листу — выгружались.
- Страница «Запуск вручную» показывает, что отсеялось. После обмена рядом с числом выгруженных товаров выводится, сколько не попало в файл без цены, сколько — без раздела в каталоге СБИС, и скольким раздел был достроен. Молчаливая потеря части каталога — ровно то, из-за чего понадобилась эта версия.
- Текст ошибки «в каталожной выгрузке нет ни одного товара» больше не врёт. Он называл причиной отсутствие цен у товаров; настоящая частая причина — код папки каталога в настройках указывает не на ту ветку.
- Плашка о прайс-листе больше не спорит с настройкой, стоящей под ней. Она советовала заливать прайс поверх и не пересоздавать его. Для привязки разделов к прайс-листу это верно, а для привязки к каталогу — вредно: номера каталога пересборку переживают, зато накат поверх копит в прайсе то, чего в каталоге давно нет. На живой базе пересборка начисто убрала восемь папок, где вперемешку лежали товары из разных категорий каталога. Теперь текст плашки зависит от выбранного режима.
- Модуль больше не может уронить соседний модуль Винтры. Класс плашки демо-режима носил общее имя «WintraTrialNotice» — такое же, как в других наших модулях. Если рядом стоял ещё один, второй объявлял класс повторно и падал с фатальной ошибкой, причём падал именно сосед, а не виновник. Класс переименован в «WintraSbisTrialNotice».
- Страница «Сопоставление с Б24» больше не меняет данные при простом открытии. Она молча удаляла из базы решения по позициям, которых не стало в снимке СБИС, — прямо на загрузке страницы, без проверки токена сессии. Открытая по чужой ссылке администратором, она сработала бы так же. Удаление было лишним: настоящая уборка выполняется при пересчёте плана и токеном защищена. Теперь страница только скрывает устаревшие записи из выборки.
- Сообщения об ошибках больше не показывают внутренние подробности. В трёх местах — на страницах сопоставления и сравнения с Битрикс24 и при проверке вебхука — печатался текст исключения, а туда попадают адрес вебхука и ответ портала. Вместо него выводится понятное объяснение, что проверить.
- Обновление модуля больше не рискует зависнуть. Скрипт обновления подключал модуль в тот момент, когда его файлы скопированы наполовину. Подключение убрано, регистрация обработчика меню в нём не нуждается.
|
| 1.3.0 (21.08.2026) |
- Разделы можно привязывать к каталогу СБИС, а не к прайс-листу. До этой версии разделы сайта связывались с номером папки в дереве прайс-листа. Этот номер выдаётся заново при каждой пересборке прайса: на живой базе после полной пересборки из 3510 товаров номер позиции сменился у всех, а каталожный код — ни у одного. В результате обмен создавал дерево разделов заново, а прежние разделы оставались пустыми, и происходило это молча — импорт отрабатывал без ошибок. Теперь в настройках есть выбор «Разделы привязывать к: каталогу СБИС / прайс-листу». Структура берётся одним дополнительным запросом, поштучных обращений не добавилось.
- Обновление ничего не ломает. У сайтов, которые обновляются с прежних версий, привязка остаётся прежней — прайс-листовой. Каталожная включается только вручную и предупреждает о последствиях. Новые установки сразу получают привязку к каталогу.
- Ограничение выгрузки одной папкой каталога. В каталоге СБИС рядом с торговыми папками обычно лежат учётные — «Архив», «Не для продажи», «НЕ индексируется». Без ограничения они попадали в файл и создавались на сайте пустыми разделами. Появилось поле «Код папки каталога СБИС».
- Штрихкоды раскладываются по типам. СБИС отдаёт штрихкоды массивом в непредсказуемом порядке: у одного товара EAN13 идёт первым, у соседнего — вторым, после внутреннего короткого кода. Профиль импорта берёт первый, поэтому часть товаров молча меняла символьный код, а вместе с ним и адрес страницы: на живом каталоге так пострадали 27 товаров из 2854, их прежние ссылки стали отдавать 404. Теперь рядом с общим тегом выгружается тег на каждый тип — «barcode_ean13», «barcode_shortcode» и так далее, — и в профиле импорта каждый тип раскладывается в своё поле. Общий тег сохранён, настроенные профили не затронуты.
- Вес, габариты и страна происхождения. Раньше не выгружались вовсе: список номенклатуры этих полей не отдаёт. Теперь берутся из каталожной выгрузки тем же запросом. На проверочной базе вес заполнился у 736 товаров.
- Кнопка «Загрузить из СБИС» у фильтра по характеристике снова работает. Список характеристик собирался с первой страницы номенклатуры от корня каталога. Если в корне лежат только папки — а так устроен любой обычный каталог, — товаров в выборке не оказывалось, и модуль отвечал «в номенклатуре нет характеристик». Сообщение звучало как факт о данных пользователя. Теперь модуль спускается по дереву и останавливается, набрав достаточно товаров; отдельно различаются «характеристик нет» и «товаров в выборке нет».
- Панель «Сохранить» больше не прячется под сгибом. Форма настроек длинная, и кнопку приходилось искать прокруткой. Панель действий прибита к нижней части формы и видна всегда.
- Секреты в настройках скрыты. Защищённый ключ, сервисный ключ и адрес вебхука Битрикс24 выводились открытым текстом и читались с экрана. Теперь скрыты, как и пароль сотрудника.
- Блок «Резервы и внешние коды» разделён на два. Четыре поля шли одним списком, хотя работают независимыми парами: логин с паролем дают резервы, подключение с галочкой — внешние коды маркетплейса. Настраивающий читал блок сверху вниз и выбирал подключение, которое резервам не нужно. Теперь это два блока со своими заголовками и пояснениями, второй помечен как редко нужный.
- Понятно, что такое «external_id». Сквозной код товара выгружается всегда и никаких настроек не требует — это отдельный тег, не связанный с галочкой «внешние коды». В блоке настроек об этом сказано прямо, и там же названа цена включения внешних кодов в минутах.
- Страница «Запуск вручную» приведена в порядок. Блоки идут по ходу дела: номенклатура, остатки, Битрикс24. Все кнопки выглядят одинаково и показывают, что работа идёт, — раньше у выгрузки остатков не было ни того, ни другого, и нажатие выглядело как «не сработало». Блок Битрикс24 показывается, только когда интеграция настроена. Уточнено описание выгрузки остатков: она не быстрее выгрузки номенклатуры, каталог обходится целиком.
- Убраны искажённые символы в интерфейсе. Тире, стрелки и разделители были записаны в разметке напрямую и на сайтах в UTF-8 отображались ромбиками — например, в колонках «Размер» и «Обновлён» таблицы текущих файлов.
|
| 1.2.14 (11.08.2026) |
- Текст на странице настроек больше не превращается в «?????» на UTF-8-сайтах. Блок «Для получения резервов и внешних кодов» был написан прямо в разметке страницы. Архив маркетплейса собирается в кодировке cp1251, и такой текст на сайте в UTF-8 отображался вопросительными знаками. Все подписи блока перенесены в языковой файл — Битрикс отдаёт их в кодировке сайта.
- Починены два тихих отказа по той же причине. Имя параметра запроса к API СБИС и признаки временной блокировки в ответе сервиса тоже были записаны в коде по-русски: после сборки они переставали совпадать, из-за чего постраничная навигация и повтор при ограничении частоты запросов молча не срабатывали.
|
| 1.2.13 (11.08.2026) |
- Демонстрационный режим виден в модуле. На страницах модуля появилась штатная плашка Битрикса с обратным отсчётом: «Демонстрационный режим работы модуля. Осталось дней: N» и ссылкой на покупку.
- Понятное сообщение после окончания демо. Когда демонстрационный период истёк, страницы модуля показывают причину и ссылку на активацию вместо пустой страницы или ошибки.
- Безопасность. Технические детали ошибок (проверка подключения, обмен с СБИС и Битрикс24, повторная отправка заказа, выгрузки) больше не выводятся наружу — пользователю показывается обобщённое сообщение. Отладочный лог выгрузки остатков убран из поставки: раньше он писался в общедоступную папку сайта.
- Кодировка интерфейса. Стрелки, галочки и значки статусов оформлены HTML-сущностями — больше не искажаются на сайтах в кодировке UTF-8.
|
| 1.2.12 (10.06.2026) |
- Фикс: рекурсивный обход иерархии разделов в «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 через очередь вместо одного прохода).
|
| 1.2.11 (10.06.2026) |
- Фикс: резервы через «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».
|
| 1.2.10 (08.06.2026) |
- Фикс: кракозябры в 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.
|
| 1.2.9 (08.06.2026) |
- Фикс: резерв в «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()».
|
| 1.2.8 (08.06.2026) |
- Технический релиз: переподписка 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]» в «ДвиженияПоРезервам.ПолучитьДанные» уже в коде).
|
| 1.2.7 (08.06.2026) |
- Убран хардкод «ФильтрКатегорияТовара = [170]» в запросе «ДвиженияПоРезервам.ПолучитьДанные» («src/lib/stocks.php» — «runReserves()» и «enrichReserves()»). Это был chromart-специфичный id категории «Товары», на других сайтах СБИС метод молча возвращал пустоту ? в «stocks.xml» всегда «reserve=0», без ошибок в логе. Теперь фильтр по категории пуст — резерв подтягивается по любой номенклатуре. Прецедент: wintramedia.ru, товар id=195, резерв в счёте не отображался в выгрузке.
|
| 1.2.6 (08.06.2026) |
Что в версии 1.2.6:
- Возвращена кнопка «Загрузить» рядом с полем «Подключение сайта» в настройках модуля. Подгружает список маркетплейс-подключений SABY по логину/паролю.
- Возвращён двухшаговый диалог удаления модуля с выбором «Сохранить настройки» / «Удалить всё».
- Полное удаление настроек теперь действительно очищает все опции модуля и сбрасывает кэш Битрикса.
Обновление рекомендуется всем, кто пользуется блоком «Для получения резервов и внешних кодов» или планирует переустановку модуля.
|