Как происходит сопоставление разделов Битрикс и 1С по умолчанию
Когда к нам приходят с задачей настроить обмен каталогом между 1С УТ и Bitrix, первое, с чем сталкивается разработчик — это механизм сопоставления разделов. По умолчанию система использует жёсткую привязку через уникальные идентификаторы: GUID из 1С записывается в поле XML_ID инфоблока Bitrix. Этот механизм срабатывает на этапе импорта CommerceML-пакета, когда 1С передаёт не только товары, но и структуру групп. Если раздел с таким XML_ID уже существует в инфоблоке — Bitrix обновляет его название и вложенность. Если нет, создаёт новый. Именно здесь, в наших проектах с большим каталогом, часто всплывают неочевидные грабли: достаточно один раз изменить GUID в 1С (например, при переносе базы или перепривязке справочника), и на сайте появляется дубль раздела. Мы регулярно видим это у клиентов с активным импортом, когда отдел закупок пересоздаёт группы в УТ, а сайт «съедает» их как новые.
<Группы>
<Группа>
<Ид>d7a8f3c2-1e4b-4f6a-9c0d-5e7b8a1f2c3d</Ид>
<Наименование>Электроника</Наименование>
<Группы>
<Группа>
<Ид>a1b2c3d4-5e6f-7a8b-9c0d-1e2f3a4b5c6d</Ид>
<Наименование>Ноутбуки</Наименование>
<Группы>
<Группа>
<Ид>f1e2d3c4-b5a6-7f8e-9d0c-1b2a3c4d5e6f</Ид>
<Наименование>Игровые ноутбуки</Наименование>
</Группа>
</Группы>
</Группа>
</Группы>
</Группа>
</Группы>Когда Bitrix получает такой XML, он проходит по всем узлам <Группа> рекурсивно. Для каждой группы движок ищет в инфоблоке раздел с XML_ID, равным значению из тега <Ид>. Если находит, обновляет NAME и IBLOCK_SECTION_ID (родительский раздел), сохраняя вложенность. Если не находит, создаёт новый раздел, записывая переданный <Ид> в XML_ID. Ключевой момент: привязка идёт строго по XML_ID, а не по названию. Это значит, что переименование раздела в 1С не создаст дубля, обновится только название. Но если изменился GUID, всё, старый раздел остаётся сиротой, а новый создаётся заново. В наших проектах мы обязательно проверяем соответствие XML_ID после первичного импорта, чтобы исключить рассинхронизацию.
Грабли:Если в 1С изменился GUID раздела (например, при копировании группы или восстановлении из резервной копии с другой БД), Bitrix не найдёт совпадения по XML_ID и создаст новый раздел. На сайте появятся два одинаковых по названию, но разных по ID раздела. Чтобы этого избежать, перед импортом сверяйте GUID в CommerceML-пакете с существующими XML_ID в инфоблоке, либо через SQL-запрос, либо через ручной маппинг в обработчике OnBeforeIBlockSectionUpdate (полный список событий инфоблоков — в документации Bitrix). Рецепты типовых доработок импорта мы разобрали в статье «События 1С в Bitrix: как менять данные при импорте».
Обмен 1С УТ с Битрикс: настройка соответствия групп и разделов
Типичный сценарий: клиент с каталогом на 30 тысяч позиций просит «сделать, как в 1С». В бухгалтерии товары разложены по папкам — «Сантехника / Смесители», «Инструмент / Электроинструмент». На сайте же эти папки должны превратиться в разделы инфоблока с правильной вложенностью. Если не настроить соответствие, все товары свалятся в корень каталога или в случайные разделы — менеджерам придётся вручную перетаскивать тысячи позиций. У нас в практике эта настройка делается один раз на старте интеграции и больше не требует внимания, если структура в 1С стабильна. Комбинируется с настройкой свойств-аналогов и правил выгрузки цен.
- Настроить структуру групп товаров в 1С УТ, создать иерархию папок в справочнике «Номенклатура». Важно: каждая группа должна иметь уникальное наименование, желательно без спецсимволов. При импорте разделов в Битрикс может возникнуть ошибка превышения времени исполнения, если дерево разделов слишком большое. Рекомендуется ограничить вложенность до 3–4 уровней, так как при более глубокой иерархии возможны проблемы с производительностью.
- Указать соответствие каталогов в настройках обмена 1С с сайтом, в форме «Обмен с сайтом» на вкладке «Каталоги» привязать корневую группу из 1С к инфоблоку на сайте. Если групп несколько, каждую сопоставить с отдельным инфоблоком или разделом верхнего уровня.
- Создать инфоблок каталога в Битрикс и включить импорт из 1С, затем перейти в «Магазин» → «Настройки» → «Интеграция с 1С», где выбрать нужный тип инфоблока и установить флаг «При выгрузке учитывать тип инфоблока». После этого запустить тестовый обмен.
Проверить, что сопоставление прошло успешно, можно через данные в таблице b_iblock_section. У каждого раздела, созданного из 1С, в поле XML_ID хранится идентификатор, переданный из 1С (например, GUID группы). Если этот идентификатор совпадает с ID группы в справочнике «Номенклатура», связь установлена. Дополнительно смотрим поле IBLOCK_SECTION_ID, оно должно отражать родительскую вложенность. У нас в проектах мы делаем простой SQL-запрос для проверки: SELECT ID, NAME, XML_ID, IBLOCK_SECTION_ID FROM b_iblock_section WHERE IBLOCK_ID = N, где N — ID инфоблока. Если XML_ID пуст или не соответствует ожидаемому, это может указывать на проблемы при обмене: например, в выгрузке из 1С отсутствует или некорректно передаётся идентификатор группы, либо настройки экспорта в 1С настроены неверно (выгружается не та номенклатурная группа). В таких случаях стоит дополнительно проверить файл выгрузки и настройки модуля интеграции.
Соответствие групп 1С разделам Битрикс: возможные проблемы и их решение
Самый частый запрос на эту тему — «после импорта из 1С каталог размножился». В нашей практике с магазинами от 20 000 позиций это стандартная боль: разделы дублируются, вложенность ломается, а связь между группой в 1С и инфоблоком в Bitrix теряется после того, как в учётной системе меняют GUID категории. Проблема не в самом протоколе CommerceML — механизм сопоставления по GUID надёжен, пока идентификатор стабилен. Но в реальности GUID может смениться: при копировании каталога, восстановлении из бэкапа в новую базу, свёртке/переносе базы или пересоздании группы (переименование, вопреки частому мифу, GUID не меняет — меняет именно пересоздание). Когда это происходит, Bitrix видит «новую» группу, создаёт ещё один раздел, а старый раздел с товарами остаётся сиротой, без привязки к актуальной категории. Мы регулярно сталкиваемся с этим у клиентов, где обмен запущен годами и накопилось несколько поколений «дублей-призраков». Решение лежит на стыке администрирования Bitrix и доработки логики импорта, разберём три типовых сценария и их устранение.
| Проблема | Причина | Решение |
|---|---|---|
| Дубли разделов при каждом импорте | Смена GUID группы в 1С | Синхронизация через XML_ID, скрипт обновления GUID |
| Раздел ушёл в корень каталога | Потеря parent-связи при импорте | Обработчик OnBeforeIBlockSectionUpdate |
| Товары висят в старом разделе | Старый раздел не удалился при обновлении | Массовая перелинковка по внешнему коду |
Начнём с диагностики. Когда к нам приходят с жалобой на дубли, мы в первую очередь проверяем b_iblock_section.XML_ID, в этом поле Bitrix хранит GUID из 1С. Если у двух разделов одинаковый XML_ID, проблема в логике импорта (он не проверяет дублирующиеся идентификаторы). Если XML_ID различаются, а разделы по смыслу одни и те же, значит 1С сменила GUID. Исправляем через административную часть Bitrix: находим раздел-дубль, открываем его, копируем значение поля «Внешний код» (XML_ID) из старого раздела. Но на каталоге с сотнями категорий это ручная каторга. В наших проектах мы автоматизируем это скриптом: CIBlockSection::GetList по названию, сравниваем XML_ID, если не совпадает, перезаписываем. Вторая проблема, потеря вложенности. Импорт из 1С может «оторвать» дочерний раздел от родителя, если на момент загрузки родитель ещё не создан. Здесь нужен обработчик, который блокирует изменение IBLOCK_SECTION_ID на пустое значение, если у раздела уже был родитель. Третий кейс, товары, оставшиеся в старом разделе. После того как дубли распознаны и GUID синхронизированы, запускаем массовое копирование товаров через CIBlockElement::SetPropertyValues в актуальный раздел, а старый помечаем как неактивный.
// init.php — предотвращает обнуление parent-раздела при импорте из 1С
AddEventHandler('iblock', 'OnBeforeIBlockSectionUpdate', function (&$arFields) {
// Интересует только HTTP-обмен с 1С (/bitrix/admin/1c_exchange.php)
if (strpos($_SERVER['REQUEST_URI'] ?? '', '1c_exchange.php') === false) {
return;
}
// Пустой IBLOCK_SECTION_ID при живом родителе — сохраняем родителя
if (empty($arFields['IBLOCK_SECTION_ID']) && !empty($arFields['ID'])) {
$existing = CIBlockSection::GetByID($arFields['ID'])->Fetch();
if ($existing && (int)$existing['IBLOCK_SECTION_ID'] > 0) {
$arFields['IBLOCK_SECTION_ID'] = (int)$existing['IBLOCK_SECTION_ID'];
AddMessage2Log(
'Импорт 1С: предотвращён сброс parent для раздела ID=' . $arFields['ID'],
'iblock'
);
}
}
});CommerceML: структура данных для разделов каталога
CommerceML — это не просто набор тегов, а строгая древовидная структура. Внутри корневого тега <Группы> каждая группа описывается блоком <Группа>. Согласно стандарту CommerceML 2, классификатор содержит «структуру» каталога, а вложенность реализуется рекурсивно: внутри <Группа> может быть ещё один <Группы>, и так до любого уровня глубины. Именно этот XML-формат 1С УТ передаёт при выгрузке каталога, и именно его Bitrix парсит, чтобы построить дерево разделов инфоблока. В проектах с большим каталогом мы регулярно видим, как менеджеры в 1С перетаскивают папки, меняют их местами или добавляют подразделы — и всё это должно корректно отразиться на сайте после очередного импорта. Без понимания структуры <Группы> невозможно ни отладить сбой сопоставления, ни написать кастомный обработчик, который модифицирует дерево разделов до сохранения.
<?xml version="1.0" encoding="UTF-8"?>
<КоммерческаяИнформация xmlns="urn:1C.ru:commerceml_210" ВерсияСхемы="2.10"
ДатаФормирования="2026-07-10T12:00:00">
<Каталог СодержитТолькоИзменения="false">
<Ид>CATALOG_ROOT</Ид>
<Наименование>Каталог товаров</Наименование>
<Группы>
<Группа>
<Ид>GROUP_001</Ид>
<Наименование>Сантехника</Наименование>
<Группы>
<Группа>
<Ид>GROUP_001_01</Ид>
<Наименование>Смесители</Наименование>
<Группы>
<Группа>
<Ид>GROUP_001_01_01</Ид>
<Наименование>Для кухни</Наименование>
</Группа>
</Группы>
</Группа>
</Группы>
</Группа>
</Группы>
</Каталог>
</КоммерческаяИнформация>Когда Bitrix получает такой XML, он не просто «проходит по списку», он рекурсивно обходит дерево, начиная с корневого каталога. Для каждого элемента <Группа> система смотрит поле <Ид>, это внешний код раздела в инфоблоке. Если раздел с таким внешним кодом уже существует, Bitrix обновляет его название и родителя; если нет, создаёт новый. Именно <Ид> является ключом сопоставления: по нему движок понимает, что «Смесители» из 1С, это тот же самый раздел, что был создан при прошлом импорте, а не дубль. В наших проектах мы не раз сталкивались с ситуацией, когда из-за сбоя в выгрузке 1С присылала новый <Ид> для уже существующей группы, и в инфоблоке появлялся второй раздел с тем же названием. Поэтому при настройке обмена мы всегда проверяем, что в 1С настроена статическая нумерация групп, а не автоматическая генерация GUID при каждом экспорте.
Грабля: если в XML-файле у группы отсутствует тег <Ид>, Bitrix не может сопоставить её с существующим разделом. При каждом обмене такая группа будет создаваться заново, с новым ID в инфоблоке, но с тем же названием. В результате в админке появляются десятки дублей «Сантехника (1)», «Сантехника (2)» и так далее. Как обойти: убедитесь, что в настройках обмена 1С УТ включена передача идентификаторов групп, а в конфигурации CommerceML не стоит галочка «Не выгружать GUID». Если проблема уже возникла, удалите дублирующиеся разделы через SQL или API и исправьте настройки выгрузки в 1С.
Выгрузка групп товаров из 1С на сайт: пошаговая инструкция
Реальная история: каталог на 35 тысяч SKU, импорт каждые 20 минут. Менеджеры добавляют в 1С новую группу «Акция — Новый год», ждут её на сайте — а её нет. Или она есть, но без родительского раздела, или с дублирующимся XML_ID. Проблема почти всегда в одном: выгрузка групп не настроена как отдельный этап, а идёт «в довесок» к товарам. В нашей практике мы регулярно сталкиваемся с этим у клиентов с большим каталогом: 1С передаёт группы, Битрикс их создаёт, но без правильной последовательности шагов разделы либо не появляются, либо дублируются при каждом обмене. Полный цикл выглядит так: настройка модуля обмена в 1С УТ → указание реквизитов доступа к сайту → конфигурация выгрузки групп как отдельного типа данных → запуск синхронизации. Ниже, три шага, которые гарантированно приведут к тому, что структура разделов на сайте будет соответствовать дереву групп в 1С.
- Настроить выгрузку групп в 1С УТ: открыть раздел «Администрирование» → «Обмен с сайтом» → «Настройки выгрузки». В поле «Выгружать группы товаров» установить флаг. Указать корневую группу, с которой начинается дерево, если оставить пустым, выгрузится всё. Для каталогов от 20 000 позиций рекомендуем выгружать только изменённые группы: включить «Выгружать только изменённые за период» и задать интервал.
- Настроить реквизиты доступа в Битрикс: перейти в «Настройки» → «Инструменты» → «1С-Интеграция». Проверить, что включён флаг «Разрешить обмен с 1С». Указать логин и пароль, лучше создать отдельного пользователя с правами на редактирование инфоблоков. Скопировать ссылку для обмена, её нужно вставить в настройки интеграции в 1С УТ.
- Запустить обмен: в 1С УТ нажать «Выполнить обмен» вручную или настроить расписание через регламентные задания. Первый запуск, обязательно вручную, чтобы проверить, что группы создались без ошибок. После успешной синхронизации можно включать автоматический обмен по расписанию (обычно раз в час для каталогов до 50 000 товаров).
На стороне Битрикс после получения запроса от 1С происходит следующее. Сервер принимает checkauth, проверку авторизации, затем init, инициализацию сессии обмена. После этого 1С передаёт XML-файл с группами через file, и Битрикс запускает import, разбор CommerceML. Для каждой группы при добавлении раздела вызывается событие OnAfterIBlockSectionAdd (после записи в БД). Данные пишутся в таблицу b_iblock_section, при этом поле XML_ID используется как внешний идентификатор для сопоставления с данными из 1С: именно по нему система определяет, создавать новый раздел или обновлять существующий. Важный момент, который мы выявили в проектах с активным импортом: при большом количестве разделов производительность запросов к таблице b_iblock_section может снижаться. Для ускорения поиска по XML_ID рекомендуется создавать соответствующий индекс в базе данных, однако точное влияние его отсутствия на скорость выполнения запросов зависит от объёма данных, настроек СУБД и конкретной реализации обмена. Систему замера скорости обмена по событиям и пять типовых причин тормозов мы разбирали в статье «Тормозит обмен 1С с Битрикс».
// Пример логирования создания разделов при импорте из 1С
// Разместить в init.php или в кастомном модуле
AddEventHandler('iblock', 'OnAfterIBlockSectionAdd', 'logSectionImportFrom1C');
function logSectionImportFrom1C(&$arFields)
{
// Интересует только обмен с 1С, а не ручное создание в админке
if (strpos($_SERVER['REQUEST_URI'] ?? '', '1c_exchange.php') === false) {
return;
}
CEventLog::Add([
'SEVERITY' => 'INFO',
'AUDIT_TYPE_ID' => 'SECTION_IMPORT_1C',
'MODULE_ID' => 'iblock',
'DESCRIPTION' => json_encode([
'xml_id' => $arFields['XML_ID'] ?? '',
'name' => $arFields['NAME'] ?? '',
'iblock_id' => $arFields['IBLOCK_ID'] ?? 0,
'parent_id' => $arFields['IBLOCK_SECTION_ID'] ?? 0,
], JSON_UNESCAPED_UNICODE),
]);
}Частые вопросы
Можно ли сопоставить одну группу 1С с несколькими разделами Битрикс, или это всегда связь 1:1?
Штатный обмен через CommerceML поддерживает только связь 1:1 по внешнему коду (XML_ID). Для связи «одна группа — несколько разделов» потребуется доработка модуля обмена или ручное дублирование товаров в разные разделы.
Что делать, если после обмена разделы в Битрикс создались с одинаковыми названиями, но разными символьными кодами?
Проверьте, не дублируются ли XML_ID у групп в 1С. Если коды уникальны, а названия совпадают — это нормально для CommerceML. Чтобы избежать путаницы, настройте в 1С генерацию уникальных наименований групп (например, с префиксом категории).
Чем отличается сопоставление через внешний код (XML_ID) от сопоставления по GUID в 1С?
Внешний код (XML_ID) — это строковый идентификатор, который Битрикс использует для привязки разделов. GUID — внутренний уникальный идентификатор записи в 1С. При штатном обмене 1С передает GUID, а Битрикс записывает его в поле XML_ID и использует для сопоставления элементов (разделов, товаров). GUID является основным идентификатором для сопоставления, а не служебным полем, не участвующим в сопоставлении.
А если у меня каталог на 20 000 SKU и обмен зависает на этапе выгрузки групп — как ускорить процесс?
Включите в настройках модуля обмена Битрикс опцию «Выгружать только изменения» и отключите полную выгрузку дерева групп. Также проверьте, не превышен ли лимит памяти PHP (memory_limit) — для больших каталогов рекомендуется не менее 256 МБ.
Можно ли при обмене автоматически создавать разделы в Битрикс на основе свойств групп из 1С, например, по полю «Тип номенклатуры»?
Нет, штатный обмен создает разделы только на основе иерархии групп 1С. Для создания разделов по произвольным свойствам (например, «Тип номенклатуры») потребуется написать собственный обработчик события OnBeforeIBlockSectionAdd или использовать сторонние модули.
Что делать, если раздел в Битрикс уже существует, но при обмене создается его дубль с суффиксом «1»?
Проверьте, совпадает ли XML_ID у существующего раздела с XML_ID группы из 1С. Если не совпадает — Битрикс считает это новой группой. Исправьте XML_ID вручную в настройках раздела или перепривяжите товары через служебный скрипт, например, используя метод CIBlockSection::Update.