Интеграция с интернет-магазинами — задача классическая:
- Необходимо обеспечить загрузку данных о номенклатуре, ценах, складских остатках и резервах из 1С в интернет-магазин;
- обеспечить загрузку заказов из интернет-магазина в 1С. А также, доставлять информацию об изменении статусов заказа 1С в интернет-магазин.
Как известно, 1С (ERP, КА2, УТ11) имеет встроенную типовую интеграцию с интернет сайтами, совместимость которой подтверждена несколькими популярными CMS: «1С-Битрикс», «Юмисофт», «Хостмейк» и другими.
У данных типовых обменов есть ряд ограничений:
- формат и логика обмена жестко задана протоколом и форматом
CommerceML 2 - обмен происходит по расписанию, а не по событию
Последнее ограничение не соответствует современным требованиям, однако так уж реализован типовой обмен.
Кстати, разработчики 1С:Битрикс об этом написали на Хабре, немного неуклюже оправдываясь за этот выбор «сложностью настройки для массового использования» (см. Как мы разрабатывали интеграцию интернет-магазина с 1С: Предприятие и почему она стала массовой)
Поскольку у клиента CMS сайта не был в списке совместимых, мы реализовали собственное интеграционное решение полностью построенное на REST-сервисах как со стороны 1С, так и со стороны сайтов заказчика (их было несколько).
При выполнении доработок мы традиционно используем механизм расширений, в первую очередь для более простой установки обновлений фирмы 1С. Однако, вследствие особенностей текущих релизов ERP, дополнительные справочники и регистры по прежнему имеет смысл включать в основную конфигурацию. Так как все новые объекты метаданных относительно автономны и объединены в отдельную подсистему, проблем с обновлением мы не получили и не ожидаем в будущем.
Теперь по порядку.
Загрузка цен на сайты
Предполагалось, что товары в 1С и на сайтах уже существуют и связаны уникальным артикулом. А собственно отправка данных на сайт содержит минимум данных:
- Артикул товара
- Цену товара
- Статус наличия
и осуществляется следующим простым POST к HTTP-сервису сайта:
«price=#.##&availability=status», по адресу, равному: адрес сайта + артикул товара + ключ
Также, необходимо было предусмотреть цивилизованный журнал с логами.
Вроде бы достаточно просто, но как только начнем продумывать детали, начнет расти функционал.
Во-первых, необходимо хранить настройки отбора номенклатуры, сайта обмена и его настроек. Это отдельный справочник.
Во-вторых, нужно обработать ошибки обмена. То есть когда не работает 1С, сайт или сервис — отправить данные позднее. Или сервис выдал ошибку (нет карточки товара, к примеру, или вообще HTTP 5хх-е коды)
В-третьих, если передается большой объем данных (переоценка всего прайс-листа или массовое изменение остатков), желательно передавать порциями и ассинхронно.
Вот и появилась следующая объектная модель:
- Справочник «Настройки обмена с сайтом». Содержит отбор номенклатуры, вид цены номенклатуры, адрес сайта, данные для авторизации.
- Регистр «Цена и наличие товаров на сайте». Служебная таблица. Содержит актуальное состояние товаров, цен и наличия для быстрой подготовки отправки данных на сайт. Обновляется по мере изменения данных в системе. К примеру, не всякое изменение остатков приведет к изменению состояния товара. Поэтому нет необходимости отправлять данные на сайт.
- Регистр «Очередь данных на сайт». Содержит подготовленные запросы на сайт. Используется, если нет возможности отправить данные на сайт или при отправке запроса не было получено правильного ответа (200-е коды HTTP ответа).
- Регистр «Журнал взаимодействия с сайтом». Таблица логов, куда записываются все запросы и все ответы с сайта.
Пример. В результате проведения "Заказа клиента" изменились данные на 50 товаров. Отправили 50 запросов, получили 45 ответов "успех" и 5 с ошибками (на сайте не были заведены карточки товаров). 5 ошибок записали в регистр "Очередь". 50 записей добавили в "Журнал взаимодействия".
Администратор сайта увидел эти ошибки, разобрался (Журналу взаимодействия) с причиной, завел карточки.
Позднее, например, через час, отдельным заданием, по данным регистра "Очередь" будет произведена попытка отправки на сайт этих 5 записей. На этот раз все было успешно. Записи из регистра "Очередь" были удалены. В "Журнал взаимодействия" попали еще 5 записей.
Загрузка заказов с сайта
Общая схема следующая. Web-сайт вызывает специально разработанный REST-сервис 1С (с базовой авторизацией), вызывает методы POST для новых заказов и PATCH для существующих и передает в него текст json с информацией заказа клиента.
В 1С происходит поиск переданного заказа. Если заказ найден, то заказ обновляется, если уже передавался ранее – обновляется. Заказ не будет обновлен, если уже создан документ Реализации или загружался достаточно давно (глубина указывается в настройке).
Вот пример формата, если интересно.
{
"number": "rz-20180910-7****",
"orderType": "eshop-individual",
"orderMethod": "shopping-cart",
"countryIso": "RU",
"createdAt": "2018-09-10 10:47:40",
"statusUpdatedAt": "2018-09-10 10:56:14",
"summ": 4491,
"totalSumm": 4491,
"prepaySum": 4491,
"purchaseSumm": 0,
"markDatetime": "2018-09-10 10:46:53",
"lastName": "***",
"firstName": "Алексей",
"phone": "**",
"email": "***@mail.ru",
"contragent": {
"contragentType": "individual"
},
"delivery": {
"code": "delivery-moscow-iml",
"cost": 0,
"netCost": 0,
"address": {
"index": "129226",
"countryIso": "RU",
"region": "Саратовская область",
"regionId": 66,
"city": "**",
"cityId": 364127,
"cityType": "п.",
"street": "***",
"streetId": 1632076,
"streetType": "ул.",
"building": "4",
"flat": "71",
"text": "ул. ***, д. *, кв./офис **"
}
},
"site": "RZ",
"status": "send-to-assembling",
"statusComment": "",
"items": [
{
"id": 8855,
"initialPrice": 4990,
"discountTotal": 499,
"vatRate": "18.00",
"createdAt": "2018-09-10 10:47:40",
"quantity": 1,
"status": "assembly-delivery",
"offer": {
"id": 404,
"externalId": "615",
"xmlId": "RC21-01190100-R3M1",
"name": "Razer Base Station Chroma",
"vatRate": "18.00"
},
"properties": [],
"purchasePrice": 0
}
],
"fullPaidAt": "2018-09-10 11:26:10",
"payments": {
"4862": {
"id": 4862,
"status": "paid",
"type": "bank-card",
"externalId": "rz-20180910-***",
"amount": 4491,
"paidAt": "2018-09-10 11:26:10",
"comment": "CHROMA10"
}
},
"fromApi": true,
"length": 0,
"width": 0,
"height": 0,
"shipped": false,
"customFields": []
}
Для того, чтобы с разных сайтов заказы заполнялись своими предустановленными значениями (у каждого может быть свой админ), в систему добавлен справочник «Настройки заполнения интернет-заказов».
Каждый вызов сервиса 1С логгируется в регистр «Журнал взаимодействия», все ходы записаны.
Пару скриншотов, как выглядит интерфейс.
Выводы
- http-сервисы 1С показали высокую надежность, а разработанная схема обмена online — очень удобна заказчику. Система проектировалась с учетом возможной высокой нагрузки — но ее по факту нет (всего 100 заказов в день, обычно 1000 взаимодействий в сутки). Но ни одного сбоя за 5 месяцев работы — а это неплохо.
- Доработки локализованы в отдельной подсистеме и в расширении конфигурации, что позволяет без проблем устанавливать обновления от фирмы 1С.