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

Коли говорять про переваги 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 error\r\n"; 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

Дякую за увагу!
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.