Перейти к содержимому

Обмен каталогом с несколькими сайтами и конфигурациями

Настраиваем выгрузку каталога, когда сайтов на установке несколько или учётных конфигураций больше одной, и разводим их так, чтобы данные не смешались.

Решение

Смотрим, какие сайты и инфоблоки участвуют:

$res = CSite::GetList();
while ($site = $res->Fetch()) { printf("сайт=%s %s\n", $site['LID'], $site['NAME']); }
$res = CIBlock::GetList([], ['TYPE' => 'catalog']);
while ($ib = $res->Fetch()) {
printf("инфоблок=%d сайт=%s %s\n", $ib['ID'], $ib['LID'] ?: '(все)', $ib['NAME']);
}

Каждому сайту нужен свой отдельный инфоблок каталога, а не общий с отбором при выводе. Общий инфоблок означает, что товары одного магазина видны во втором, и разделить их потом можно только правкой каждой позиции.

Разводим узлы обмена по приёмникам:

https://shop-a.example.com/bitrix/admin/1c_exchange.php
https://shop-b.example.com/bitrix/admin/1c_exchange.php
# каждый узел учётной системы смотрит на свой адрес и свой инфоблок

Один узел обмена отвечает ровно за один приёмник данных. Два узла, настроенных на один адрес, обмениваются по очереди и переписывают результаты друг друга, а выглядит это как случайно пропадающие товары.

Разделяем цены и склады до первого обмена:

$res = CCatalogGroup::GetList([], []);
while ($price = $res->Fetch()) {
printf("тип цены=%d %s\n", $price['ID'], $price['NAME']);
}
// оптовому сайту - свой тип цены, розничному - свой, иначе цены перезапишутся

Типы цен и склады остаются общими для всей установки. Два магазина, выгружающие цену в один и тот же тип, перезаписывают её друг другу, и второй обмен всегда побеждает первый.

Разводим сеансы по времени:

Окно терминала
grep -c 'Начало сеанса' /home/bitrix/www/upload/1c_catalog/*.log
# одновременные сеансы упираются в общие ограничения и мешают друг другу
ls -l /home/bitrix/www/upload/1c_catalog/ /home/bitrix/ext_www/shop/upload/1c_catalog/
# у каждого сайта свой каталог обмена: файлы двух узлов не должны смешиваться
# в журнале сеанса видно, какой сайт и какая конфигурация его открыли

Одновременный обмен с двух узлов упирается в общие ограничения сервера: память, время выполнения, число процессов. Разнесённые по времени сеансы проходят быстрее двух параллельных.

Разные конфигурации учётной системы говорят между собой на разных версиях самого протокола. Версию обмена стоит проверить до настройки: старая конфигурация не умеет отдавать то, что новая отдаёт по умолчанию, и часть данных до сайта просто не доезжает.

Схему разведения стоит зафиксировать письменно рядом с настройками. Через год после запуска никто не помнит, какой узел пишет в какой инфоблок, и первая же попытка «просто поправить цены» задевает соседний магазин.

Права точки обмена задаются отдельно для каждого из работающих сайтов. Учётная запись обмена одного магазина не должна иметь прав на инфоблок второго: это единственная надёжная защита от перезаписи чужого каталога.

Типичные проблемы

Товары одного магазина видны во втором.

Оба сайта работают с одним общим инфоблоком каталога. Разделение делают отдельными инфоблоками, привязанными каждый к своему собственному сайту.

Второй обмен затирает результаты первого.

Два разных узла обмена настроены на один и тот же приёмник. Каждому узлу нужен свой собственный адрес точки обмена и свой инфоблок.

Цены прыгают после каждого обмена.

Два разных магазина выгружают свою цену в один и тот же тип цены. Типы цен разводят по сайтам ещё до самого первого обмена.

Обмен стал заметно дольше.

Сеансы обмена с разных узлов идут одновременно. Они делят между собой память и рабочие процессы одного сервера.

Часть данных не приезжает от старой конфигурации.

Версия протокола обмена ниже той, что ожидает сайт. Возможности версии проверяют до настройки узла, а не после.

Частые вопросы

Можно ли обменивать один сайт с двумя конфигурациями?

Да, если они отвечают за разные данные: одна за товары, другая за заказы. Две конфигурации на одни и те же товары приводят к перезаписи.

Нужен ли отдельный инфоблок каждому сайту?

Да, если каталоги различаются. Общий инфоблок оправдан только при полностью одинаковом ассортименте.

Как проверить, какой узел что выгрузил?

По журналам обмена: они пишутся отдельно для каждого приёмника. Сопоставление по времени сеанса даёт ответ за минуту.

Что делать при переезде одного из магазинов?

Менять адрес в его узле и проверять внешние коды. Смена адреса без сверки кодов приводит к дублям товаров.

Смежное

Первоисточник