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

Каталог с сайта в 1С - обратное направление выгрузки

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

Решение

Смотрим, у каких товаров нет внешнего кода:

$res = CIBlockElement::GetList([], ['IBLOCK_ID' => 5, 'ACTIVE' => 'Y'],
false, false, ['ID', 'NAME', 'XML_ID']);
$without = 0;
while ($row = $res->Fetch()) {
if ($row['XML_ID'] === '') { $without++; }
}
printf("товаров без внешнего кода: %d\n", $without);

Пустой внешний код означает, что товар заведён на сайте руками. Именно эти позиции учётная система при обмене не узнаёт: сопоставление идёт по коду, а не по названию или артикулу.

Проставляем внешние коды перед переносом:

$el = new CIBlockElement();
$res = CIBlockElement::GetList([], ['IBLOCK_ID' => 5, 'XML_ID' => false],
false, false, ['ID']);
while ($row = $res->Fetch()) {
// код должен быть уникальным и стабильным: он переживёт все обмены
$el->Update($row['ID'], ['XML_ID' => 'SITE-' . $row['ID']]);
}

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

Собираем файл выгрузки своим кодом:

$xml = new XMLWriter();
$xml->openURI('/home/bitrix/www/upload/site_catalog.xml');
$xml->startDocument('1.0', 'UTF-8');
$xml->startElement('КоммерческаяИнформация');
// дальше - товары с их кодами, названиями и группами по структуре формата
$xml->endElement();
$xml->endDocument();

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

Проверяем, что получилось, до загрузки в учётную систему:

Окно терминала
xmllint --noout /home/bitrix/www/upload/site_catalog.xml && echo 'формат верный'
grep -c '<Товар>' /home/bitrix/www/upload/site_catalog.xml

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

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

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

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

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

Учётная система не узнаёт товары с сайта.

У них пустой внешний код. Сопоставление идёт по коду, а не по названию или артикулу.

После обмена появились дубли товаров.

Внешние коды поменялись. Для учётной системы это новые позиции, а старые остаются на месте.

Файл выгрузки не читается учётной системой.

Нарушена структура формата обмена. Файл проверяют на корректность до загрузки.

Правки в двух системах затирают друг друга.

Настроен постоянный двусторонний обмен каталогом. У данных должен быть один источник истины.

Штатный обмен не отдаёт каталог с сайта.

Это не сбой: обмен каталогом односторонний. Обратный перенос делают своим файлом.

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

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

Технически можно, но это порождает конфликты правок. На практике выбирают одну систему-источник, а вторая только принимает.

Как перенести на сайт товары, заведённые в учётной системе позже?

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

Что делать с фотографиями при обратном переносе?

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

Нужен ли для этого модуль обмена?

Нет, файл собирается своим кодом. Модуль обмена отвечает за штатное направление и в обратном не участвует.

Смежное

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