=== GerSync Exchange for 1C ===
Requires at least: 6.4
Tested up to: 7.1
Requires PHP: 8.1
WC requires at least: 8.5
WC tested up to: 11.2
Stable tag: 1.5.0
License: GPLv2 or later
Автор: Игорь Герасимчук — https://www.linkedin.com/in/igor-gerasim%C4%8Duk/
Поддержать: https://buymeacoffee.com/ger.igor

Бесплатный обмен 1С ↔ WooCommerce по стандартному протоколу CommerceML 2 (2.05–2.10).
English version — readme.txt.

== Что умеет ==

* Категории (дерево групп), товары, описания, артикулы, вес, картинки.
* Свойства 1С → глобальные атрибуты WooCommerce (работают в фильтрах).
* Характеристики («Ид#Ид») → вариативные товары с вариациями.
* Цены: выбранный тип цены + необязательный тип цены «распродажи» (по названию или Ид типа).
* Остатки: сумма по всем складам, формат 2.05 и 2.08+ (offers / prices / rests).
* Помеченные на удаление в 1С товары и вариации — в черновики/скрытые или в корзину;
  если пометку сняли — товар возвращается с прежним статусом. Удалённое вручную обмен не трогает.
* Защита полей существующих товаров: название, описание, категории, картинки, артикул, вес, цены, остатки —
  каждое можно запретить перезаписывать. Галочка «Не обновлять из 1С» в карточке товара (вкладка «Запасы»)
  защищает отдельный товар; цены и остатки у него обновляются.
* Атрибуты: «синхронизировать с 1С», «только добавлять значения из 1С» или «не трогать».
  Атрибуты, добавленные вручную, не удаляются ни в каком режиме; видимость и порядок сохраняются.
* Полная выгрузка и выгрузка изменений определяются автоматически. При полной выгрузке товары из 1С, которых
  в ней нет, можно оставить, снять с публикации, поставить «Нет в наличии» или отправить в корзину. Работает в фоне
  после окончания обмена; если пропало больше половины товаров — ничего не делается (защита от оборванного обмена).
* Скорость: товары, которые в 1С не менялись, пропускаются; цены и остатки сохраняются, только если изменились.
  Картинки грузятся один раз — в том числе узнаются картинки прежнего плагина (без дублей после перехода).
  Режим «только размеры WooCommerce» ускоряет загрузку картинок в 2–3 раза.
* «Принудительный полный обмен» (вкладка «Обслуживание») — один раз обработать все товары заново.
* «Очистка картинок» — удаляет картинки обмена, которые больше не стоят ни у одного товара.
* Подхватывает GUID прежнего плагина (поле `_id_1c`) — переход без дублей.
* Polylang / WPML: при одинаковом GUID у переводов обновляется товар/категория основного языка;
  адрес обмена работает и с языковым префиксом (/en/wc1c-exchange/).
* Выгрузка заказов в 1С (после создания и при каждой смене статуса) с доставкой и сборами; приём статусов обратно.
* Пошаговый импорт: большие каталоги грузятся порциями, без тайм-аутов.
* Совместим с HPOS (новым хранением заказов).

== Установка ==

1. Плагины → Добавить новый → Загрузить плагин → выбрать zip.
2. WooCommerce → Обмен с 1С: задать логин (латиницей) и пароль, сохранить.
3. В 1С: Администрирование → Обмен данными → Обмен с сайтами (узел обмена).
   Адрес сайта — ссылка со страницы настроек (https://ваш-сайт/wc1c-exchange/), логин и пароль — из настроек плагина.
4. В 1С выгрузка «товары» → каталог, «заказы» → обмен заказами.

Если 1С пишет «Сервер не получил логин/пароль» — см. подсказку внизу страницы настроек (одна строка в .htaccess).

== Безопасность ==

* Пароль обмена хранится только в виде хеша (не короче 12 символов, без логина и простых слов, есть генератор);
  после входа — случайный токен сессии,
  привязанный к IP. Смена пароля завершает все сессии.
* Режим «Только HTTPS»: запросы по HTTP отклоняются до проверки пароля.
* В пределах сети — одна проверка пароля за раз и пауза 1 с после неверного пароля; блокировка после 10 неверных паролей
  на 15 минут с адреса, дополнительные лимиты на сеть (IPv4 /24; IPv6 /64, /56, /48) и на весь сайт
  (общий лимит не трогает адреса последних успешных входов 1С; успешные входы в лимиты не засчитываются) (для IPv6 — на сеть /64), список разрешённых IP и сетей (CIDR);
  точные разрешённые адреса не блокируются. За Cloudflare/прокси реальный IP берётся только от доверенных прокси
  и только из выбранного заголовка (X-Forwarded-For или CF-Connecting-IP).
* Временная папка со случайным именем, закрыта от прямого доступа (.htaccess / web.config).
  На nginx добавьте в конфиг сервера:
  location ~* /gersync-[a-f0-9]{24}/ { deny all; return 404; }
  Вкладка «Подключение» сама проверяет, закрыта ли папка.
* Если сайт за CDN с правилом «кешировать всё» (Cloudflare Cache Everything), исключите адрес обмена
  (/wc1c-exchange/ или ?wc1c_exchange) из кеширования: Cloudflare → Cache Rules → Bypass cache.
* Строгая проверка имён файлов: только xml/zip/картинки, без «..», без двойных расширений (x.php.jpg), без .htaccess и .user.ini,
  без символических ссылок; защита zip-архивов от выхода за пределы папки, zip-бомб и вложенных архивов.
* Картинки проверяются по содержимому: тип должен совпадать с расширением, не больше 40 мегапикселей. Если внутри есть PHP-код,
  который PHP действительно выполнил бы (проверяется разборщиком PHP при любых настройках коротких тегов), картинка
  перерисовывается или отклоняется.
* Перед приёмом файлов проверяется свободное место на диске и общий объём за сеанс.
* Названия товаров, артикулы, свойства и значения из 1С сохраняются простым текстом; отрицательные и бесконечные цены игнорируются.
* Ответы обмена не кешируются и не содержат текстов ошибок PHP (даже при фатальной ошибке); анонимные запросы не засоряют журнал.
* На вкладке «Подключение» — проверка безопасности: HTTPS, список IP, доступ к временной папке, последний вход 1С, неудачные входы.
* XML разбирается потоково без сетевого доступа и без подстановки внешних сущностей (XXE).
* Описания очищаются через wp_kses_post, картинки проходят штатную проверку WordPress.
* Статусы из 1С применяются только к заказам, которые сайт сам выгружал.
* Внутренние ошибки не показываются наружу — только в журнале WooCommerce (источник «gersync»).

== Связь с 1С ==

GUID из 1С хранится в мета-поле `_gersync_guid` товара, вариации и категории.
В админке он виден на вкладке «Запасы» товара и в каждой вариации; на витрине не выводится.
Для первого обмена с уже заполненным сайтом без GUID включите «Связывать по артикулу».

== Устройство ==

includes/
  Endpoint, Exchange   — приём запросов 1С и протокол
  Auth, Storage, Lock  — авторизация, временные файлы, zip, блокировки
  Import/              — Importer (потоковый проход), Catalog (группы, свойства, типы цен),
                         Session + Missing (полная выгрузка), 
                         Products, Offers, Images, Lifecycle (скрытие/возврат)
  Orders, OrderXml     — выгрузка заказов и приём статусов
  Repo, Lang, Xml      — поиск по GUID, мультиязычность, разбор XML
  Admin, Settings, Log — настройки и журнал

== Это бесплатно? ==

Да, все функции работают без оплаты. Если плагин экономит вам время — поддержать автора можно по ссылке на странице настроек.

== Как обновлять без потери настроек ==

Обычным обновлением WordPress (Плагины → Обновить) — настройки, товары и связи с 1С сохраняются.
Вручную zip-файлом: «Загрузить плагин» → выбрать zip → «Заменить текущую версию загруженной».
Не удаляйте плагин перед установкой новой версии: удаление стирает его настройки (товары и связи с 1С останутся).

== Товарные знаки ==

1С и 1С:Предприятие — товарные знаки фирмы «1С». WooCommerce — товарный знак Automattic Inc.
GerSync — независимый плагин, не связан с фирмой «1С» и Automattic и не одобрен ими.

== Удаление ==

Удаляются настройки и временные файлы. Товары, категории и связи с 1С остаются.

== Изменения ==

1.5.0 — Усиление безопасности: запрет опасных имён файлов и двойных расширений; проверка картинок по содержимому
        (подозрительные перерисовываются, слишком большие отклоняются); выбор заголовка IP для прокси; артикулы и названия — только текст;
        вложенные архивы не распаковываются, проверка места на диске; сессия привязана к IP и паролю, не дольше суток;
        вход с постоянным временем проверки, пароль от 12 символов, IPv6 по сети /64, доверенные прокси;
        названия и значения из 1С — только текст; ответы не кешируются; обновлённые файлы защиты папки и самопроверка доступа;
        режим «только HTTPS» (на новых сайтах с HTTPS включён сразу); разбор X-Forwarded-For без подмены; лимиты входа на сеть и сайт; требования к паролю и генератор; одна проверка пароля за раз с одного адреса;
        тексты ошибок PHP не попадают в ответ; последний вход 1С на странице настроек; быстрый поиск пропавших товаров;
        атомарная блокировка параллельного импорта; товар с ошибкой импорта не считается пропавшим; «пропавшие» товары — только после 15 минут тишины обмена;
        товары, удалённые вручную в корзину, не возвращаются; очистка картинок бережнее; полная очистка при удалении.

1.4.0 — Уникальный префикс gersync (код, настройки, служебные поля) с автоматическим переносом данных 1.0–1.3;
        экранирование при выводе; параметры обмена читаются и очищаются по одному; явная проверка nonce;
        резервная копия настроек.
1.3.0 — Готов к каталогу wordpress.org (название «GerSync Exchange for 1C», slug gersync, проходит Plugin Check); миграции данных при
        обновлении; исправлен вход 1С с паролем, содержащим кавычки или «\»; «кофе автору» и визитка (только в админке);
        пропуск неизменённых товаров; картинки прежнего плагина без дублей; размеры миниатюр;
        принудительный полный обмен; очистка картинок; ответы 1С в Windows-1251; новая страница настроек с вкладками.
1.2.0 — Полная выгрузка / только изменения; защита артикула, веса, цен и остатков; галочка
        «Не обновлять из 1С» в карточке; режимы атрибутов; переводы скрываются и возвращаются вместе с оригиналом.
1.1.0 — Ссылка «Поддержать автора».
        Типы цен из классификатора offers.xml (2.08+); возврат товаров после снятия пометки удаления;
        удаление вариаций; сборы в заказах; статусы только для выгруженных заказов; Polylang/WPML;
        адрес обмена без правил ЧПУ; GUID у вариаций в админке; код импорта разбит на модули.
1.0.0 — Первая версия.
