При автоматизации розничной и оптовой торговли регулярно возникает задача синхронизации 1С с интернет-магазинами (на базе OpenCart, WooCommerce, 1С-Битрикс и других CMS). Требуется передавать на сайт номенклатуру, иерархию категорий, описания, цены и остатки, а обратно в учетную систему загружать оформленные заказы покупателей. Разберем основные подходы к организации обмена, сопоставим их плюсы и технические риски, а также определим наиболее надежные архитектурные решения.
Наиболее надежным и масштабируемым подходом является взаимодействие через интерфейсы прикладного программирования (API). В этом сценарии сайт предоставляет готовые конечные точки (endpoints) для управления товарами и заказами, а 1С обращается к ним с помощью встроенных сетевых объектов.
Рассмотрим, почему работа через API является предпочтительной:
Проанализируем пример отправки данных по товару из 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С, и документ создается в базе в режиме реального времени без задержек.
В типовых конфигурациях 1С (Управление торговлей, ERP, Комплексная автоматизация, Управление нашей фирмой) предусмотрена готовая подсистема интеграции с сайтом, работающая по отраслевому стандарту CommerceML 2.x.
Разберем по шагам, как устроен этот механизм:
import.xml (структура каталога, группы, свойства, описания) и offers.xml (предложения, складские остатки, типы цен).Этот метод удобен тем, что для большинства популярных CMS (OpenCart, WooCommerce, 1С-Битрикс) существуют готовые официальные или сторонние модули, поддерживающие CommerceML из коробки. Разработка с нуля в 1С при этом не требуется — достаточно настроить регламентное задание и отбор выгружаемых каталогов.
Часто у разработчиков возникает соблазн подключиться из 1С напрямую к MySQL через внешние компоненты или ADODB и выполнять прямые SQL-запросы (INSERT, UPDATE). Рассмотрим, почему к такому подходу следует относиться с осторожностью.
Выясним основные проблемы прямой записи в таблицы СУБД:
ADODB.Connection ограничивает сервер 1С только операционной системой Windows. Если сервер 1С работает на Linux, такое решение работать не будет.Если прямой доступ к MySQL все же неизбежен, рекомендуется использовать буферные (staging) таблицы. В этом случае 1С записывает данные во временную плоскую таблицу, а внутренний фоновый скрипт CMS (по расписанию Cron) считывает новые записи и применяет их штатными методами движка.
Независимо от выбранного протокола передачи (REST API, CommerceML или файлы), критически важно выгружать не весь каталог целиком, а только измененные позиции.
Разберем, как правильно организовать регистрацию изменений в 1С:
ПланОбмена, в состав которого включаем справочники номенклатуры, цен, а также регистры сведений с остатками.ПланыОбмена.ВыбратьИзменения(), формируем пакет данных и после подтверждения успешной отправки удаляем регистрацию через ПланыОбмена.УдалитьРегистрациюИзменений().Посмотрим на пример выборки изменений по узлу плана обмена:
ВыборкаИзменений = ПланыОбмена.ВыбратьИзменения(УзелОбмена, НомерСообщения);
Пока ВыборкаИзменений.Следующий() Цикл
ДанныеОбъекта = ВыборкаИзменений.Получить();
Если ТипЗнч(ДанныеОбъекта) = Тип("СправочникСсылка.Номенклатура") Тогда
// Обработка и подготовка данных товара к передаче
ОбработатьТоварДляВыгрузки(ДанныеОбъекта);
КонецЕсли;
КонецЦикла;
Также важно соблюдать порционность (чанкинг). Отправка десятков тысяч позиций одним пакетом приводит к превышению лимитов времени выполнения (max_execution_time) и объема памяти на стороне веб-сервера. Оптимальный размер одного пакета составляет от 50 до 500 товаров в зависимости от объема дополнительных атрибутов и картинок.