Стандартный обмен 1С-Битрикс на BASH: инкрементальная выгрузка XML файлов каталога import и offers

в 9:34, , рубрики: 1С-Битрикс, api, bash, bash scripting, bash-скрипт, commerceml, http протокол, import.xml, import0_1.xml, offers.xml, offers0_1.xml, wget, wget http authorization, wget post, битрикс, обмен 1С и Битрикс, Разработка под Linux, метки:

Когда говорят о преимуществах 1С-Битрикс, в первых словах упоминают о лёгкой интеграции системы с 1С. Взаимодействие Битрикс с 1С осуществляется посредством передачи данных в формате CommerceML, который определяет формат XML файлов. В дополнение к этому Битрикс предлагает и стандарт обмена этими XML файлами между 1С и сайтом. Обмен состоит в отсылке из 1С обычных HTTP GET и POST запросов на сайт и получения от сайта простых ответов, определяющих результат выполнения команды.

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

Есть ещё несколько причин, чтобы вклиниться в стандартный обмен:

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

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

Затем мы берём получившиеся файлы, изменяем их, если нужно, и вместо 1С отсылаем на сайт. Таким образом, мы получаем полный контроль над процессом обмена, знаем, на каком этапе происходит сбой — если он происходит, можем вести лог загрузок, архив XML файлов, составлять своё собственное расписание, и во многом абстрагироваться от 1С в плане обмена.

Реализации протокола обмена уже существуют, но все они использует непомерно сложный инструментарий, наводящий на мысли о неполном понимании принципа, состоящего в отсылке простых HTTP запросов, ничем не отличающихся от запросов на просмотр любых интернет-сайтов.

Целью написания данного скрипта являются:

  • получение простого инструмента
    • с понятным алгоритмом работы, который можно портировать под любые языки программирования
    • который из-за своей простоты можно легко изменить под свои нужды
  • популяризация простых средств разработки, показ их возможностей
  • показ принципов работы HTTP протокола

Скрипт написан на BASH и предполагается к работе на внутреннем сервере компании, который обычно всегда имеется у веб-разработчика и находится во внутренней сети компании. Данный скрипт является частью семейства подобных скриптов, которые реализуют обмены товарами, остатками, загрузкой инфоблоков, заказами, статусами заказов. Проект выложен на github и обеспечивает работу нескольких интернет-магазинов.

BASH Скрипт обмена 1с и битрикс

Проект носит название bitrexchange — от bitrix exchange. Данный проект подразумевает семейство скриптов, написанных на bash и выполняющих схожие обмены.

Для примера, рассматривается наиболее часто используемый обмен: скрипт стандартного обмена 1C и Битрикс по стандарту CommerceML: инкрементальная выгрузка XML файлов каталога import и offers.

Приводится минимальный вариант скрипта. В следующей статье этой серии будет дан построчный разбор скрипта.

#!/bin/bash
#
# bitrexchange - bitrix exchange
# Скрипт стандартного обмена 1C и Битрикс по стандарту CommerceML
# Инкрементальная выгрузка XML файлов каталога import и offers
#
set -e

cd $(dirname $0)
cdir=$(pwd)"/"

remote_dir="/mnt/localwinserver_fs/import/webdata/"
zip_fname="catalogue.zip"
xml_files="import0_1.xml offers0_1.xml"

ctime=$(date +%Y-%m-%d-%H%M)

headers="--header="User-Agent: 1C+Enterprise/8.2" --header="Accept-Encoding: deflate""
login="import"
password="yourpasswordonbitrix"
baseurl="http://yourinternetshop.com/bitrix/admin/1c_exchange.php"

ret_line=$( wget $headers --user=${login} --password=${password} --auth-no-challenge -O - -q "${baseurl}?type=sale&mode=checkauth" )
read -a ret_ar <<< $ret_line
if [ ${ret_ar[0]} != "success" ]; then echo "Login errorrn"; exit -1; fi
sessvar=${ret_ar[1]}
sessid=${ret_ar[2]}
echo sessid=$sessid
ret=$(wget $headers --header="Cookie: ${sessvar}=${sessid}" -O - -q "${baseurl}?type=catalog&mode=init"); echo $ret
ret=$(wget $headers --post-file ${zip_fname} --header="Cookie: ${sessvar}=${sessid}" -O - -q "${baseurl}?type=catalog&mode=file&filename=import.zip"); echo $ret
for fname in $xml_files; do
st="progress"; while [ "$st" = "progress" ]; do ret=$(wget $headers --header="Cookie: ${sessvar}=${sessid}" -O - -q "${baseurl}?type=catalog&mode=import&filename=${fname}"); st=$( <<< "$ret" head -n1 | cut -c1-8); echo "$ret" | iconv -f cp1251 -t utf-8; done
done

Спасибо за внимание!

Автор: parserme

Источник

Поделиться

* - обязательные к заполнению поля