Проблема некорректного распределения товаров по разделам при обмене между 1С и «1С-Битрикс» — одна из самых трудоемких в отладке. Ситуация, когда в файле выгрузки import.xml указан верный идентификатор группы, но после завершения импорта тысячи товаров оказываются в корне каталога, часто ставит в тупик даже опытных разработчиков. Рассмотрим подробно, почему так происходит, как работает механизм «пакетного обмена» и на что обратить внимание при настройке интеграционного модуля.
Для начала разберем, как работает альтернативный модуль обмена от Битрикс (версии 7.x и выше). В отличие от стандартных механизмов, здесь используется промежуточное звено — регистр сведений Б_ПакетныйОбмен (синоним «(Битрикс) Пакеты выгрузки данных»). Процесс выгрузки разделен на три этапа:
Б_ПакетныйОбмен, после чего на их основе генерируется XML-файл.Проанализируем ситуацию: если при частичной выгрузке (только изменений) товар попадает в нужную группу, а при полной — в корень, значит, проблема кроется либо в иерархии разделов, либо в способе формирования пакетов для полной выборки. Выясним причину, изучив состояние регистра Б_ПакетныйОбмен. Если в этом регистре идентификатор каталога для товара уже указан как корневой, то проблема на стороне 1С (логика запроса). Если же в регистре и XML данные верны, но на сайте товар «слетает», проблему нужно искать в настройках инфоблока или логике импорта Битрикса.
Рассмотрим основные технические причины, по которым CMS может игнорировать указанный в файле раздел:
XML_ID, но сам раздел еще не создан или не был передан в текущем сеансе полной выгрузки (в секции классификатора), система может не найти родителя и поместить товар в корень.Если мы заметили, что в пакетах выгрузки данные отличаются от фактических в справочнике «Номенклатура», необходимо проанализировать запрос, формирующий эти пакеты. Часто в модулях версии 7.0.1.6 используется сложная иерархия временных таблиц. Разберем пример запроса, который может участвовать в определении групп:
ВЫБРАТЬ
Б_ПользовательскиеГруппыТоваровТовары.Ссылка КАК Ссылка
ИЗ
Справочник.Б_ПользовательскиеГруппыТоваров.Товары КАК Б_ПользовательскиеГруппыТоваровТовары
ГДЕ
Б_ПользовательскиеГруппыТоваровТовары.Номенклатура = &Номенклатура
ИТОГИ ПО
Ссылка ИЕРАРХИЯ
Важно понимать, что если товар в 1С по ошибке включен в несколько «пользовательских групп» или иерархия справочника имеет циклы, компоновщик данных может выдать непредсказуемый результат. Проанализируем код формирования XML после заполнения регистра пакетов. Именно там происходит финальная сборка тега Группы для каждого товара.
Рассмотрим еще одну неочевидную проблему: сбой выгрузки всего пакета из-за одного некорректного объекта. В Битриксе включена строгая валидация данных (например, формата Email для контрагентов или обязательных свойств для товаров). Если один товар или контрагент в пакете содержит ошибку (например, «Неверный email»), сервер может вернуть ошибку на весь POST-запрос.
В этом случае 1С часто ведет себя некорректно: она может снять регистрацию изменений со всех объектов пакета, хотя фактически на сайте не обновился ни один из них. Чтобы этого избежать, необходимо:
/bitrix/php_interface/dbconn.php, чтобы видеть реальные ответы SQL-сервера.Иногда проблема является «мнимой» и связана с особенностями отображения данных в административной панели сайта. В новых версиях Битрикса используется механизм «ленивой загрузки» разделов. Рассмотрим ситуацию: программист открывает карточку товара, смотрит список разделов и видит, что группа не установлена. Однако, как показывает практика, иногда нужно нажать специальный «ползунок» или кнопку развертывания дерева в интерфейсе, чтобы увидеть актуальную привязку.
Чтобы окончательно убедиться, привязан ли товар к группе, рекомендуется проверять данные напрямую в базе данных сайта (таблица b_iblock_section_element) или через список элементов инфоблока, добавив колонку «Разделы».
Для исправления ситуации с «вылетом» товаров в корень выполним следующие действия:
Б_ПакетныйОбмен. Это исключит влияние старых данных, которые могли остаться от прерванных сессий обмена.ИдентификаторДляОбмена или аналогичный) совпадают с XML_ID разделов на сайте.import.xml (или в отдельном файле классификатора) присутствует полная структура разделов. Если товаров много, Битрикс может обрабатывать их раньше, чем создаст дерево категорий.IBLOCK_SECTION_ID.Помните, что типовые интеграционные модули часто имеют избыточный код (до 30 000 строк), что затрудняет поиск ошибок. Регулярный мониторинг регистра Б_ПакетныйОбмен и сопоставление его данных с финальным import.xml — единственный надежный способ локализовать проблему между 1С и CMS.