Когда говорят о преимуществах 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