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

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


Следующая статья серии: подробный и построчный разбор скрипта стандартного обмена 1С и Битрикс.

Поделиться с друзьями
-->

Комментарии (16)


  1. bitrixworkshop
    04.02.2017 07:51

    Спасибо.

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

    Вы настроены реализовать только стандартный протокол? Пакетного режима не будет?

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

    Цель Вашего скрипта в иллюстрация протокола HTTP сомнительна. Нужно уметь читать bash, быть знакомым с программами, использованными в скрипте. Т.е. это совершенно не замена программиста Битрикс и программиста 1С.

    Что запуск скрипта возможен только на сервере — это Вы погорячились. Есть люди (я в том числе), которые используют Linux на рабочем ПК. Да и на Windows 10 разрекламирована такая возможность.

    Тем не менее, Ваш труд очень полезен.


    1. parserme
      06.02.2017 11:45

      Спасибо за комментарий!
      Пакетный режим, насколько я понимаю, это исключительно терминология 1С, то есть, имеется в виду рассинхронизация процессов формирования пакетов и их отсылки. Сам протокол обмена данными используется тот же. Поэтому, измения в скрипте могут быть только в том плане, что нужно контролировать появление новых файлов, выгружаемых из 1С, и когда они появляются, начинать выгрузку. Это возможно сделать, но сейчас у меня такой задачи нет, поэтому все желающим и карты в руки :-)
      А конфигурации 1С могут быть разные, одна из ситуаций, которая у меня была, это как раз невозможность посмотреть лог загрузки.
      Это точно не замена программисту Битрикс, а вот программисту 1С — вполне, чтобы не забирать его время.
      Насчёт HTTP протокола, это минимальный вариант скрипта, без комментариев, по которому, конечно, люди, не знакомые с командной строкой Linux, ничего не поймут. Но в том и цель, чтобы показать, что есть простые инструменты для таких задач, и поэтому на github есть тот же скрипт с построчными комментариями, а в следующей статье я хочу дать их в ещё более подробном виде.
      Да, я тоже давно отказался от Windows на настольном компьютере. :-)


      1. bitrixworkshop
        06.02.2017 15:30

        Пакетный режим — это разбиение всего каталога, например, из 10000 товаров на пакеты по 100 товаров. Далее каждый пакет отправляется серией CML файлов. В отличие от стандартного модуля обмена, который идет вместе с 1С, этот пакет уйдет не в двух CML файлах, а в семи (товары-метаданные-группы, товары-метаданные-свойства, товары-элементы, предложения-метаданные, предложения-элементы, остатки, цены). Опять таки, в отличие от стандартного модуля, на каждый из этих семи файлов будет открыта отдельная сессия PHP.


  1. AnthonySoprano
    04.02.2017 20:28

    Автор, низкий тебе поклон. Буквально последние дни занимаюсь этим вопросом и оптимизацией чего только можно. Пока выгрузки идут напрямую из 1С на сайт, но уже пришёл к выводу, что лучше отправлять готовый набор файлов вручную. В режиме обмена по изменениям в принципе у меня проблем не возникает… когда их не больше тысячи по товарам. Но на сайте у нас более 130 тысяч товаров, и у компании есть планы по увеличению этого количества до какой-нибудь бесконечности. Если сейчас сайт лежит (а сервер даже не напрягается!) даже при обмене по изменениям 16 тысяч позиций, то что будет дальше — ума не приложу. Настройки периодичности и размера пакетов помогают слабо. Нереально найти такой баланс настроек, при котором сайт не тормозил бы, но товары выгружались и обновлялись быстрее. Можно слегка облегчить обмены, разнеся определённые группы товаров в разные обмены.
    Так что лично мне этот материал очень кстати, обязательно испробую.


    1. parserme
      06.02.2017 11:22

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


      1. AnthonySoprano
        06.02.2017 11:56

        Буду благодарен вам за помощь. Вопрос ещё актуален. Прям мозоль какая-то.
        Сейчас у нас есть план-Б, аналогичный вашему: выгружать стандартным модулем обмена из 1С нуменклатуру в файлы. Файлы отдельными скриптами отправлять на сервер, который уже фоном намного быстрее обрабатывает импорт XML. Скрипты, скажем, запускаемые по cron, могут быть как shell-овскими, так и php-шными, но суть в том, что они отправляют запрос битриксу так же, как это делает эска. На битриксе сам компонент импорта каталогов стандартный, не дописывался.

        Я запилил свой js-скрипт на базе небезысвестного и чрезвычайно корявого bx_1c_import.php. Импорт таким образом пролетает намного быстрее.

        Процедура импорта напрямую из 1С сама по себе тормозная, ибо сначала эска подвисает при подготовке одного пакета, потом готовые файлы пакета отправляет на сайт и уже подвисает он в процессе импорта. Когда количество пакетов идёт на сотни, в каждом около 500 элементов, сайт просто захлёбывается. И чем ближе обмен подходит к концу, тем дольше идёт выгрузка данных файл. При том, что пакеты сразу снимаются с регистрации после его импорта в битрикс (?).
        Битрикс 15.5.8 УС Бизнес, 1С 8.2 с модулем обмена 4.0.5.1


        1. bitrixworkshop
          06.02.2017 16:19

          Скрипты, скажем, запускаемые по cron, могут быть как shell-овскими, так и php-шными, но суть в том, что они отправляют запрос битриксу так же, как это делает эска.
          Зачем так, если все равно делаете по-своему? Тогда уж импорт по cron PHP скриптом на API Битрикс.

          Мне приходилось так делать, когда программист 1С не захотел доделывать модуль обмена со стороны 1С (для нестандартной логики). Кидали из 1С файл по ftp на сервер с сайтом, там по cron разбирали.

          на базе небезысвестного и чрезвычайно корявого bx_1c_import.php.
          Его поезд давно ушел. Был актуален до обмена 3 включительно. На четвертом и далее он может помочь, но нужно понимать что делаешь.

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


          1. AnthonySoprano
            06.02.2017 16:33

            Пропускать обработку по контрольным суммам уже пробовали?

            Программист 1С понизил объёмы выгрузок иным путём. Специфика нашей компании такова, что в нашу 1с дополнительно парсится нуменклатура сторонних поставщиков, и она каждый день меняется в большом своём количестве. Один такой каталог на 30 тысяч товаров, второй почти такой же, да плюс свой как они вместе взятые. Далее это всё дело летит на сайт, естественно, в режиме изменений, но повторюсь — объёмы колоссальны.
            Так вот изначально в 1с теперь залетают только изменившиеся в стороннем прайсе позиции. Т.о. меньше позиций в нашей базе стали помечаться изменёнными, соответственно, и общий объём понизился. Больше никаких изменений на стороне 1с не производилось. Таких настроек даже не имеется, а корячить своё… программист сейчас слишком занят более приоритетными задачами, так что пока корячимся сами, битриксоиды.

            На четвертом и далее он может помочь, но нужно понимать что делаешь.

            В нашей среде его даже запустить не удалось толком. Он мне помог только состряпать свой скрипт) Взял самый важный кусок и завернул в свой интерфейс.


    1. shurupkirov
      08.02.2017 10:59

      Если долго импортируются товары — проверьте настройки генерации карты сайты и текущее количество файлов карты


      1. AnthonySoprano
        08.02.2017 11:20

        Они не импортируются долго, а экспортируются из 1С в файлы. А импортируются на сайт тяжело. К слову, карты сайта пока нет: лечим как раз структуру каталога, чтобы sitemap'ы генерировать адекватные.


        1. shurupkirov
          08.02.2017 11:33

          я это к чему. у нас каталог 5-6 тысяч активных товаров, 40-60 тысяч активных предложений.
          1С у нас пока что нет, учетная программа на Access'е с БД на MS SQL
          Полное время импорта занимало когда-то час, потом 2, 3 и т.д. до 6 часов.
          Импорт предложений всегда занимал примерно одно и тоже время 20-30 минут, а время импорта товаров неуклонно росло, несмотря на отсутствие значительного роста количества товаров.
          И только через 3 года случайно обнаружили (место стало заканчиваться на хостинге) 102 файлика инфоблока товаров карты сайта. Удалив все и перегенериров карту — получили 1 файл и…
          Общее время импорта данных — 50 минут
          Выяснили, что при включенной автогенерации карты сайта, он при каждой деактивации товара — ищет ссылку на товар в карте сайта и заменяет ее на… пробелы! А новые товары после превышения лимита на размер файла с данными карты пишет в следующий и следующий файлы.
          Все тормоза во времени импорта товаров были связаны с тем, что ему приходилось при каждой деактивации товаров искать ссылку на товар, открывая помещенный в память файл-xml и т.д. пока он не находил нужные данные


          1. AnthonySoprano
            08.02.2017 12:36

            Благодарю за ценную информацию. С этим ещё не сталкивались, но будем учитывать.


  1. parserme
    06.02.2017 12:56

    Отправил материалы личным сообщением. Да, я тоже начал с bx_1c_import, но так же быстро оставил его...)

    И чем ближе обмен подходит к концу, тем дольше идёт выгрузка данных файл.

    — потому что при импорте полностью заполняется таблица b_xml_tree. В начале импорта она пустая.


    1. bitrixworkshop
      06.02.2017 16:25

      потому что при импорте полностью заполняется таблица b_xml_tree. В начале импорта она пустая.
      Она чистится на каждом пакете. В этом смысл пакетного режима — отдавать по частям каталог.


      1. parserme
        06.02.2017 16:32

        Ну да, если представить, что каждый такой «пакет» — это полный цикл инкрементальной выгрузки, содержащей часть каталога, то это как раз вписывается в общую логику работы, потому что ведь инкрементальных выгрузок может идти поряд сколько угодно, и в частном случае это будет разбитый на части (пакеты) каталог.


        1. bitrixworkshop
          06.02.2017 16:36

          Ничего не понял в этом тексте.

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

          Пакетного режима в обмене от 1С (который может работать и с другими CMS) нет вообще.