1С Битрикс · 8 мин чтения

Выгрузка номенклатуры из Битрикса обратно в 1С: как настроить и не потерять данные

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

Зачем нужна обратная выгрузка номенклатуры из Битрикс в 1С

Чаще всего задача всплывает в трёх ситуациях. Первая - маркетолог или контент-менеджер заводит новые товары прямо в админке сайта, потому что там удобнее работать с фото, описаниями и SEO-полями, а в 1С их потом нужно завести для склада и бухгалтерии. Вторая - розница без кассы на 1С: заказы принимают через сайт, а товароучёт ведут в отдельной базе, куда позиции нужно подтягивать регулярно. Третья - миграция или объединение каталогов, когда часть номенклатуры годами жила только на сайте, и перед запуском полноценного обмена её нужно один раз перенести в 1С, чтобы дальше синхронизация шла уже штатно.

В моей практике был случай с интернет-магазином на 40 с лишним тысяч SKU: три года каталог вели силами двух контент-менеджеров прямо в Битриксе, 1С использовали только для бухгалтерии и не связывали с сайтом вообще. Когда бизнес решил подключить склад и остатки, выяснилось, что половины позиций в 1С физически нет - их пришлось выгружать обратно, причём с сохранением привязок к торговым предложениям и характеристикам.

Как устроен обмен CommerceML между Битрикс и 1С

Стандартный механизм в 1С-Битрикс основан на CommerceML 2.x - открытом формате обмена коммерческой информацией, который используют и 1С, и большинство других учётных систем. Модуль обмена работает через обработчик /bitrix/admin/1c_exchange.php, к которому 1С обращается по HTTP с логином и паролем, указанными в настройках магазина. За один сеанс обмена летают два основных файла: import.xml с товарами, разделами и свойствами, и offers.xml с торговыми предложениями, ценами и остатками.

По умолчанию модуль настроен на однонаправленный обмен - 1С выгружает каталог, сайт его принимает. Чтобы получить обратную выгрузку номенклатуры из Битрикс в 1С, нужно на стороне 1С включить приём каталога от сайта: в конфигураторе обмена есть отдельный флаг “Выгружать номенклатуру с сайта в информационную базу”, без него любые изменения, сделанные в Битриксе, при следующем сеансе обмена просто перезатрутся данными из 1С.

Что реально уезжает обратно, а что нет

Из коробки в обратную сторону синхронизируются новые элементы каталога, разделы, значения свойств и торговые предложения - то, что попадает под привязанные ИБ-соответствия (справочники единиц измерения, типов цен, характеристик). Остатки и цены обратно, как правило, не выгружают - они считаются мастер-данными 1С, и если пустить их в обе стороны, при следующем сеансе обмена начнётся путаница: сайт скажет “было 12 штук”, 1С скажет “было 30”, и кто прав - решать вручную. Зоны ответственности я всегда советую разграничивать жёстко: контент и новая номенклатура - с сайта в 1С, остатки и цены - только из 1С на сайт.

Настройка обратной выгрузки через стандартный модуль

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

  1. В 1С в настройках плана обмена с сайтом включить опцию приёма номенклатуры от партнёра (в УТ 11 это узел “Публикация” → “Настройки CommerceML” → “Принимать элементы номенклатуры с сайта”).
  2. В Битриксе зайти в Магазин → Настройки → Обмен с 1С и проверить логин/пароль для авторизации 1С на обработчике обмена - без них 1С получит 401 и не сможет забрать данные.
  3. Сверить соответствия справочников: единицы измерения, типы цен, торговые предложения. Если справочники не смэтчены, новые товары уйдут в 1С без единиц измерения или с дублирующимся справочником.
  4. Запустить обмен вручную из 1С (кнопка “Обмен с сайтом” в разделе продаж) и проверить протокол обмена - он лежит в /bitrix/tmp/1c_exchange/ в виде текстовых логов с таймстампами по каждому шагу.
  5. Проверить в 1С, что новые элементы попали в нужную группу номенклатуры, а не в корень справочника - это частая недоработка правил обмена по умолчанию.

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

Бесплатный материал

🎁 Полезный скрипт в подарок

Подпишитесь на Telegram - пришлю готовый скрипт по этой теме.

Без спама. Отписка в 1 клик.

Кастомный скрипт выгрузки, когда стандартного обмена мало

Штатный CommerceML-обмен хорошо работает, пока каталог укладывается в стандартную структуру Битрикса и объём не выходит за несколько тысяч позиций за сеанс. На практике я сталкивался с ограничениями стандартного обмена в трёх сценариях: несколько сайтов на одной инсталляции Битрикса выгружают номенклатуру в одну базу 1С и нужно фильтровать, откуда что берётся; объём каталога за 30-40 тысяч SKU укладывал файловый обмен по таймауту на хостинге; либо на стороне 1С стоит не классическая конфигурация, а 1С:Fresh или облачная версия без прямого доступа к файловой системе для CommerceML-обработчика.

В таких случаях я перехожу с файлового обмена на HTTP-сервисы 1С (OData или кастомный REST-интерфейс) и пишу отдельный скрипт на Python, который забирает данные из Битрикса через инфоблочное API и пушит их в 1С точечными запросами, а не одним XML-пакетом на десятки мегабайт:

import requests

BITRIX_EXPORT_URL = "https://shop.example.ru/api/export_nomenclature.php"
ODATA_URL = "https://1c.example.ru/erp/odata/standard.odata/Catalog_Номенклатура"

items = requests.get(BITRIX_EXPORT_URL, auth=("exchange", "***")).json()

for item in items:
    payload = {
        "Description": item["name"],
        "Артикул": item["sku"],
        "Ссылка_Key": item["xml_id"],
    }
    resp = requests.post(ODATA_URL, json=payload, auth=("odata_user", "***"))
    if resp.status_code >= 400:
        print(f"Ошибка выгрузки {item['sku']}: {resp.status_code}")

Такой подход даёт три вещи, которых нет у стандартного обмена: постатейный лог ошибок (видно, на каком конкретно товаре обмен упал, а не “ошибка в XML на строке 4021”), фильтрацию выгрузки по разделу или бренду и защиту базы 1С от блокировки на время обмена - HTTP-сервис обрабатывает запросы поштучно, а не держит транзакцию на весь пакет. В библиотеке держу готовые скрипты для интеграции сайтов с 1С, часть логики оттуда обычно беру за основу и адаптирую под конкретную конфигурацию клиента.

Разработка такого скрипта с нуля под задачу - от 20 000 ₽, если его нужно встроить в более сложную цепочку (синхронизация с несколькими складами или маркетплейсами) - сумма растёт от объёма правил.

Типичные проблемы при обратной выгрузке номенклатуры

Проблема Причина Решение
Товары задваиваются в 1С Не совпадает xml_id между базами, обмен ищет элемент по наименованию Настроить сопоставление по внешнему коду при первом обмене, не полагаться на совпадение названий
Торговые предложения не привязываются к родительскому товару В Битриксе offers оторваны от элемента каталога (разные инфоблоки без связи) Проверить свойство CML2_LINK на офферах перед выгрузкой
Единицы измерения слетают на “штуки” по умолчанию Справочник единиц измерения в 1С и Битриксе не смэтчен по коду ОКЕИ Свести справочники вручную один раз при настройке правил
Обмен зависает или обрывается по таймауту Файловый обмен тянет каталог целиком, хостинг режет долгие запросы Разбить выгрузку на пакеты или перейти на HTTP-сервисы 1С
Фото и файлы не долетают до 1С Стандартный CommerceML не всегда выгружает медиафайлы обратно, только ссылки Синхронизировать медиатеку отдельным скриптом для карточек, заведённых на сайте

Автоматизация и мониторинг обмена номенклатурой

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

Для мониторинга обычно ставлю сценарий в n8n: он раз в 15-20 минут дёргает лог обмена или таблицу статусов в 1С через тот же OData-интерфейс и, если находит ошибку или пропущенный сеанс, пишет в Telegram-канал ответственному менеджеру. Настройка такого сценария - от 25 000 ₽, обычно укладываюсь в 2-3 дня вместе с тестированием на реальных данных клиента.

Интернет-магазин под ключ

Интернет-магазин

от 80 000 ₽

Подробнее →

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

Можно ли настроить обратную выгрузку номенклатуры без программиста?

Если каталог типовой и обмен уже работает в одну сторону (1С → Битрикс), включить обратное направление часто может штатный интегратор 1С через настройки плана обмена - без написания кода. Но как только появляются нестандартные инфоблоки, несколько типов цен или объединение нескольких сайтов, без разработчика обычно не обойтись - правила соответствия справочников приходится прописывать вручную и тестировать на реальных данных.

Сколько времени занимает выгрузка номенклатуры из Битрикс в 1С?

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

Что делать, если товары после обмена задвоились в 1С?

Сначала проверить, по какому полю 1С ищет соответствие элемента - по умолчанию это внешний код (xml_id), и если он был потерян при переносе базы или ручном заведении товара на сайте, 1С создаёт новый элемент вместо обновления существующего. Задвоенные позиции придётся смерджить вручную через обработку дублей в 1С, а на будущее - жёстко закрепить генерацию xml_id на стороне Битрикса и не давать редактировать его руками.

Работает ли обратная выгрузка с 1С:Fresh или облачной версией 1С?

Файловый CommerceML-обмен с облачными версиями 1С работает ограниченно, потому что классический обработчик рассчитан на прямой доступ к файловой системе базы. Для 1С:Fresh и похожих облачных решений практичнее HTTP-сервисы (OData) или отдельный скрипт-мост, который забирает данные из Битрикса и кладёт их в 1С через API, а не через файловый обмен.

Есть задача?

Обсудим в мессенджере

Расскажите, что нужно сделать — отвечу в течение 4 часов в рабочее время. Первая консультация бесплатно.

Самозанятый Калинкин Н. А. · работаю с физлицами и юрлицами

Продолжая пользование настоящим сайтом Вы выражаете своё согласие на обработку Ваших персональных данных (файлов куки) с использованием Yandex.Metrika.
Понятно