Какие существуют методы и архитектурные варианты обмена данными между 1С и сайтом?

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

При автоматизации розничной и оптовой торговли регулярно возникает задача синхронизации 1С с интернет-магазинами (на базе OpenCart, WooCommerce, 1С-Битрикс и других CMS). Требуется передавать на сайт номенклатуру, иерархию категорий, описания, цены и остатки, а обратно в учетную систему загружать оформленные заказы покупателей. Разберем основные подходы к организации обмена, сопоставим их плюсы и технические риски, а также определим наиболее надежные архитектурные решения.

1. Использование REST API веб-сайта и HTTP-сервисов 1С

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

Рассмотрим, почему работа через API является предпочтительной:

  1. Сохранение целостности данных: Все операции проходят через ядро CMS, что гарантирует автоматическую генерацию служебных данных (SEO-URL, индексы поиска, мультиязычные поля).
  2. Корректный сброс кэша: Движок сайта при получении запроса через API автоматически инвалидирует кэш (файловый, Redis или Memcached), благодаря чему изменения цен и остатков мгновенно отображаются для пользователей витрины.
  3. Безопасность: Не требуется открывать прямой доступ к порту СУБД (например, 3306 для MySQL) во внешнюю сеть — обмен происходит по защищенному протоколу HTTPS.

Проанализируем пример отправки данных по товару из 1С на сайт с помощью объектов платформы HTTPСоединение, HTTPЗапрос и ЗаписьJSON:


ПараметрыJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет);
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку(ПараметрыJSON);

СтруктураДанных = Новый Структура;
СтруктураДанных.Вставить("sku", "ART-00129");
СтруктураДанных.Вставить("name", "Офисное кресло Комфорт");
СтруктураДанных.Вставить("price", 12500);
СтруктураДанных.Вставить("stock_quantity", 14);

ЗаписатьJSON(ЗаписьJSON, СтруктураДанных);
ТелоЗапроса = ЗаписьJSON.Закрыть();

ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL;
Соединение = Новый HTTPСоединение("shop-example.ru", 443, , , , 30, ЗащищенноеСоединение);

Запрос = Новый HTTPЗапрос("/api/v1/products");
Запрос.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
Запрос.Заголовки.Вставить("Authorization", "Bearer " + ТокенАвторизации);
Запрос.УстановитьТелоИзСтроки(ТелоЗапроса, КодировкаТекста.UTF8);

Ответ = Соединение.ОтправитьДляОбработки(Запрос);
Если Ответ.КодСостояния = 200 Или Ответ.КодСостояния = 201 Тогда
    // Данные успешно обновлены
Иначе
    ВызватьИсключение "Ошибка обновления товара на сайте: " + Ответ.ПолучитьТелоКакСтроку();
КонецЕсли;

Для обратной связи, когда интернет-магазину необходимо оперативно уведомить 1С о новом заказе, в конфигурации 1С можно опубликовать собственный HTTP-сервис на веб-сервере (Apache или IIS). При поступлении заказа сайт отправляет вебхук (Webhook) в сторону 1С, и документ создается в базе в режиме реального времени без задержек.

2. Стандартный протокол CommerceML (CML) и обмен через файлы

В типовых конфигурациях 1С (Управление торговлей, ERP, Комплексная автоматизация, Управление нашей фирмой) предусмотрена готовая подсистема интеграции с сайтом, работающая по отраслевому стандарту CommerceML 2.x.

Разберем по шагам, как устроен этот механизм:

  1. 1С формирует XML-пакеты: import.xml (структура каталога, группы, свойства, описания) и offers.xml (предложения, складские остатки, типы цен).
  2. Файлы выгружаются либо в локальный/сетевой каталог, либо передаются на сторону сайта по протоколу HTTP POST в рамках стандартной сессии обмена.
  3. Скрипт-обработчик на стороне CMS распаковывает файлы и выполняет пошаговую пакетную загрузку в базу данных сайта.

Этот метод удобен тем, что для большинства популярных CMS (OpenCart, WooCommerce, 1С-Битрикс) существуют готовые официальные или сторонние модули, поддерживающие CommerceML из коробки. Разработка с нуля в 1С при этом не требуется — достаточно настроить регламентное задание и отбор выгружаемых каталогов.

3. Прямая запись в базу данных сайта (MySQL): риски и специфика

Часто у разработчиков возникает соблазн подключиться из 1С напрямую к MySQL через внешние компоненты или ADODB и выполнять прямые SQL-запросы (INSERT, UPDATE). Рассмотрим, почему к такому подходу следует относиться с осторожностью.

Выясним основные проблемы прямой записи в таблицы СУБД:

  1. Обход триггеров и хуков CMS: В интернет-магазине данные одного товара распределены по множеству таблиц (информация о товаре, описания для разных языков, привязка к категориям, опции, специальные цены). Прямая запись требует детального повторения логики CMS в коде 1С, и малейшая ошибка приводит к нарушению целостности связей.
  2. Блокировки таблиц: При массовом обновлении строк напрямую в базе MySQL могут возникать взаимные блокировки (deadlocks) и замедление работы витрины для реальных покупателей.
  3. Безопасность и сетевые ограничения: Большинство хостинг-провайдеров по умолчанию закрывают порт 3306 для внешних подключений. Для подключения приходится поднимать SSH-туннель или добавлять белый список IP-адресов.
  4. Кроссплатформенность: Использование COM-объекта ADODB.Connection ограничивает сервер 1С только операционной системой Windows. Если сервер 1С работает на Linux, такое решение работать не будет.
  5. Обновления движка: При любом обновлении CMS или ее плагинов структура таблиц в MySQL может измениться, что полностью выведет из строя код обмена в 1С.

Если прямой доступ к MySQL все же неизбежен, рекомендуется использовать буферные (staging) таблицы. В этом случае 1С записывает данные во временную плоскую таблицу, а внутренний фоновый скрипт CMS (по расписанию Cron) считывает новые записи и применяет их штатными методами движка.

4. Фиксация изменений с помощью планов обмена и пакетирование

Независимо от выбранного протокола передачи (REST API, CommerceML или файлы), критически важно выгружать не весь каталог целиком, а только измененные позиции.

Разберем, как правильно организовать регистрацию изменений в 1С:

  1. Создаем объект метаданных ПланОбмена, в состав которого включаем справочники номенклатуры, цен, а также регистры сведений с остатками.
  2. При изменении карточки товара, переоценке или проведении складского документа платформа автоматически регистрирует изменения по узлу сайта.
  3. Во время сеанса выгрузки считываем только зарегистрированные элементы с помощью метода ПланыОбмена.ВыбратьИзменения(), формируем пакет данных и после подтверждения успешной отправки удаляем регистрацию через ПланыОбмена.УдалитьРегистрациюИзменений().

Посмотрим на пример выборки изменений по узлу плана обмена:


ВыборкаИзменений = ПланыОбмена.ВыбратьИзменения(УзелОбмена, НомерСообщения);
Пока ВыборкаИзменений.Следующий() Цикл
    ДанныеОбъекта = ВыборкаИзменений.Получить();
    Если ТипЗнч(ДанныеОбъекта) = Тип("СправочникСсылка.Номенклатура") Тогда
        // Обработка и подготовка данных товара к передаче
        ОбработатьТоварДляВыгрузки(ДанныеОбъекта);
    КонецЕсли;
КонецЦикла;

Также важно соблюдать порционность (чанкинг). Отправка десятков тысяч позиций одним пакетом приводит к превышению лимитов времени выполнения (max_execution_time) и объема памяти на стороне веб-сервера. Оптимальный размер одного пакета составляет от 50 до 500 товаров в зависимости от объема дополнительных атрибутов и картинок.

← На главную