Никита Митусов Обсудить задачу

Arctic Elite. Обмен, который пошёл обратно

Мой плагин обмена 1С и WooCommerce. После сбоя базы 1С сайт стал источником, а 1С подключилась к нему как к Битриксу и забрала каталог обратно.

1.0.0

5 февраля 2026
первый релиз

Плагин мой: сделал и выложил с открытым кодом. Заказчик нашёл его и пришёл к автору. На свежих WordPress и WooCommerce он не ставился, а заказчику надо было сдать магазин своему клиенту.

магазин
зимняя одежда на WooCommerce
каталог
почти 300 моделей, около 2,6 тысячи вариаций
код
8 022 строки PHP в 11 файлах, сборка 1.2.5
моя роль
Автор и ведущий плагина. Написал обмен 1С и WooCommerce, довёл его на реальном каталоге, настроил сервер, сделал обратную загрузку в 1С
другие
Заказчик дал настоящие файлы выгрузки, прогонял обмены, показал, что обратный путь возможен, и провёл итоговую проверку
период
март – октябрь 2026
стек
PHP, WordPress, WooCommerce, CommerceML 2.08, 1С:Розница 3, 1С Fresh, nginx, Docker

Оценка: пара часов. Дальше будет видно, чем это кончилось.

1.0.x

апрель
чужие данные

22 сборки за 17 дней

До 3 апреля я правил вслепую. Мой образец XML весил 6 КБ, настоящая выгрузка оказалась другой. Попросил настоящие файлы, и цепочка пошла вперёд. Протащи ползунок.

5 апреля

Наличие

Осталось то, что всплывёт через десять дней.

товар
Куртка West Bloom
тип
вариативный
цена
есть, плюс акционная
размер
48 52 56
наличие
по каждой вариации
  • XML-файлы дописывались при повторном обмене, namespace и BOM ломали разбор
  • настройки слетали: вкладки делили одну группу
  • цена: один тип основной цены и отдельное поле акционной
  • товар оставался простым: кеш WooCommerce откатывал тип при сохранении
  • вариации показывали «любой»: передавалось значение вместо slug термина
  • логика вариаций переписана целиком
  • общий остаток, управление запасами, Производитель отдельным атрибутом
  • блок «Технологии и особенности» встроен в плагин: значки и подпись на чёрной плашке

15–19 апреля
своя ошибка

12

на сайте. В 1С по-прежнему 12

Остаток, который рос сам

Обмен прошёл, и на сайте 24, потом 36. Правки вслепую не помогали, логи были пусты, а заказчик всё это время гонял обмены и присылал результаты.

Нажми «Обмен» несколько раз.

Тогда я развернул проверку у себя: 25 тестов, проблема оказалась в базе. Судя по коду, плагин писал вариативному родителю сумму остатков, хотя своего остатка у него нет, и в таблице поиска значение складывалось. Теперь остаток ставится вариации один раз.

504

31 мая, чужой сервер

100 секунд против 60

После перехода на новую панель сервера обмен доходил почти до конца и падал. Товары при этом приезжали. Журнал плагина дал точную картину. Тащи время сам.

100секунда15:07:51

PHP
nginx
PHP
Закончил. created: 278. Отдавать success уже некому.
nginx
На 60-й секунде отдал 504.
1С
Получила HTML вместо success: «Получен неизвестный статус импорта». Запускает обмен снова.

Таймаут уже пытались увеличить, и правка была верной по смыслу. Но директива proxy_* не действует на PHP, который отдаётся через FastCGI, поэтому оставались 60 секунд по умолчанию. Заодно нашёлся баг плагина: 17 битых записей GUID → категория. Товары и вариации умели лечить такой маппинг, а категории нет. Исправил.

14 октября 2026

  1. Обмен всегда течёт в одну сторону. 1С главная, сайт зеркало.
  2. Сбой, база 1С потеряна. Всё, что осталось, лежит на сайте.
  3. Течение разворачивается: из зеркала надо восстановить оригинал и не сломать дальнейший обмен.

1.1.0

14 октября
файлы

Первый способ: ZIP с import.xml и offers.xml и инструкция. На настоящей выгрузке всё сходилось, но на макете. Заказчик поставил 1С и ответил: в 1С нет такого пути. Заодно подсказал другой: 1С умеет сама забирать товары с сайта.

1.2.0, 14 октября, маска

1С думает, что говорит с Битриксом

Сайт на WooCommerce отвечает так же, как Битрикс: тот же адрес, те же шаги, те же строки. Протокол восстановлен по исходникам, официального описания этого режима я не нашёл.

1С:Розница 3
  1. GET /bitrix/admin/1c_exchange.php?type=get_catalog&mode=checkauthsuccess
  2. …&mode=query&package=0С сайта выгружено 0 из 289 товаров. <КоммерческаяИнформация ПараметрПакета="0">
  3. …&mode=query&package=100С сайта выгружено 100 из 289 товаров.
  4. …&mode=query&package=200С сайта выгружено 200 из 289 товаров.
  5. …&mode=query&package=289Дальше предложения, порциями до 2 649.
  6. …&mode=queryfinished=yes

1С сама дописывает /bitrix/admin/1c_exchange.php, а nginx отдаёт 404 на несуществующий php. Поэтому плагин создаёт настоящий файл по кнопке, а адрес вводится только доменом. Живой сайт не менялся: 1С только читала.

15 октября, настоящая 1С Fresh

На макете всё было зелёным

1.2.0→ 1.2.1 пакетный режим

«Не найден параметр НомерПакета»

Розница 3 работает в пакетном режиме, а плагин отдавал старый формат.

Пакетный режим, ПараметрПакета, схема CommerceML 2.08.

1.2.1→ 1.2.2 package=0 начинает заново

«Иерархия товаров: 0»

Розница 3 не присылает mode=init и не несёт куку сессии, сайт продолжил с шага упавшей попытки.

package=0 всегда начинает заново.

1.2.2→ 1.2.3 декодирование имён

Всё читается, но в названиях &amp;

WordPress хранит имена с HTML-сущностями.

Декодирование при выгрузке.

1.2.3→ 1.2.4 поля есть всегда

Падение на 3%: «Поле объекта не обнаружено (Картинка)»

1С читает часть полей без проверки, а у 8 товаров не было jpg, png или gif.

Поля отдаются всегда, пусть пустые, как у Битрикса.

1.2.4загружено

«Данные успешно загружены»

289
товаров
2 649
предложений
1 041
картинка

Запрос 14 октября, готово 15-го. 29 пакетов при лимите 100, полная загрузка около 12 минут. Все четыре падения случились уже после зелёных тестов на макете.

1.2.5

16 октября
последний штрих

Заказчик попросил писать в характеристике только значения. 1С берёт имя характеристики из имени предложения.

Нажми на название. Заказчик на следующий день: характеристики как надо. Пересказ из переписки.

Что проверено, а что нет

Настоящая 1С и настоящий сайт

  • Установка на свежие WordPress и WooCommerce
  • Товары, вариации, цены, акции, остатки на 1С заказчика
  • Обмен после правки таймаута, со слов заказчика
  • Загрузка каталога с сайта в 1С: 1С Fresh, Розница 3.0, тестовая база
  • То же в рабочую базу заказчика, со слов заказчика
  • Повторная загрузка без дублей: 27 товаров нашлись по Ид сайта

Проверка на макете

  • Выгрузка заказов с сайта в 1С: стенд, 16 из 16
  • Эмулятор 1С и сверка: 17 из 17 и 15 из 15
  • Адрес Битрикса 6 из 6, админка 20 из 20
  • Общий набор 78 из 79
  • Схема XDTO: 29 пакетов без ошибок

Не проверено

  • УНФ 3 отдельно: логика та же, но только по исходникам
  • Старые версии УНФ и старый формат
  • Статусы и трек-номера из 1С: код есть, живого подтверждения нет
  • Обычный обмен 1С → сайт после загрузки в новую базу: результата нет

Известные ограничения

  • webp 1С не принимает: 8 товаров пришли без фото
  • 1С качает картинки по одной, полная загрузка идёт около 12 минут
  • Уже созданные характеристики 1С не переименовывает
  • Открытая версия пока 1.0.0. Всё после апреля есть только в сборках для заказчика
«Вроде всё круто.»

Заказчик, 15 октября. Пересказ из переписки. Пишет он сдержанно, высшая оценка здесь другая: с потерянной базой он пришёл к автору плагина.

Перед тем как обещать пару часов, надо просить настоящий файл выгрузки. Открытый плагин становится полезным, когда его доводят до конкретной 1С. А проверять обмен надо на настоящей 1С: макет этих ошибок не показал.

Нужно похожее? Интеграции с 1С и CRM: от 12 000 ₽