Предисловие
Здравствуйте. Я решил затронуть давно избитую но не добитую тему синхронизации 1С и Друпала. Я во многих форумах читал насчет реализаций, на сайте drupal.ru помню даже тема была, с докладом о данной синхронизации. Но честно сказать везде рассказывали о том, что им удалось реализовать, но подробности никто не рассказывал. Потом я нашел еще несколько тем где была описана реализации, но если честно метод меня огорчил, реализация была выполнена на уровне БД. Данный метод меня не обрадовал, т.к. требовалась тонкая настройка самой программы 1С, а в моем случае нужно было написать синхронизацию, которую можно было настроить с помощью бесплатного модуля 1С: Предприятие 8.х - синхронизация с веб сайтом, который был разработан для CMS 1C Bitrix.
Не давно у меня появился проект, В котором нужно было реализовать синхронизацию с 1С. И сразу же нагрянул второй проект, где нужно было реализовать данный функционал. Т.к. мои поиски готовых решений не завершились удачей, я решил написать свой модуль, которая реалищует синхронизацию. Модуль сейчас готов, и пока что он "подточен" под конкретные проекты, но я не исключил возможность расширения для глобального использования. В этой статье я попрбую описать основные принципы и проблемы, которые я решил в процессе, пока писал модуль.
Я не профессиональный блогер, и навыков писать красивые статьи нет. Писал ночью. В связи с чем могут быть некоторые неувязки, обещаю исправить если найдутся ошибки=) прошу строго не судить, а вот критику и красивых решения хотелось бы почитать.
Читать весь материал
Комментарии
Спасибо за статью.
Не за что. Пишу для себя, как заметки=) Скоро будет продолжение, и после того как допишу модуль - подведу итоги.
Спасибо
Для загрузки файлов лучше использовать нативные друпалинные функции вместо file_put_contents, которую предлагаете вы
«
Для обработки(парсинга) больших XML файлов я испробовал много вариантом, но остановился на Simple XML. »
Разве Simple XML подходит для парсинга больших файлов? Насколько я понимаю, он грузит в память весь файл.
Согласен. Можно использовать file_save_data(). Как я говорил file_put_contents() -это самый простой способ, и при разработке конечного модуля я учту ваше замечание.
Да. SimpleXML загружает весь файл. Т.к. у меня нет опыта работы с XML файлами, и в моем случае файлы не превышают 10-12М, с php_memory_limit 96M все работает идеально. И к тому же у меня поджимают сроки до сдачи проекта, времени не было более подробно вникнуть в парсинг. Думаю в дальнейшем я напишу построчный парсер и применю его к данному модулю. Если у вас есть варианты, буду благодарен, рассмотреть их.
Спасибо!
При прочтении указанной статьи на 1с (v8.1c.ru/edi/edi_stnd/131/) возник вопрос: а как сайт "авторизует" 1ску? Выходит, дал запрос на checkauth, получил куку, дальше все запросы выполняешь с этой кукой и получить инфу по заказам и загрузить каталог может любой. Или я туплю малость?
Сам делал синхронизацию через FTP (за основу был взят importer от mirrocow). Так же, пожалуй, проще (и правильнее?) использовать Drupal Queue, чем выполнять задачи по hook_menu-механизм для разбиения на минизадачи и последующего выполнения уже реализован.
1с-ный марафон объявляю открытым!
К концу недели думаю всё ж засветить свой вариант
Я затронул этот момент в статье...
В начале функции можно написать проверку HTTP аутентификации, для обеспечения безопасности, а логин и пароль установить в модуле выгрузки в 1С.
А куку 1С отправляет с каждым запросом, можно ставить проверку значения куки.
Будем ждать. Может если все склеить получится что нибудь универсальное
Видимо, проглядел, спасибо. Но я имел в виду, странно, что об этом ничего не сказано в офдоке 1С.
Я не считаю странным все что не сказано, не сделано или сделано через костыли в продуктах вышеуказанной компании как говорится в фильме Мимино
«Я к ным чуствую такой силный лични неприязн»
-- это мое личное субъективное мнение
Вы бы открыли в 1С код выгрузки от Битрикса, для начала, а потом уже про костыли
Честно сказать я не видел данный код, т.к. нет под рукой данного модуля. Меня данная компания интересует только из аз того, что большинство клиентов пользуются их продуктом(О качестве их продуктов ничего не скажу, т.к. ничего не знаю, но думаю качество хорошее т.к. несколько тысяч крупных компаний пользуются и не жалуются). То что я писал про костыли- я имел ввиду меня не интересует как, что и с чем они все делали, т.к. я пишу код для себя и оставляю возможность расширять модуль, что позволит сделать его универсальным с поддержкой Commerce и Ubercart 3. Я никого не упрекаю, не насмехаюсь не над кем и не пытаюсь доказать что либо кому либо Я просто предлагаю свое решение, и жду аргументированную критику, чтобы в итоге получился продукт который подойдет всем.
Код выгрузки из битрикса и есть один большой костыль
Вить, что не знаю, то не знаю Но со стороны 1С можно сделать как угодно и удобно.
Нет. Со стороны 1С можно сделать как предлагают, а если хочешь свое, то пиши кучу непонятного кода=) Сложные задачи выгрузка из 1С "из коробки" на битриксе не решает.
Ну не все там так и не понятно, это только с первого взгляда
Из коробки сложно будет сделать по любому, учитывая количество только официальных релизов. И у каждого свои особенности.
Лучше делать для этого что-то плагинибельное под разные конфигурации.
Советую использовать для работы с большими файлами http://www.php.net/manual/en/splfileobject.fgets.php
а можно скриншот как выглядит это в итоге в Drupal?
Советую использовать для работы с большими файлами http://www.php.net/manual/en/splfileobject.fgets.php[/quote]
Спасибо. Буду иметь ввиду при написании парсера.
[quote="Shok211"]
эммм.. ну я могу словами описать.. в друпале со стороны интерфейса это 4 пустых страницы, которые фоново выполняют функции. А со стороны программного кода - я частично привел в самой статье, а остальное покажу когда модуль будет готов для массового использования.
Если вы внимательно прочитаете статью, поймете что на текущий момент модуль подточен под конкретные сайты, и в дальнейшем будет дорабатываться, в.т.ч и UI для модуля. А статью писал для того чтобы получить советы и может быть помочь кому нибудь реализовать указанную реализацию.
Насчет первого релиза модуля для массового использования я сообщу позже.
Вот про это я и говорю. Я пытаюсь создать расширяемый и гибко настраиваемый модуль для любых нужд, при том, чтобы можно было применить как на Ubercart-е так и на Commerce.
Наверное "красившее" было бы сделать его плагином к Feeds...
Тоже руки чешуться.. но пока таких задач не поступало-)
честно скажу c Feeds не знаком. В дальнейшем рассмотрю как вариант. Спасибо.
Универсального решения не будет никогда.
Вот здесь я расписал свой вариант так подробно, что подробней некуда:
http://habrahabr.ru/post/139272/
Интеграция с 1С не стоит выеденного яйца.
1) Составляется запрос в 1С;
2) Запрос.Выполнить().Выгрузить() => имеем таблицу значений;
3) Таблица пишется в DBF;
4) DBF загружается php-скриптом в Друпал.
5) Ставим все дела на крон. Профит!
Этот же вариант можно реализовать на стороне php через COM-соединение. Что тут сложного?
Вы уверены что мы сейчас обсуждаем одну и ту же тему?
Я описываю процесс синхронизации с помощью модуля Выгрузка на веб сайт для 1С v8.x. Для настройки которой не требуется знание программирования на 1С на том уровне, который вы описываете. В моем случае 1С находится удаленно, и у меня нет доступа к нему + к тому у меня нет желания изучать 1С программирование. Обошелся тем что скинул ссылку на модуль и сказал чтобы настроили выгрузку на указанную мною ссылку. Вашу статью я читал, но если честно там больше информации для тех кто работает именно с 1С а не с Друпалом. А насчет крона - не думаю что оптимально запускать крон менее чем рас в 3-5 часов, а грузить создавать по 2 материала(node, product)для каждой позиции, если выгружается 5-10к товаров одним Запросом не есть хорошо. подтачивать под это хочтинг- он будет слишком дорогой, а как все известно сейчас редко кто из клиентов готов платить много, когда предлагают кучу вариантов по дешевле. Если захотите могу еще долго описывать разницу между моей и вашей темами...
Универсальность решения будет в том что можно будет настроить связь любого количества выгружаемых полей с полями товаров на сайте.
Да, уверен.
Я считаю протокол обмена и формат Commerce ML редкостным идиотизмом. Разрабатывали их «мастера 1С», далекие от веба. Для простых сайтов описанный процесс подойдет, а для сложных нет. Это нисколько не умаляет ваших заслуг, но в промышленных масштабах вы с криками убежите от Commerce ML в сторону своего решения.
PS: не кажется ли вам, что было логичнее оформить код не как модуль, а как отдельный скрипт, например, drupal_1c.php? В коде определить основные функции, чтобы потом каждый смог просто подкорректировать логику загрузки и выгрузки под свои нужды?
На текущий момент задача стоит в том чтобы настроить сайт к синхронизации из "коробки" т.к. я уже отмечал
Возможно. не задумывался об этом. Просто привык все писать модулями. т.к. можно с легкостью прикрутить UI и настраивать вне кода основные настройки выгрузки.
Доброе утро!
у меня сложилась такая ситуация,
при синхронизации каталога (catalog.xml) и предложений товаров (offers.xml) в базах 1с и drupal
для товара выгружался на сайт список (специальная, диллерская,..) возможных цен (в файле offers.xml), это было хорошо.
как только я в режиме обмена данными 1с к выгрузке товаров добавил обмен заявками
(в 1с надо создавать соглашение с клиентом и там четко указывается одна цена..),
1с стала выгружать мне только одну цену на каждый товар..
стало интересно, нормально ли ето и как с этим бороться, а может надо что-то еще понастраивать..я про 1с
у вас на сайте каждому товару предлагается одна цена или со стороны 1с приходит много предложений?
<?php
$reader = new XMLReader();
$reader->open($filename);
while ($reader->read()) {
// погнали ...
}
$reader->close();
?>
проверено на больших файлах, и никаких сторонних скриптов
<?php
// mode=checkauth:
global $user;
if ($uid = user_authenticate($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW'])) {
$user = user_load($uid);
if (user_access('1c exchange')) {
drupal_session_regenerate();
$response[] = 'success';
$response[] = session_name();
$response[] = session_id();
}
}
// other modes:
if (user_access('1c exchange')) {
// погнали ...
}
print implode("\r\n", $response);
drupal_exit();
?>
как-то так
это называется костыли. К костылям:) Ну вообще, профит, да. Быстро и сердито, чо.
Можно использовать batch_set помимо крона. На тяжелый проект создание товаров по крону вешать гиблое дело, крон и так будет загружен поиковым реиндексом товаров как минимум. Крон нужно оставить, но малыми дозами по 10 - 100 нод например, а основной способ - друпаловским батчем с прогрессбаром.
интересная тема кстати
Это называется прозрачным удобным решением.
«Можно использовать batch_set помимо крона. На тяжелый проект создание товаров по крону вешать гиблое дело, крон и так будет загружен поиковым реиндексом товаров как минимум. Крон нужно оставить, но малыми дозами по 10 - 100 нод например, а основной способ - друпаловским батчем с прогрессбаром.»
а выполнение батча запускать по тому же крону?
вручную или драшем. Плюс в том, что процесс визуально оформлен, и клиент видит что происходит. А когда по крону... Ну хз, дело вкуса. Но меня за время разработки под друпал задолбали диалоги, типа
- а почему статья в поиске не видна
- а вот крон надо запустить
- ааа.. а что такое крон?
а тут еще и 1с по крону. Клиенты выгрузку сделали, а цены не обновились. Или обновились но всего лишь часть.
Сделал доп форму с запуском обработки поставленных в очередь товаров, и никто мозг не долбит. Сидят наслаждаются прогресс баром, пусть медитируют.
Даже В php есть возможно запустить параллельно множество запрос без Bath "К примеру в framework'e для тестов на 7. Используется Curl" только стоит ли шкура выделки ?
недофорки через curl это костыль.
Я запускаю импорт драшем, батч можно запускать драшем, батч так же запускается и из обычного hook_cron, но надо делать маленькие очереди
Вам самому судить. Но если у меня нету доступа к Drash или это не Drupal то я делаю именно так.
А чем не нравится моя реализация? вроде не так уж все сложно, простая очередь, простая обработка данных...
Вот туя я делал: Загрузка товаров в Commerce из 1C
http://www.drupal.ru/node/79777
1,2,3 - такие задачи не стояли.