Синхронизация Drupal с 1С

Главные вкладки

Аватар пользователя ArmRus ArmRus 5 августа 2012 в 5:22

Предисловие
Здравствуйте. Я решил затронуть давно избитую но не добитую тему синхронизации 1С и Друпала. Я во многих форумах читал насчет реализаций, на сайте drupal.ru помню даже тема была, с докладом о данной синхронизации. Но честно сказать везде рассказывали о том, что им удалось реализовать, но подробности никто не рассказывал. Потом я нашел еще несколько тем где была описана реализации, но если честно метод меня огорчил, реализация была выполнена на уровне БД. Данный метод меня не обрадовал, т.к. требовалась тонкая настройка самой программы 1С, а в моем случае нужно было написать синхронизацию, которую можно было настроить с помощью бесплатного модуля 1С: Предприятие 8.х - синхронизация с веб сайтом, который был разработан для CMS 1C Bitrix.

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

Я не профессиональный блогер, и навыков писать красивые статьи нет. Писал ночью. В связи с чем могут быть некоторые неувязки, обещаю исправить если найдутся ошибки=) прошу строго не судить, а вот критику и красивых решения хотелось бы почитать.
Читать весь материал

Комментарии

Аватар пользователя ArmRus ArmRus 5 августа 2012 в 14:50

Не за что. Пишу для себя, как заметки=) Скоро будет продолжение, и после того как допишу модуль - подведу итоги.

Аватар пользователя volocuga@drupal.org volocuga@drupal.org 5 августа 2012 в 18:32

Спасибо
Для загрузки файлов лучше использовать нативные друпалинные функции вместо file_put_contents, которую предлагаете вы
«
Для обработки(парсинга) больших XML файлов я испробовал много вариантом, но остановился на Simple XML. »

Разве Simple XML подходит для парсинга больших файлов? Насколько я понимаю, он грузит в память весь файл.

Аватар пользователя ArmRus ArmRus 5 августа 2012 в 20:21

"<a href="mailto:volocuga@drupal.org">volocuga@drupal.org</a>" wrote:
Для загрузки файлов лучше использовать нативные друпалинные функции вместо file_put_contents, которую предлагаете вы

Согласен. Можно использовать file_save_data(). Как я говорил file_put_contents() -это самый простой способ, и при разработке конечного модуля я учту ваше замечание.

"<a href="mailto:volocuga@drupal.org">volocuga@drupal.org</a>" wrote:
Разве Simple XML подходит для парсинга больших файлов? Насколько я понимаю, он грузит в память весь файл.

Да. SimpleXML загружает весь файл. Т.к. у меня нет опыта работы с XML файлами, и в моем случае файлы не превышают 10-12М, с php_memory_limit 96M все работает идеально. И к тому же у меня поджимают сроки до сдачи проекта, времени не было более подробно вникнуть в парсинг. Думаю в дальнейшем я напишу построчный парсер и применю его к данному модулю. Если у вас есть варианты, буду благодарен, рассмотреть их.

Аватар пользователя rimen rimen 5 августа 2012 в 22:49

Спасибо!
При прочтении указанной статьи на 1с (v8.1c.ru/edi/edi_stnd/131/) возник вопрос: а как сайт "авторизует" 1ску? Выходит, дал запрос на checkauth, получил куку, дальше все запросы выполняешь с этой кукой и получить инфу по заказам и загрузить каталог может любой. Или я туплю малость?
Сам делал синхронизацию через FTP (за основу был взят importer от mirrocow). Так же, пожалуй, проще (и правильнее?) использовать Drupal Queue, чем выполнять задачи по hook_menu-механизм для разбиения на минизадачи и последующего выполнения уже реализован.

Аватар пользователя ArmRus ArmRus 6 августа 2012 в 12:46

"rimen" wrote:
а как сайт "авторизует" 1ску

Я затронул этот момент в статье...

В начале функции можно написать проверку HTTP аутентификации, для обеспечения безопасности, а логин и пароль установить в модуле выгрузки в 1С.

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

"RxB" wrote:
1с-ный марафон объявляю открытым!
К концу недели думаю всё ж засветить свой вариант

Будем ждать. Может если все склеить получится что нибудь универсальное Smile

Аватар пользователя rimen rimen 6 августа 2012 в 13:46

"xman0011" wrote:
Я затронул этот момент в статье...

Видимо, проглядел, спасибо. Но я имел в виду, странно, что об этом ничего не сказано в офдоке 1С.

Аватар пользователя ArmRus ArmRus 6 августа 2012 в 14:13

"rimen" wrote:
странно, что об этом ничего не сказано в офдоке 1С.

Я не считаю странным все что не сказано, не сделано или сделано через костыли в продуктах вышеуказанной компании Smile как говорится в фильме Мимино
«Я к ным чуствую такой силный лични неприязн»
-- это мое личное субъективное мнение Smile

Аватар пользователя PVasili PVasili 6 августа 2012 в 14:29

"xman0011" wrote:
не сделано или сделано через костыли в продуктах вышеуказанной компании Smile

Вы бы открыли в 1С код выгрузки от Битрикса, для начала, а потом уже про костыли Smile

Аватар пользователя ArmRus ArmRus 6 августа 2012 в 17:08

"PVasili" wrote:
Вы бы открыли в 1С код выгрузки от Битрикса, для начала, а потом уже про костыли :)

Честно сказать я не видел данный код, т.к. нет под рукой данного модуля. Меня данная компания интересует только из аз того, что большинство клиентов пользуются их продуктом(О качестве их продуктов ничего не скажу, т.к. ничего не знаю, но думаю качество хорошее т.к. несколько тысяч крупных компаний пользуются и не жалуются). То что я писал про костыли- я имел ввиду меня не интересует как, что и с чем они все делали, т.к. я пишу код для себя и оставляю возможность расширять модуль, что позволит сделать его универсальным с поддержкой Commerce и Ubercart 3. Я никого не упрекаю, не насмехаюсь не над кем и не пытаюсь доказать что либо кому либо Smile Я просто предлагаю свое решение, и жду аргументированную критику, чтобы в итоге получился продукт который подойдет всем.

Аватар пользователя PVasili PVasili 6 августа 2012 в 18:02

"RxB" wrote:
Код выгрузки из битрикса и есть один большой костыль

Вить, что не знаю, то не знаю Smile Но со стороны 1С можно сделать как угодно и удобно.

Аватар пользователя ArmRus ArmRus 6 августа 2012 в 19:01

"PVasili" wrote:
Вить, что не знаю, то не знаю Smile Но со стороны 1С можно сделать как угодно и удобно.

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

Аватар пользователя PVasili PVasili 6 августа 2012 в 20:50

"xman0011" wrote:
то пиши кучу непонятного кода=)

Ну не все там так и не понятно, это только с первого взгляда Smile

"xman0011" wrote:
Сложные задачи выгрузка из 1С "из коробки" на битриксе не решает.

Из коробки сложно будет сделать по любому, учитывая количество только официальных релизов. И у каждого свои особенности.
Лучше делать для этого что-то плагинибельное под разные конфигурации.

Аватар пользователя ArmRus ArmRus 7 августа 2012 в 11:19

Советую использовать для работы с большими файлами http://www.php.net/manual/en/splfileobject.fgets.php[/quote]
Спасибо. Буду иметь ввиду при написании парсера.

"keha3912" wrote:
а можно скриншот как выглядит это в итоге в Drupal?

[quote="Shok211"]
эммм.. ну я могу словами описать.. в друпале со стороны интерфейса это 4 пустых страницы, которые фоново выполняют функции. А со стороны программного кода - я частично привел в самой статье, а остальное покажу когда модуль будет готов для массового использования.
Если вы внимательно прочитаете статью, поймете что на текущий момент модуль подточен под конкретные сайты, и в дальнейшем будет дорабатываться, в.т.ч и UI для модуля. А статью писал для того чтобы получить советы и может быть помочь кому нибудь реализовать указанную реализацию.
Насчет первого релиза модуля для массового использования я сообщу позже.

Аватар пользователя ArmRus ArmRus 7 августа 2012 в 11:21

"PVasili" wrote:
Из коробки сложно будет сделать по любому, учитывая количество только официальных релизов. И у каждого свои особенности.
Лучше делать для этого что-то плагинибельное под разные конфигурации.

Вот про это я и говорю. Я пытаюсь создать расширяемый и гибко настраиваемый модуль для любых нужд, при том, чтобы можно было применить как на Ubercart-е так и на Commerce.

Аватар пользователя Orion76 Orion76 7 августа 2012 в 11:28

Наверное "красившее" было бы сделать его плагином к Feeds...
Тоже руки чешуться.. но пока таких задач не поступало-)

Аватар пользователя ArmRus ArmRus 7 августа 2012 в 11:58

"orion76" wrote:
Наверное "красившее" было бы сделать его плагином к Feeds...

честно скажу c Feeds не знаком. В дальнейшем рассмотрю как вариант. Спасибо.

Аватар пользователя kyky kyky 8 августа 2012 в 4:36

"xman0011" wrote:
Будем ждать. Может если все склеить получится что нибудь универсальное =)

Универсального решения не будет никогда.

"xman0011" wrote:
Но честно сказать везде рассказывали о том, что им удалось реализовать, но подробности никто не рассказывал.

Вот здесь я расписал свой вариант так подробно, что подробней некуда:
http://habrahabr.ru/post/139272/

Интеграция с 1С не стоит выеденного яйца.

1) Составляется запрос в 1С;
2) Запрос.Выполнить().Выгрузить() => имеем таблицу значений;
3) Таблица пишется в DBF;
4) DBF загружается php-скриптом в Друпал.
5) Ставим все дела на крон. Профит!

Этот же вариант можно реализовать на стороне php через COM-соединение. Что тут сложного?

Аватар пользователя ArmRus ArmRus 8 августа 2012 в 16:28

"kyky" wrote:
Вот здесь я расписал свой вариант так подробно, что подробней некуда:

Вы уверены что мы сейчас обсуждаем одну и ту же тему?
Я описываю процесс синхронизации с помощью модуля Выгрузка на веб сайт для 1С v8.x. Для настройки которой не требуется знание программирования на 1С на том уровне, который вы описываете. В моем случае 1С находится удаленно, и у меня нет доступа к нему + к тому у меня нет желания изучать 1С программирование. Обошелся тем что скинул ссылку на модуль и сказал чтобы настроили выгрузку на указанную мною ссылку. Вашу статью я читал, но если честно там больше информации для тех кто работает именно с 1С а не с Друпалом. А насчет крона - не думаю что оптимально запускать крон менее чем рас в 3-5 часов, а грузить создавать по 2 материала(node, product)для каждой позиции, если выгружается 5-10к товаров одним Запросом не есть хорошо. подтачивать под это хочтинг- он будет слишком дорогой, а как все известно сейчас редко кто из клиентов готов платить много, когда предлагают кучу вариантов по дешевле. Если захотите могу еще долго описывать разницу между моей и вашей темами...

"kyky" wrote:
Универсального решения не будет никогда.

Универсальность решения будет в том что можно будет настроить связь любого количества выгружаемых полей с полями товаров на сайте.

Аватар пользователя kyky kyky 9 августа 2012 в 2:59

"xman0011" wrote:
Вы уверены что мы сейчас обсуждаем одну и ту же тему?

Да, уверен.
Я считаю протокол обмена и формат Commerce ML редкостным идиотизмом. Разрабатывали их «мастера 1С», далекие от веба. Для простых сайтов описанный процесс подойдет, а для сложных нет. Это нисколько не умаляет ваших заслуг, но в промышленных масштабах вы с криками убежите от Commerce ML в сторону своего решения.

PS: не кажется ли вам, что было логичнее оформить код не как модуль, а как отдельный скрипт, например, drupal_1c.php? В коде определить основные функции, чтобы потом каждый смог просто подкорректировать логику загрузки и выгрузки под свои нужды?

Аватар пользователя ArmRus ArmRus 9 августа 2012 в 23:50

"kyky" wrote:
Я считаю протокол обмена и формат Commerce ML редкостным идиотизмом. Разрабатывали их «мастера 1С», далекие от веба. Для простых сайтов описанный процесс подойдет, а для сложных нет. Это нисколько не умаляет ваших заслуг, но в промышленных масштабах вы с криками убежите от Commerce ML в сторону своего решения.

На текущий момент задача стоит в том чтобы настроить сайт к синхронизации из "коробки" т.к. я уже отмечал

  1. у меня нет доступа к 1С(настраивает систему админ клиента)
  2. Даже если бы был доступ-у меня нет времени изучать его
  3. Нужен простой и быстрый способ
  4. Модуль для работы обычных инет магазинов, для проектов тех масштаба, которые вы описываете я пишу отдельный код, и при таких масштабах работаем совместно с хорошими программистами 1С.

"kyky" wrote:
не кажется ли вам, что было логичнее оформить код не как модуль, а как отдельный скрипт, например, drupal_1c.php

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

Аватар пользователя MasterDzen MasterDzen 10 августа 2012 в 8:21

Доброе утро!

у меня сложилась такая ситуация,
при синхронизации каталога (catalog.xml) и предложений товаров (offers.xml) в базах 1с и drupal
для товара выгружался на сайт список (специальная, диллерская,..) возможных цен (в файле offers.xml), это было хорошо.

как только я в режиме обмена данными 1с к выгрузке товаров добавил обмен заявками
(в 1с надо создавать соглашение с клиентом и там четко указывается одна цена..),
1с стала выгружать мне только одну цену на каждый товар..

стало интересно, нормально ли ето и как с этим бороться, а может надо что-то еще понастраивать..я про 1с

у вас на сайте каждому товару предлагается одна цена или со стороны 1с приходит много предложений?

Аватар пользователя kosilko kosilko 10 августа 2012 в 13:10

"xman0011" wrote:
Да. SimpleXML загружает весь файл. Т.к. у меня нет опыта работы с XML файлами, и в моем случае файлы не превышают 10-12М, с php_memory_limit 96M все работает идеально.

<?php
$reader 
= new XMLReader();
$reader->open($filename);
while (
$reader->read()) {
// погнали ...
}
$reader->close();
?>

проверено на больших файлах, и никаких сторонних скриптов

"xman0011" wrote:
В начале функции можно написать проверку HTTP аутентификации, для обеспечения безопасности, а логин и пароль установить в модуле выгрузки в 1С.
А куку 1С отправляет с каждым запросом, можно ставить проверку значения куки.

<?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();
?>

как-то так

"kyky" wrote:
Интеграция с 1С не стоит выеденного яйца.

1) Составляется запрос в 1С;
2) Запрос.Выполнить().Выгрузить() => имеем таблицу значений;
3) Таблица пишется в DBF;
4) DBF загружается php-скриптом в Друпал.
5) Ставим все дела на крон
. Профит!


это называется костыли. К костылям:) Ну вообще, профит, да. Быстро и сердито, чо.

"xman0011" wrote:
А насчет крона - не думаю что оптимально запускать крон менее чем рас в 3-5 часов, а грузить создавать по 2 материала(node, product)для каждой позиции, если выгружается 5-10к товаров одним Запросом не есть хорошо.

Можно использовать batch_set помимо крона. На тяжелый проект создание товаров по крону вешать гиблое дело, крон и так будет загружен поиковым реиндексом товаров как минимум. Крон нужно оставить, но малыми дозами по 10 - 100 нод например, а основной способ - друпаловским батчем с прогрессбаром.

"orion76" wrote:
Наверное "красившее" было бы сделать его плагином к Feeds...

интересная тема кстати

Аватар пользователя MasterDzen MasterDzen 10 августа 2012 в 14:10

«Можно использовать batch_set помимо крона. На тяжелый проект создание товаров по крону вешать гиблое дело, крон и так будет загружен поиковым реиндексом товаров как минимум. Крон нужно оставить, но малыми дозами по 10 - 100 нод например, а основной способ - друпаловским батчем с прогрессбаром.»

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

Аватар пользователя kosilko kosilko 10 августа 2012 в 14:24

"MasterDzen" wrote:
а выполнение батча запускать по тому же крону?

вручную или драшем. Плюс в том, что процесс визуально оформлен, и клиент видит что происходит. А когда по крону... Ну хз, дело вкуса. Но меня за время разработки под друпал задолбали диалоги, типа
- а почему статья в поиске не видна
- а вот крон надо запустить
- ааа.. а что такое крон?

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

Аватар пользователя Shok211 Shok211 10 августа 2012 в 14:25

Даже В php есть возможно запустить параллельно множество запрос без Bath "К примеру в framework'e для тестов на 7. Используется Curl" только стоит ли шкура выделки ?

Аватар пользователя Виктор Степаньков ака RxB Виктор Степаньк... 10 августа 2012 в 14:37

недофорки через curl это костыль.
Я запускаю импорт драшем, батч можно запускать драшем, батч так же запускается и из обычного hook_cron, но надо делать маленькие очереди

Аватар пользователя ArmRus ArmRus 13 августа 2012 в 12:56

А чем не нравится моя реализация? вроде не так уж все сложно, простая очередь, простая обработка данных...

Аватар пользователя ArmRus ArmRus 16 августа 2012 в 12:06

"Dimm" wrote:
Вот туя я делал: Загрузка товаров в Commerce из 1C
http://www.drupal.ru/node/79777[/quote]
Да я читал. Но есть пару вопросов
1. Автоматизация процесса - полное исключение вмешательства человека в процесс обновления.
2. Обратная выгрузка заказов в 1С с сайта
3. Ноды-описания привязываются к нодам-ценам вручную. (Из 1с потом обновляются автоматически.) - честно скажу пир объеме более 300 товаров это начнет надоедать, а если как вы указали 10к - сдохнуть можно Почему не автоматизировать процесс?