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 апреля
своя ошибка
на сайте. В 1С по-прежнему 12
Остаток, который рос сам
Обмен прошёл, и на сайте 24, потом 36. Правки вслепую не помогали, логи были пусты, а заказчик всё это время гонял обмены и присылал результаты.
Нажми «Обмен» несколько раз.
Тогда я развернул проверку у себя: 25 тестов, проблема оказалась в базе. Судя по коду, плагин писал вариативному родителю сумму остатков, хотя своего остатка у него нет, и в таблице поиска значение складывалось. Теперь остаток ставится вариации один раз.
504
31 мая, чужой сервер
100 секунд против 60
После перехода на новую панель сервера обмен доходил почти до конца и падал. Товары при этом приезжали. Журнал плагина дал точную картину. Тащи время сам.
секунда15:07:51
- PHP
- Закончил. created: 278. Отдавать success уже некому.
- nginx
- На 60-й секунде отдал 504.
- 1С
- Получила HTML вместо success: «Получен неизвестный статус импорта». Запускает обмен снова.
Таймаут уже пытались увеличить, и правка была верной по смыслу. Но директива proxy_* не действует на PHP, который отдаётся через FastCGI, поэтому оставались 60 секунд по умолчанию. Заодно нашёлся баг плагина: 17 битых записей GUID → категория. Товары и вариации умели лечить такой маппинг, а категории нет. Исправил.
14 октября 2026
- Обмен всегда течёт в одну сторону. 1С главная, сайт зеркало.
- Сбой, база 1С потеряна. Всё, что осталось, лежит на сайте.
- Течение разворачивается: из зеркала надо восстановить оригинал и не сломать дальнейший обмен.
1.1.0
14 октября
файлы
Первый способ: ZIP с import.xml и offers.xml и инструкция. На настоящей выгрузке всё сходилось, но на макете. Заказчик поставил 1С и ответил: в 1С нет такого пути. Заодно подсказал другой: 1С умеет сама забирать товары с сайта.
1.2.0, 14 октября, маска
1С думает, что говорит с Битриксом
Сайт на WooCommerce отвечает так же, как Битрикс: тот же адрес, те же шаги, те же строки. Протокол восстановлен по исходникам, официального описания этого режима я не нашёл.
GET /bitrix/admin/1c_exchange.php?type=get_catalog&mode=checkauthsuccess…&mode=query&package=0С сайта выгружено 0 из 289 товаров. <КоммерческаяИнформация ПараметрПакета="0">…&mode=query&package=100С сайта выгружено 100 из 289 товаров.…&mode=query&package=200С сайта выгружено 200 из 289 товаров.…&mode=query&package=289Дальше предложения, порциями до 2 649.…&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 декодирование имён
Всё читается, но в названиях &
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С: макет этих ошибок не показал.