Как синхронизировать 1С с Bitrix, если на сайте и в базе уже есть товары?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Синхронизация 1С с интернет-магазином на базе Bitrix — это стандартная задача, однако она превращается в серьезный технический вызов, если товары уже созданы и на стороне сайта, и на стороне 1С. Основная сложность заключается в том, что по умолчанию системы не знают о существовании друг друга и могут создать дубли. Кроме того, при первой же полной выгрузке велик риск перегрузить сервер или затереть качественный контент на сайте (фото, SEO-описания) данными из учетной системы.

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

Понимание механизма связи: XML_ID или Внешний код

Прежде всего, проанализируем, как Bitrix сопоставляет товары. Главным идентификатором является поле XML_ID (в административной панели Bitrix оно называется «Внешний код»). Если товар выгружается из 1С впервые, система генерирует для него XML_ID на основе уникального идентификатора GUID из 1С. Если же товар уже был создан на сайте вручную, его XML_ID либо пуст, либо содержит случайный набор символов.

Рассмотрим ситуацию: если мы просто запустим выгрузку, Bitrix не найдет совпадений по XML_ID и создаст еще одну карточку товара, даже если названия и артикулы полностью идентичны. Поэтому наша первоочередная задача — сопоставить эти идентификаторы.

Способ 1. Использование встроенного мастера загрузки данных с сайта

В современных официальных модулях обмена от «Битрикс» (начиная с версии 6.х) предусмотрен специальный инструмент «Загрузка данных с сайта». Разберем этот процесс по шагам:

  1. Откроем модуль обмена в 1С и выберем пункт меню «Загрузка данных с сайта».
  2. Программа предложит скачать структуру разделов и товаров. На этом этапе 1С получит текущие XML_ID всех позиций с сайта.
  3. Используем мастер сопоставления. Программа проанализирует справочник Номенклатура и предложит сопоставить найденные на сайте товары с существующими в 1С по артикулу или наименованию.
  4. После подтверждения сопоставления, 1С запишет идентификаторы сайта в свои регистры сведений (или наоборот, проставит GUID 1С в поле XML_ID товаров на сайте).

Этот метод является наиболее безопасным для новичков, так как позволяет визуально проконтролировать связь каждой позиции.

Способ 2. Автоматическое сопоставление по реквизитам (Артикулу)

Если товаров тысячи, ручное сопоставление невозможно. В настройках модуля обмена на стороне 1С можно настроить правила идентификации. Посмотрим, как это работает:

В настройках интеграции, на вкладке «Параметры товаров», можно указать, по каким полям искать соответствие, если XML_ID не совпал. Мы можем выбрать поиск по Артикулу или Наименованию. Проанализируем логику: при получении файла импорта Bitrix сначала ищет товар по XML_ID. Если поиск не дал результата, он проверяет наличие товара с таким же артикулом. Если товар найден, Bitrix автоматически обновляет его XML_ID значением из файла 1С. Все последующие обмены будут проходить уже по стандартному идентификатору.

Способ 3. Прямая простановка XML_ID через API или SQL

Для продвинутых пользователей и программистов рассмотрим вариант массового обновления через скрипт на стороне Bitrix. Если у вас есть четкое соответствие (например, артикулы в 1С и на сайте гарантированно совпадают), можно запустить скрипт, который обновит поле EXTERNAL_ID (техническое имя XML_ID) в таблице b_iblock_element.

Пример логики скрипта на PHP для Bitrix:


CModule::IncludeModule("iblock");
$res = CIBlockElement::GetList([], ["IBLOCK_ID" => 10], false, false, ["ID", "PROPERTY_ARTNUMBER"]);
while($ob = $res->GetNextElement()) {
    $arFields = $ob->GetFields();
    // Здесь мы должны знать, какой GUID соответствует этому артикулу в 1С
    $xmlIdFrom1C = GetGuidByArtikulFromExternalSource($arFields["PROPERTY_ARTNUMBER_VALUE"]); 
    $el = new CIBlockElement;
    $el->Update($arFields["ID"], ["XML_ID" => $xmlIdFrom1C]);
}

Как не «положить» сайт при первой выгрузке

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

  1. Размер пакета данных. В настройках обмена в 1С установим ограничение размера передаваемого файла (например, 500 Кб). Это заставит систему передавать данные порциями, и импорт на сайте будет происходить итерационно, не вызывая критической нагрузки на процессор.
  2. Использование планов обмена. Выясним, как работает регистрация изменений. Вместо «Полной выгрузки» следует использовать режим «Выгружать только измененные объекты». Для этого в 1С должен быть корректно настроен узел плана обмена. Если нам нужно выгрузить всё в первый раз, но аккуратно, можно программно зарегистрировать изменения для всех товаров в узле плана обмена ПланыОбмена.ОбменС Сайтом, но саму выгрузку запустить как «изменения».
  3. Проверка хеш-суммы. Включим в настройках модуля опцию проверки неизменности данных. 1С будет вычислять хеш-сумму товара, и если она не изменилась с момента последней передачи, Bitrix просто пропустит этот элемент, не нагружая базу данных лишними операциями записи.

Защита контента на сайте от перезатирания

Часто на сайте работают SEO-специалисты: они пишут красивые тексты и оптимизируют изображения, которых нет в 1С. Чтобы 1С не превратила сайт в «пустыню» с короткими техническими названиями, настроим параметры компонента bitrix:catalog.import.1c на стороне сайта:

Использование редактора регистрации изменений

Для тонкой настройки первой выгрузки полезно использовать обработку «Регистрация изменений на узлах обмена». Рассмотрим сценарий: нам нужно выгрузить только остатки для уже существующих товаров. Мы можем:

  1. Очистить все регистрации на узле обмена с сайтом.
  2. Выбрать только те товары, которые уже сопоставлены.
  3. Зарегистрировать для них изменения только по регистру ЦеныНоменклатуры и Запасы.
  4. Запустить обмен.

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

← На главную