1C vs PHP. Глава 2. Поговорим?

Приветствуем!

Хотите что-то написать?

Нужно назвать себя.

Если вы пришли в первый раз,
то нужно зарегистрироваться.

Читайте нас в:

Блог на ya.ru
Блог на Деловом квартале
Блог на Twitter.om
Блог на Livejournal.com
08 февраля

Разработка1C vs PHP. Глава 2. Поговорим?

Давным давно я начал писать мини-книгу про то, как же заставить 1С и PHP работать вместе.

За плечами ещё одна отличная интеграция, после которой появился ещё не один десяток мыслей.

А пока шишки, набитые от странностей PHP и 1С залечиваются - есть немного времени написать ещё одну главу.

В прошлой главе мы узнали, что можно между этими двумя системами найти общий язык. А теперь научим 1C и PHP говорить на выбранном нами языке.

И вот пришло время знакомства таких загадочных и замечательных систем!

Как же обмениваться информацией? Начнем с хороших и не очень способов и описания подводных камней.

1. FTP

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

В данном случае посредником между 1C и PHP становится любой FTP сервер. На него складываются файлы в определенном формате, с определенными алиасами или ID.

По большей части в данном случае FTP будет располагаться на сервере, где находится сам сайт. Далее разделяем данные как входящие и исходящие (incoming/outgoing) методом каталогов. Добавляем необходимые параметры в имена файлов (ID, время, алиас типа данных).

Углубляться дальше - не стоит, пожалуй.

Плюсом является простая интеграция - из 1С обновления послать на FTP не сложно, если сайт расположен там же, где и сам FTP - никакого шаманства не понадобится.

Уже есть защита - это пароль сервера. Больше, скорей всего, и не понадобится.

Минус - часто таким способо не пообновляешь, данные могут быть неактуальным долгий период времени. Если данные обновляются достаточно часто - таким способом лучше не пользоваться.

Самое главное - это не забывать делать инкремент, чтобы не перечитывать файлы по несколько раз.

Пример:

Разберем на примере обновления товаров из 1С на сайт.

В течение 2 часов 1С следит за обновления товаров и при определенном кол-ве обновлений создает файл в нужном нам формате и заливает на FTP.

Допустим это формат XML. Имеем на FTP следующее:

/icoming/2.xml

/icoming/3.xml

/icoming/4.xml

/icoming/6.xml

Каждые 2 часа по крону срабатывает синхронизатор на PHP, смотрит на последний ID обновления (в нашем случае это 1) и смотрит далее на файлы, ID в имени файла которого больше 1. Забирает все файлы, парсит по очереди, выставляет себе ID 6 и уходит на покой.

2. HTTP/HTTPS

Здесь не обойтись без разделения на несколько пунктов - полет фантазии большой.

2.1 PHP - слушатель, 1С - рассказчик.

В данном случае мы улучшим актуализацию данных.

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

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

Если данные требуется держать актуальными постоянно - то лучше всего при изменении одного объекта в базе данных 1С - отсылать сразу обработчику на сайте. В данном случае, стоит выстраивать входящие данные в виде стэка и обрабатывать только по очередности отсылки данных. Лучше всего - если с данными приходит время их обновления на стороне 1С - тогда очередь будет выставлена грамотней и не произойдет ошибок обновления. Да, будут небольшие задержки, но лучше задержка в 1-2 секунды, чем неверные данные из-за неверной очереди.

Если постоянная актуализация не нужна - стоит взять в расчет, сколько объектов за раз может обновить PHP достаточно быстро и без больших нагрузок на сайт. Кол-во объектов приянять в расчет для 1С. Например, 1С обновляет каждые 15-20 объектов. Т.о. при накоплении этого объема - данные уходят на сайт.

Возможен случай, когда подойдет обновление данных каждые N минут. Но стоит быть предельно осторожными - может случиться, что объектов будет слишком много за 1 раз.

1С, к сожалению, в данном случае может лишь опрашивать PHP скрипт о наличии обновлений.

Очень важно рассчитать частоту обновлений. Иногда опрос даже раз в минуту может подойти.

Плюсом в данном случае является то, что ни 1C ни PHP не должны задумываться о том, какие данные им забирать.

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

Минус - данные в 1С не всегда будут актуальны.

2.2 PHP и 1C - рассказчики

Таким способом общения я уже задавался давно, но, к сожалению, на практике его применить так и не удалось и существует способ лишь в теории. Проблема в 1С - не найден способ "слушать" данные, приходящие извне. Была теория относительно веб-интерфейса 1С и общения средством SOAP. Ни один из них проверен не был, так что буду признателен любому, кто сможет применить способ на практике.

В теории всё просто и красиво. В предыдущем пункте 1С отсылал обновления данных в зависимости от их кол-ва и актуальности. В данном случае это будет делать и PHP.

Возможно обмен сделать достаточно частым - вплоть до каждого объекта в БД, т.о. данные будут актуальны всегда. Самое главное, что необходимо учесть - это двусторонний обмен одним и тем же типом данных.

Например, если обновления каталога присылаются из 1C в PHP и возможно обновление из PHP в 1С, то рано или поздно могут случиться расхождения при обновлении одного и того же объекта одновременно. Ещё хуже - обновления могут стать несовместимыми - где-то перенесена или удалена ветка каталога, а мы будем продолжать с ней работать.

Достаточно будет сравнивать входящие и исходящие данные. Но зачастую двусторонние обновления редки и всё будет упираться в оптимизации баз данных и разделения одного типа данных на несколько дискретных.

2.3 Сервер-посредник

Обдумывая данную статью пришла в голову одна идея - о создании сервера-посредника между 1С и PHP.

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

Способ так же на практике ещё не существует, но это ещё только пока ;)

2.4 Защита

При таком типе обновлений защита - ведущий фактор.

Организовать её можно достаточно просто:

1. Использовать HTTPS - изначально он безопасней и данные не улетят куда не надо

2. Использование уникального ключа общения на стороне PHP и 1С - уникальные ключи, которые будут уходить с запросами на обновление данных - это как пароли. Если их переодически планово менять - шансы утечки данных ещё меньше.

3. Привязка к IP. А ещё лучше - привязка IP к ключам. Т.о. создается отличное правило - 1 IP адрес = 1 ключ.

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

Коментарии:

MpaK 2010-01-31 12:46:22

Странно, что не указали XML-RPC, а сразу SOAP. Ну и при частом обмене, репликации и синхронизации как вариант просто написать демона, например на перле или питоне и слушать, когда к нему подключатся, а передавать формат можно хоть CVS…

ответить
maddogg 2010-02-01 12:53:39

xml-rpc необходим, пожалуй, для других целей, учитывая его спецификацию
«демона на перле» написать бывает не всегда проще и быстрее, но, не спорю, бывает что целесообразней

ответить
MpaK 2010-02-01 13:22:33

А чем эта цель плоха для XML-RPC, вполне отличная, вызвал например обновление позиции, вызвал обновление категории, вызывал репликацию последних заказов, имхо, самое то.

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

ответить
maddogg 2010-02-02 20:20:04

>>А чем эта цель плоха для XML-RPC
XML-RPC достаточно сложен в плане выдачи данных — зачастую не всегда уместно использование его и лучше иметь определенный формат, который распарсится быстрее и с меньшими ошибками

10 строк кода — это чрезмерно идеальный вариант. Не стоит забывать, про то что и формат может быть разный, и программист 1C может быть неподготовленный и архитектура БД отличается и есть некоторые особенности.

Да и демона не всегда запустить есть возможность

ответить

Свой комментарий: