27 September 2011

Как мы разрабатывали интеграцию интернет-магазина с 1С: Предприятие и почему она стала массовой

1С-Битрикс corporate blog
Как обеспечить актуальный каталог товаров и их наличие на сайте и обработать заказы покупателей в соответствии с внутренними бизнес-процессами? Многие владельцы интернет-магазинов сталкиваются с данной задачей.

Интегрировать отдельно взятый интернет-магазин с учетной системой предприятия в целом несложно. Реализовать готовую интеграцию в коробочной поставке CMS-системы и сделать ее простой и понятной для массового использования, универсальной для различных задач — непростая и интересная задача. Данный топик — о нашем опыте разработки интеграции интернет-магазина с популярной учетной системой 1С: Предприятие.



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

Итак, очень часто интернет-магазин создаётся в дополнение к уже существующим каналам: магазинам, розничным точкам, дилерским продажам и так далее. И, как правило, все каналы объединены единой торгово-учетной системой предприятия или ERP-системой, в которой осуществляются основные бизнес-процессы компании:
  • управление товарной номенклатурой;
  • продажи, закупки;
  • финансы, отчетность, аналитика и т.п.
В этом случае возникает острая необходимость, чтобы интернет-магазин был интегрирован в единую учетную систему предприятия или ERP-систему.

Первое и главное при разработке интеграции — осознать ее цели и решаемые задачи. И от этого уже планировать что, как и куда передавать. В интеграции сайта с ERP-системой обычно требуется автоматизировать решение трех основных задач:
  • обеспечение выгрузки на сайт каталога товаров (который ведется в ERP) и поддержку его актуальности
  • передача заказа с необходимыми сведениями с сайта в ERP
  • информирование клиентов о ходе исполнения их заказов, обработка которых ведется в ERP.
Все разумно и просто, но, согласитесь, многие из нас были свидетелями того, как сайт живет своей жизнью, а учетная система своей. Заказывая товар в интернет-магазине, после звонка менеджера обнаруживалось, что товара нет на складе, цена не соответствует действительности, новый курс валюты или на сайте опубликован товар не в той комплектации или с картинкой другого цвета.

Разумеется, результат для такого магазина здесь возможен только один: разочарованный и недовольный клиент, который вряд ли захочет вернуться, даже несмотря на старания ваших менеджеров.



Дело было еще в 2007 году. Учитывая растущую популярность интернет-магазинов и увеличивающийся спрос на решение интеграционных задач стало ясно, что нам, как разработчикам CMS системы, нужно было предложить клиентам надежное и готовое решение для такой интеграции: простое в настройке и использовании.

Первое решение — с какой учетной системой строить такую готовую интеграцию? На тот момент, да и сегодня, наиболее популярное решение в России – платформа 1С: Предприятие, большинство клиентов хотят интегрировать свой сайт именно с 1С. В части решения задач торговой компании наибольшим спросом пользуется конфигурация 1С: Управление торговлей. Интеграцию решено было сделать именно с ней.



Разумеется, все написанное здесь также применимо и к решению задачи интеграции других ERP и CMS систем и сайтов. Подходы и идеи — это важно, ведь подходы и идеи универсальные, а код всегда можно адаптировать.

Задача обрела конкретику и мы (в сотрудничестве со специалистами 1С) начали работу. Для начала нужно было решить, какова будет архитектура взаимодействия. Вообще есть два граничных подхода:
  1. Непосредственно обращение сайта к 1С
  2. Регулярный обмен данными между 1С и сайтом
Рассмотрим первый подход — обращения напрямую к системе 1С

При его использовании сайт при необходимости запрашивает у 1С или отдает данные.

Стоит отметить, что показ каталога в интернете и онлайн заказ можно сделать вообще без CMS, у 1С есть такой функционал, как веб-расширения, а не так давно вышла платформа 8.2 и технология «управляемого приложения», которые позволяют достаточно легко отдавать функционал 1С в браузере. Но, это типичный пример первого подхода, который обладает следующими преимуществами и недостатками для наших задач.

Преимущества очевидны:
  • Полная актуальность каталога на сайте в режиме реал-тайм
  • Мгновенное появление нового заказа в 1С
  • Быстрое информирование клиента о результатах обработки заказа
В качестве интерфейса взаимодействия сайта и 1С обычно используется технология веб-сервисов (она кроссплатформенная и является стандартом де-факто для интеграции систем).

Тогда в 1С публикуется веб-сервис с набором методов, сайт туда «стучится» время от времени: забирает или отдает данные. Вроде все красиво. НО …. широкого распространения, к сожалению, такой правильный и технологичный подход не получил. И на наш взгляд вот почему:

1) Сложность в настройке для массового использования.

Для того чтобы опубликовать веб-сервис нужно развернуть веб-сервер, прописать загрузку модуля расширения, опубликовать сам веб-сервис. Кто-то скажет: что за сложность, какая ерунда и будет в целом прав. В 1С даже есть функция автоматической публикации веб-сервиса в установленном веб-сервере. НО… жизнь есть жизнь, массовому потребителю, непрограммисту это сложно и непонятно. А когда начинаются проблемы, веб-сервис не работает, снаружи не виден, алиас не прописан, пользователь не заведен, прав не хватает и т.п. – люди выпадают в осадок. Кроме того, если предприятие достаточно крупное, то необходимость в привлечении ИТ-специалистах очевидна.

2) Зависимость сайта от работы 1С

Внутренняя учетная система по разным причинам может не работать: идет обновление ПО, замена оборудования, восстановление резервной копии и т.п. В эти периоды ваш сайт не сможет корректно работать, так как целиком завязан на 1С. Конечно, вы можете эти ситуации учитывать, и реализовать определенную защиту на сайте, которые бы учитывали факт неработоспособности базы, но это лишний код, лишняя логика, которая усложняет веб-систему.

3) Зависимость 1С от работы сайта

Популярный интернет-магазин может иметь очень большую посещаемость, высокие пиковые нагрузки, много заказов в единицу времени. Если за каталогом товаров, ценами и наличием постоянно ползать в 1С, то это будет банально медленно! Веб-сервисы – удобный, технологичный, но далеко не быстрый способ обмена. И это даже при условии, что сервер 1С будет работать на приличном оборудовании. А высокие пиковые нагрузки с сайта могут вообще парализовать работу базы. Конечно, каталог товаров можно кэшировать, и запрашивать его время от времени, но, во-первых теряется первое преимущество подхода (постоянный реалтайм), а во-вторых, остается последняя, но на наш взгляд, наиболее существенная проблема: психологическая…

4) Потенциальная угроза со стороны сайта

Вспомним, что 1С является главной учетной системой предприятия, где хранится вся жизнь. 1С: Управление торговлей обычно интегрировано с бухгалтерией, кадрами и т.п. Есть и комплексные конфигурации, где все в одном флаконе. Обычно вопрос безопасности этой системы ставится во главу угла, и, зачастую, решается очень просто: отрубанием кабеля “с интернетом” от сервера в принципе (физическим способом, если по-научному). Теперь поставим себя на место руководителя, которому сообщают, что теперь сайт будет постоянно ползать в 1С за данными: записывать, получать, обновлять. И хоть мы с вами знаем, что сайт лезет не напрямую в 1С, а через веб-сервисы, у которых определенный ограниченный набор прав, психологически это тяжело принять. Как? Сайт, который могут взломать и заразить вирусом ИМЕЕТ ДОСТУП В НАШУ 1С? Ну щас, разбежались…!?



Поэтому мы применили второй подход.

Синхронизация данных между 1С и сайтом по расписанию

В такой концепции сайт и 1С работают независимо, у каждого своя база данных, но в установленные периоды необходимая информация синхронизируется.

Учитывая вышеупомянутый психологический момент, сайт никакого доступа к 1С не имеет! Тогда, чтобы все работало, 1С должна сама периодически обращаться к сайту, отдавая или забирая информацию.

Преимущества по сравнению с первым подходом очевидны:
  • Сайт работает самостоятельно, со своими данными, не зависит от доступности данных в 1С
  • 1С не принимает запросы с сайта, не испытывает дополнительных нагрузок
  • В случае нарушения безопасности сайта, безопасность 1С не нарушается
У текущей архитектуры есть только один недостаток по сравнению с первым подходом: задержка обновления данных. Если, например, кроме сайта вы еще торгуете в розницу, то товар, который еще есть на сайте в наличии, уже может отсутствовать на складе. Вероятность коллизии, разумеется обратно пропорциональна интервалу обновления. Для небольших интервалов обновления (несколько минут) и среднестатистического магазина она очень невелика

Но, во-первых, мы приняли допущение, которое потом было доказано жизнью: для массовой интернет-торговли этот недостаток НЕ ЯВЛЯЕТСЯ КРИТИЧНЫМ. Вероятность такой ситуации невелика и уменьшается с уменьшением интервала обмена, а кроме того масса интернет-магазинов вообще торгуют не по реальным остаткам, скрывая наличие от посетителей. Да и если такая ситуация все таки произошла, в большинстве случаев товар можно найти достаточно быстро.

А во вторых? А во-вторых были использованы некоторые технологические решения, чтобы можно было без последствий сделать достаточно небольшой интервал задержки обновления.

Еще раз повторюсь, мы решали задачу создания интеграции, которая была бы из коробки готова в максимальном числе случаев. Конечно, есть магазины, для которых это критически важно, но ведь и автомобили многих тоже не устраивают в стоке и хочется тюнинг?! ) А тюнинг уж мы позволяем…

Кстати, о транспорте…

А что же с веб-сервисами, спросите вы? Ведь если не на стороне 1С, то теперь на стороне сайта их придется публиковать? А на веб-сервисы мы, хорошо подумав, забили. И вместо них решили реализовать обмен по старому доброму протоколу HTTP с применением обмена файлами по стандарту CommerceML.

Обмен по HTTP означает, что 1С обращается к некоторому скрипту на сайте и методом POST передает ему файлы данных. Это хорошо тем, что здесь не надо ничего дополнительно настраивать. 80й порт открыт в большинстве брандмауэров, т.к. через него вся контора пользуется инетом и 1С очень часто точно также в инет и глядит. Скрипт на сайте входит в коробочную поставку CMS, и его тоже не надо нигде дополнительно публиковать.

А CommerceML хорош тем, что это открытый стандарт на базе XML, который специально предназначен для обмена коммерческой информацией: классификатором каталога, группами и свойствами товаров, товарами, заказами. Передача данных возможна между разными системами, в том числе между сайтом и бэкофисом. Этот стандарт на момент начала работ уже существовал и развивался. На сегодня доступна уже версия 2.05, где появилось несколько приятных нововведений. Ну и, конечно, нас очень радовало, что такой стандарт уже на тот момент штатно поддерживался в 1С: Предприятие.

Примеры CommerceML файлов: файл с информацией о товарах, файл с ценовыми предложениями, файл с информацией о заказах с сайта, и на сайт.

В итоге получилась следующая архитектура нашей интеграции:



В состав 1С: Предприятие входит специальный модуль для обмена с сайтом, в котором настраиваются параметры обмена данными. Из корпоративной сети происходит обращение к удаленному сайту (размещенному на некоторой хостинг-площадке) по протоколу HTTP. Стрелки, ведущие к сайту отображают направление запросов, инициатором которых всегда выступает 1С.

Протокол обмена 1С с сайтом

Протокол полностью открытый, его можно дорабатывать и модицифировать. Информация о протоколе опубликована как в документации к 1С-Битрикс, так и на сайте 1С.

Итак, как все сказанное выше на словах выглядит технически:

1С отправляет http-запрос вместе с http-авторизацией следующего вида:
http://<сайт>/bitrix/admin/1c_exchange.php?type=catalog&mode=checkauth
Сайт отвечает тремя строками (с разделителем "\n"):
1. слово "success";
2. имя Cookie;
3. значение Cookie.
Примечание:
Все последующие запросы к сайту сопровождаются выставлением со стороны 1С имени и значения Cookie, полученными по команде "checkauth".


Следующим этапом 1С запрашивает у сайта некоторые параметры, чтобы в дальнейшем вести обмен:

http://<сайт>/bitrix/admin/1c_exchange.php?type=<режим>&mode=init (режимы: catalog или sale, для выгрузки товаров и загрузки заказов соответственно)

В ответ сайт выдает две строчки:
1. zip=yes/no, сообщая о поддержке обмена в zip-формате.
2. file_limit=<число>, где <число> - максимально допустимый размер файла в байтах для передачи за один запрос. Если размер файла больше, то он должен быть порезан на части.


Когда соединение установлено и параметры определены, начинается основная обмена файлами CommerceML. В зависимости от режима обмена 1С:

а) передает сайту данные по товарной номенклатуре

http://<сайт>/bitrix/admin/1c_exchange.php?type=catalog&mode=file&filename=<имя файла>
1C загружает на сервер файлы обмена в формате CommerceML 2, посылая содержимое файла или его части в виде POST. В случае успешной записи файла сайт выдает "success".


б) запрашивает с сайта заказы покупателей

http://<сайт>/bitrix/admin/1c_exchange.php?type=sale&mode=query

Сайт отдает заказы в формате CML 2. В случае успешного получения и записи заказов в 1С совершается запрос вида:
http://<сайт>/bitrix/admin/1c_exchange.php?type=sale&mode=success


в) передает сайту данные о результатах обработки ранее полученных заказов

http://<сайт>/bitrix/admin/1c_exchange.php?type=sale&mode=file&filename=<имя файла>
загружает на сервер файл обмена, посылая содержимое файла в виде POST. В случае успешной записи файла 1С-Битрикс выдает "success". Дополнительно на следующих строчках могут содержаться замечания по загрузке.


Если в ходе какого-либо запроса произошла ошибка, то ответ системы 1С-Битрикс будет иметь вид: в первой строке слово «failure», а на следующих — описание ошибки, произошедшей в процессе обработки запроса. Если произошла необрабатываемая ошибка уровня ядра продукта или sql-запроса, то в таком случае будет возвращен html-код с сайта.

Вот такая нехитрая, но надежная процедура обмена, которая, повторюсь, основана на трех китах:
  • Обмен данными по протоколу HTTP
  • Инициатор обмена всегда 1С
  • Отрытый формат и протокол обмена
Кстати, спустя некоторое время протокол поддержали и разработчики других CMS, и на сегодня это по сути стандарт де-факто по взаимодействию 1С с сайтами. Это очень важно, поскольку изначально и ставилась такая задача: не монополизировать, не сделать закрытым обмен, а предоставить возможности для дальнейшей доработки, совершенствования обмена и его адаптации под конкретные внедрения. А значит цель по выбору оптимальной архитектуры, на наш взгляд, была достигнута.

Чтобы топик не получился очень длинным, на сегодня все.

Во второй части статьи мы расскажем:
  • Как была оптимизирована передача данных между 1С и сайтом
  • Как передаются большие объемы данные и преодолеваются с типовые ограничения хостеров
  • Какой интерфейс настройки интеграцию под конкретные задачи как в 1С, так и на сайте
  • Как предоставляется возможность дорабатывать обмен и делать нестандартные вещи

Продолжение следует…

С уважением, руководитель отдела развития бизнеса
Артем Рябинков
Tags:интеграция1с-битрикс1с:предприятие1с интернет-магазинвеб-сервисобмен даннымиинтернет-магазинсклад
Hubs: 1С-Битрикс corporate blog
+30
103.7k 180
Comments 81