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