Нетиповая интеграция 1С и интернет-магазина

Интеграция с интернет-магазинами — задача классическая:

  • Необходимо обеспечить загрузку данных о номенклатуре, ценах, складских остатках и резервах из 1С в интернет-магазин;
  • обеспечить загрузку заказов из интернет-магазина в 1С. А также, доставлять информацию об изменении статусов заказа 1С в интернет-магазин.

Как известно, 1С (ERP, КА2, УТ11) имеет встроенную типовую интеграцию с интернет сайтами, совместимость которой подтверждена несколькими популярными CMS: «1С-Битрикс», «Юмисофт», «Хостмейк» и другими.

У данных типовых обменов есть ряд ограничений:

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

Кстати, разработчики 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 записей.


Схема загрузки цен и статусов наличия из 1С на сайт

Загрузка заказов с сайта

Общая схема следующая. 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С логгируется в регистр «Журнал взаимодействия», все ходы записаны.

Пару скриншотов, как выглядит интерфейс.

Выводы

  1. http-сервисы 1С показали высокую надежность, а разработанная схема обмена online — очень удобна заказчику. Система проектировалась с учетом возможной высокой нагрузки — но ее по факту нет (всего 100 заказов в день, обычно 1000 взаимодействий в сутки). Но ни одного сбоя за 5 месяцев работы — а это неплохо.
  2. Доработки локализованы в отдельной подсистеме и в расширении конфигурации, что позволяет без проблем устанавливать обновления от фирмы 1С.

Вам также может понравиться

About the Author: Павел Пчелинцев