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

Не выгружаются товары из 1С - причины по убыванию частоты

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

Как проверить

Смотрим лог обмена и ищем в нём строку отказа:

Окно терминала
ls -lt /home/bitrix/www/upload/1c_catalog/ | head
grep -n 'FAILURE\|error\|Ошибка' /home/bitrix/www/upload/1c_catalog/*.log | tail -20

Лог пишется на каждый сеанс. Пустой каталог при слове SUCCESS в логе означает, что данные приехали, но легли не туда, куда смотрит витрина.

Считаем, сколько элементов реально в инфоблоке:

$total = CIBlockElement::GetList([], ['IBLOCK_ID' => $iblockId], []);
$active = CIBlockElement::GetList([], ['IBLOCK_ID' => $iblockId, 'ACTIVE' => 'Y'], []);
echo "всего {$total}, активных {$active}\n";

Сверяем инфоблок, в который пишет обмен, с тем, что выводит витрина:

// тип каталога из узла обмена 1С хранится в настройках модуля
echo COption::GetOptionString('catalog', '1C_IBLOCK_TYPE_ID'), "\n";
// инфоблоки этого типа: сюда обмен и складывает товары
$list = CIBlock::GetList([], ['TYPE' => COption::GetOptionString('catalog', '1C_IBLOCK_TYPE_ID')]);
while ($iblock = $list->Fetch()) {
printf("%4d %-30s код=%s\n", $iblock['ID'], $iblock['NAME'], $iblock['CODE']);
}

Расхождение между этими числами сразу отделяет «не приехали» от «приехали, но неактивны»: во втором случае обмен отработал, а товары деактивированы.

Причины

  1. Товары приехали в другой инфоблок примерно 40% случаев

    ПризнакВ логе SUCCESS, элементы в базе есть, но витрина пуста.

    ПроверкаСверяем идентификатор инфоблока в узле обмена 1С с тем, который выводит компонент каталога.

    Что делатьПравим тип каталога в узле обмена 1С и повторяем выгрузку; лишний инфоблок удаляем после сверки.

  2. Обмен оборвался по времени на середине примерно 30% случаев

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

    ПроверкаСверяем max_execution_time в PHP с настройками import_interval и import_size модуля каталога.

    Что делатьУменьшаем число элементов за шаг, а не поднимаем лимит времени на весь сайт.

  3. Нет прав на каталог загрузки примерно 20% случаев

    ПризнакXML в /upload/1c_catalog/ не появляется или лежит нулевого размера.

    ПроверкаСмотрим владельца и права каталога, свободное место и upload_max_filesize.

    Что делатьВозвращаем каталогу владельца веб-сервера и поднимаем предел размера загружаемого файла.

  4. Товары отсечены фильтром на стороне 1С примерно 10% случаев

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

    ПроверкаОткрываем узел обмена в 1С и смотрим отбор номенклатуры и признак выгрузки на сайт.

    Что делатьСнимаем отбор в 1С: со стороны сайта расширить состав выгрузки нечем.

Если ничего не помогло

Включаем подробный протокол обмена:

COption::SetOptionString('catalog', 'log_level', '3'); // 0 - выключен, 3 - подробный

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

Проверяем каталог загрузки и место на диске:

Окно терминала
ls -ld /home/bitrix/www/upload/1c_catalog/ # владелец должен быть веб-сервер
df -h /home/bitrix/www/upload # обмен молча падает при нехватке места
php -r 'echo ini_get("upload_max_filesize"), " ", ini_get("post_max_size"), "\n";'

Смотрим, дошла ли 1С до сайта вообще:

Окно терминала
grep '1c_exchange' /var/log/nginx/access.log | tail -20

Каждый сеанс обмена оставляет серию запросов с параметрами type=catalog и mode=checkauth, init, file, import. Пустой вывод означает, что проблема до сайта не дошла: неверный адрес узла, авторизация или закрытый по IP доступ. Код 401 в ответе на checkauth - пароль пользователя обмена, код 403 - права этого пользователя на обмен.

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

Почему обмен пишет SUCCESS, но товаров нет?

Обмен отчитывается об успешном разборе файла, а не о том, что витрина показывает товары. Чаще всего элементы легли в другой инфоблок, реже - приехали неактивными. Обе версии проверяются одним запросом к базе по идентификатору инфоблока.

Выгружается 7 товаров из 700, что смотреть первым?

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

Товары приехали, но без цен и остатков.

Цены и остатки идут отдельными файлами после номенклатуры. Если обмен оборвался между файлами, товары уже есть, а цены нет. В логе видно, какой файл разобран последним.

Помогает ли повторный запуск обмена?

Только при обрыве по времени, и то частично: обмен продолжит с прерванного места, но пачку, на которой упал, разберёт заново. При неверном узле или отборе в 1С повтор даст тот же результат.

Смежное

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