Интеграция SAP и 1С8









Интеграция SAP и 1С8 может быть осуществлена через многочисленные технологии, предлагаемые SAP. Но все они в конечном счете делятся на две группы:
1) обращение из SAP к 1С
2) обращение 1С к SAP
Я расскажу о каждой из этих групп.

Обращение из SAP к 1С.

К этой группе следует отнести непосредственное подключение из SAP к базе 1С, расположенной на SQL сервере. Я нашел единственно простое решение — непосредственно на сервере SAP работать с наполнением базы 1С минуя всяких посредников (включая платформу 1С). Вот пример загрузки справочника "Банки" из 1С в таблицу базы данных SAP:

REPORT  YTURE2.

"открываем соединение
EXEC SQL.
CONNECT TO 'NSI' AS 'V'
ENDEXEC.

IF sy-subrc = 0.
"ставим текущее соединение
EXEC SQL.
SET CONNECTION 'V'
ENDEXEC.

TABLES YBANK.
"объявляем запись, которая будет принимать значения из курсора
data: line like YBANK,
bank like YBANK.

"открываем курсор
EXEC SQL.
OPEN dbcur FOR SELECT
t.ссылка,
t.версия,
t.ПометкаУдаления,
t.код,
t.Наименование,
t.ГоловнойБанк,
t.КоррСчет
FROM RБанкиID as t
ENDEXEC.


DO.
"извлекаем из курсора очередной набор
EXEC SQL.
FETCH NEXT dbcur INTO :line
ENDEXEC.

"убеждаемся, что получили из курсора данные
IF sy-subrc <> 0.
EXIT.
ELSE.
"найдем банк
select SINGLE * into bank from YBANK where ref = line-ref.
if sy-SUBRC = 0 and bank-VER = line-ver.
CONTINUE. "пропускаем, т.к. не изменилось
elseif sy-SUBRC = 0.
UPDATE YBANK from LINE. "обновляем
else.
INSERT YBANK from LINE. "добавляем
endif.

"просто печатаем полученные данные
select SINGLE * into bank from YBANK where ref = line-ref.
if sy-SUBRC = 0.
WRITE: / BANK-ref, BANK-ver, BANK-mark, BANK-code, BANK-DESCR, BANK-MAJOR_BANK, BANK-COR_ACCOUNT.
ENDIF.

ENDIF.
ENDDO.

"закрываем курсор
EXEC SQL.
CLOSE dbcur
ENDEXEC.

"закрываем соединение
EXEC SQL.
DISCONNECT 'V'
ENDEXEC.
ENDIF.

В комментариях я отметил основные моменты (кто-то приятно ужаснется, впервые увидев этот процедурный язык). Не печальтесь, если что-то останется непонятно сразу. Здесь просто имитация работы с курсором sql. Код отдаленно напомнит Вам все, с чем Вы когда-то сталкивались и t-sql, и foxpro, и дельфи. Это просто букет воспоминаний.

Чтобы на SQL сервере было возможно так легко разобраться с наполнением бызы (запрос в тексте весьма недвусмысленно говорит о простоте), Вам понадобится создать представления к таблицам 1С (это отдельная тема, она есть и среди моих публикаций). Имея некий курсор, Вы можете прочитать последовательно весь справочник 1С, обрабатывая на каждом шаге его элементы. Я не стал приводить сложной реализации с делением на фрагменты обмена и ограничился линейным перебором с проверкой версии элемента справочника 1С перед загрузкой.

Самих настроек подключения Вы не видите, потому что они собраны в отдельном месте. Оно называется DBCO. Это имя некого мастера или формы, которые принято называть транзакцией. Не удивляйтесь искажению терминологии, т.к. SAP имеет глубокие исторические корни, и в каждый поворотный момент истории нужно было принимать решения о выборе пути и названий (SAP вообще редко везло с выбором). Ниже скрин настройки:

 

Здесь следует обратить внимание на тип подключаемой базы (DBMS) и строку соединения. Из-за путаницы терминов и подходов со строкой соединения с первого раза справляются не многие. Обратите внимание, что инстанс (экземпляр) сервера SQL указан через обратный слеш, а не тире. Проверить проблемы соединения можно в транзакции ST22, где будет детально описаны все проблемы (увы, здесь не всплывает окно сообщений, как в 1С). Файл библиотеки dbmssslib.dll можно скачать с маркета (http://scn.sap.com/thread/1345635) или извлечь из архива (пач ядра, для MSSQL). Архив с расширением sar или car можно открыть программой SAPCAR.EXE с параметрами -xvf После извлечения нужной библиотеки, ее можно просто скопировать по пути, указанном в ST22.

Я не нашел другого более простого и быстро реализуемого способа. Но из SAP можно работать и с веб-сервисами 1С. На первом итапе перед Вами будет стоять "дикая" потребность быстрого обмена, а веб-сервисы вообще не обеспечат требуемую скорость.

Обращение 1С к SAP.

Этот раздел сложен скорее своим многообразием выбора. Перед Вами и прямое обращение к базе данных SAP (как мы это сделали с 1С), и шина SAP PI (интеграционная шина), и Web AS (собственный web-сервер), и пр. Выбор велик, а времени во всем этом разбираться нет. По правде говоря, обидно будет затратить усилия и разочароваться в результате.

Давайте проведем аналогию с 1С. 1С умеет выгружать файлики и загружать их. SAP не может не уметь делать так же. Но разве это современно? 1С умеет отправлять почтовые сообщения, SAP и здесь не отстает. Но разве это быстро? 1С умеет работать с web-сервисами! О да! А как же SAP? 

SAP предлагает что-то большое и с первого взгляда невразумительно в теме web-сервисов. Когда Вы затратите свое дорогое время, внимательно и осторожно изучите этот вопрос, то вместе с чувством огромной проделанной работы и сорванных сроков в вашей душе поселится разочарование. Впрочем, если Вы сеньор программист с/с++/java и набрались в жизни много знаний о популярных и современных технологиях, то сможете рассуждать за одним столом с консультантами SAP о программировании, культуре бизнеса, политике и, конечно, симпатичных девушках. 

В основе всех известных мне сегодня технологиях доступа из 1С к SAP лежит абревиатура RFC. RFC — это удаленный вызов функций. Это чем-то напоминает web-сервисы 1С, только нет посредника и клиент непосредственно вызывает функциональные модули. Это работает непосредственно через сокеты (3300 tcp порт на сервере). Формат обмена спрятан в коммерческой библиотеке, которая предлагает API-интерфейс (смотрите детали в SDK RFC). Реализация предложена на языке C. Взгляните на простой пример. 

Это строка соединения:

Это подключение:

Это вызов удаленной функции по имени:

И закрываем соединение:

Просто и понятно, если Вы ежедневно пишете программы на с/с++. А если нет? Для таких случаев открывается целый спектор готовых решений, который я немного и упомянул выше. В первую очередь опытные консультанты обступят Вас вокруг с уже готовыми ценами за услуги. Смутное чувство нереальности происходящего не оставит Вас, пока они не уйдут. Но с их уходом останется только пустота (станное чувство, которое не возникает после разговора со специалистами). Нет, у Вас, конечно, останется понимание о размере счетов, которые нужно оплатить, но вот с пониманием и знанием следующих направлений развития все плачевно (помните продавцов в магазине?)

Я скажу Вам прямо без утайки. Если Вы овладеете RFC, то весь довесок или букет интеграционных решений станет Вам не нужен. Взгляните на простой алгоритм вызова из 1С удаленной функции SAP:

&НаКлиенте
Процедура ПриОткрытии(Отказ)
res=ПодключитьВнешнююКомпоненту("C:UsersetyurinDocumentsVisual Studio 2013ProjectsCPPsap-rfcReleasesap-rfc.dll", "VK", ТипВнешнейКомпоненты.Native);
ДемоКомп = Новый("AddIn.VK.SapRfc");
ДемоКомп.СтрокаСоединения="TYPE=3 CLIENT=1 USER=***** PASSWD=**** LANG=E ASHOST=***** SYSNR=00 USE_SAPGUI=0";
Если не ДемоКомп.УстановитьСоединение() тогда
Сообщить(ДемоКомп.ПоследняяОшибка());
иначе
ДемоКомп.ИмяФункции="YTURE_FM";

Строка1="WERRwqedqwdeqwd 1123123 ывапыРОРОР";
ДемоКомп.ДобавитьПараметр("exporting","REQUTEXT","TYPC",Строка1,СтрДлина(Строка1));
ДемоКомп.ДобавитьПараметр("importing","ECHOTEXT","TYPC","",1024);
ДемоКомп.ДобавитьПараметр("importing","RESPTEXT","TYPC","",1024);

//ДемоКомп.УдалитьПараметр("ECHOTEXT");
//ДемоКомп.ДобавитьПараметр("importing","ECHOTEXT","TYPC","",1024);
//res=ДемоКомп.КоличествоПараметров("importing");

Если не ДемоКомп.Вызвать() тогда
Сообщить(ДемоКомп.ПоследняяОшибка());
Иначе
res1=ДемоКомп.ПолучитьПараметр("ECHOTEXT");
res2=ДемоКомп.ПолучитьПараметр("RESPTEXT");
ДемоКомп.ОчиститьВсеПараметры();
КонецЕсли;
ДемоКомп.ЗакрытьСоединение();
КонецЕсли;

КонецПроцедуры

Удаленная функция представляет из себя функциональный модуль (в примере это YTURE_FM). Функция принимает один строковый параметр с именем REQUTEXT и возвращает два строковых параметра ECHOTEXT и RESPTEXT (это как передать в функцию три параметра, два из которых она изменит).

Функциональный модуль можно создать в транзакции SE37. Обратите внимание на отметку удаленного вызова:

 Входящие параметры:

Возвращаемые параметры:

А вот и обработка на сервере SAP переданных параметров:

Здесь в коде нет заморочек. Это просто ЭХО, т.е. возвращается то, что передали (параметр с именем RESPTEXT дополнительно заполняется сведениями о подключении).

Имея возможность подключиться из 1С непосредственно к серверу SAP, минуя многочисленных посредников, Вы бережете время и получаете максимальную скорость. Чтобы описание не выглядело голословно, я приложил релиз компоненты для 1С. Однако надеюсь, что я убедил Вас в правильности использовать и изучать сразу RFC и не разбрасывать своё время и усилия на зоопарк вокруг интеграции. В конечном счете Вы сбережете и фонд оплаты труда, т.к. зверинец весьма прожорлив.  

18 Comments

  1. aspirator23

    Тоже использовал RFC. Правда сами функции писали программисты sap. Только согласовывал с ними передаваемые параметры.

    Reply
  2. Prometeus2011

    Тема, несомненно, интересная. Однако, SAP достаточно редкая птица на российских просторах учетных систем. Думаю, если-бы были задачи, то нашлись-бы и исполнители. Я, например. И ВК написать для обмена — не сильно большая проблема, в общем-то. Но в целях самопознания это мутить — полный эксгибиционизм. Короче, нужна конкретная задача.

    Reply
  3. comol

    Как-то всё-таки не православно забить на XI/PI и «пилить» интеграцию «дедовским способом»….

    Reply
  4. ture

    (3) comol, в начале внедрения остро стоит вопрос перемещения большого количества данных в SAP (поэтому прямое обращение к вьюхам 1С). А вот безнаказанно ходить к данным в сап как в 1С еще нельзя (поэтому rfc). Прочие интеграционные продукты (к примеру, которые Вы упомянули) работают через rfc, но вводят дополнительное звено — продукт написанный на java. Пока остро стоит потребность в движение большого количества информации, java будет слабым звеном (очень медленно и много ресурсов отнимает).

    Reply
  5. Makushimo

    а мне понравился настрой автора.

    ничего не понятно, конечно с наскоку, но настроение как ни странно не испортилось )))

    плюсую

    Reply
  6. maksip

    Мне кажется не совсем уместным данными из таблиц БД 1с делать напрямую загрузку в БД SAP и наоборот. При обновлении платформы 1с может измениться структура хранения таблиц. И если со справочником банков это ещё и может пройдет, то с регистрами или даже документами возможно вся загрузка возможно сломается. Плюс ко всему нет возможности использовать бизнес логику 1с,а она при обновлении конфигурации также может меняться. К тому же встает вопрос о блокировках, как себя поведет сервер БД и сервер приложений 1с при одновременном использовании таблиц и 1с и обработкой БД.

    Reply
  7. ture

    (6) maksip,

    При обновлении платформы 1с может измениться структура хранения таблиц.

    так и будет, если удалять реквизиты, к примеру.

    Плюс ко всему нет возможности использовать бизнес логику 1с

    и это верно(что меня радует однозначно)

    К тому же встает вопрос о блокировках

    еще как может встать.

    Вьюхи переделываем после обновлений конфигурации, сломанные загрузки чиним (иногда даже заранее), логика 1С не пашет и «владельцы» базы ноят, что их не спросили, а им хотелось бы подмазаться, ну и конечно блокировок нет, потому что грязное чтение во вьюхах (это как грязные танцы). Загрузка периодическая (10 мин), т..е. данные выправляются по версии (можно добавлять задержку в 1-2 мин, чтоб танцев не было, но так уже не зажигает).

    Reply
  8. maksip

    (7) ture, (7) ture, Тогда согласен. В этом случае решение вполне подходит

    Reply
  9. Трактор

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

    Reply
  10. ture
    Reply
  11. ture
    Reply
  12. ture

    Чтение логических и физических файлов:

    *&———————————————————————*
    *& Report  Z_LOGIC_FILE_SERVER_ETURIN
    *&
    *&———————————————————————*
    *&
    *&
    *&———————————————————————*
    REPORT z_logic_file_server_eturin.
    
    PARAMETERS p_lfile TYPE fileintern OBLIGATORY.
    PARAMETERS p_write AS CHECKBOX.
    
    START-OF-SELECTION.
    DATA: l_file_name TYPE text100.
    CALL FUNCTION ‘FILE_GET_NAME’
    EXPORTING
    *     CLIENT           = SY-MANDT
    logical_filename = p_lfile
    *     OPERATING_SYSTEM = SY-OPSYS
    parameter_1      = ‘PARAM1’
    parameter_2      = ‘PARAM2’
    parameter_3      = ‘PARAM3’
    *     USE_PRESENTATION_SERVER       = ‘ ‘
    *     WITH_FILE_EXTENSION           = ‘ ‘
    *     USE_BUFFER       = ‘ ‘
    *     ELEMINATE_BLANKS = ‘X’
    *     INCLUDING_DIR    = ‘ ‘
    IMPORTING
    *     EMERGENCY_FLAG   =
    *     FILE_FORMAT      =
    file_name        = l_file_name
    * EXCEPTIONS
    *     FILE_NOT_FOUND   = 1
    *     OTHERS           = 2
    .
    IF sy-subrc <> 0.
    * Implement suitable error handling here
    ENDIF.
    
    TRY.
    DATA: l_line    TYPE text100,
    l_endfile TYPE abap_bool.
    IF p_write = abap_on.
    OPEN DATASET l_file_name FOR OUTPUT IN TEXT MODE ENCODING UTF-8.
    
    DO 3 TIMES.
    TRANSFER l_file_name TO l_file_name.
    ENDDO.
    ELSE.
    OPEN DATASET l_file_name FOR INPUT IN TEXT MODE ENCODING UTF-8.
    GET DATASET l_file_name ATTRIBUTES DATA(l_attr).
    WHILE l_endfile = abap_off.
    READ DATASET l_file_name INTO l_line.
    WRITE : / l_line.
    IF sy-subrc NE 0.
    l_endfile = abap_on.
    
    ENDIF.
    ENDWHILE.
    ENDIF.
    
    CLOSE DATASET l_file_name.
    CATCH cx_sy_file_access_error INTO DATA(lo_ex).
    WRITE: / lo_ex->get_text( ).
    
    ENDTRY.

    Показать

    Reply
  13. user642695_crocus.vladikina

    Sap можно поставить дома

    Reply
  14. user642695_crocus.vladikina

    xsd — обмен с Sap возможен ?

    Reply
  15. ture
    Reply
  16. user642695_crocus.vladikina

    (15) там работают структуры, что из одного офиса идет передача информации в другой. такая сложная техника. а защиты от внутренней команды нет. В штатах есть, в наших структурах беззаконие. если вы высунетесь в сапах, то могут ограничить вас в ваших правах и чтобы сделать замечание кому-то — очень опасно. у меня были большие издержки, и я работала когда в офисе, стали общаться так : «молчите , а то загремите в тюрьму» и все 20 программистов каждый повторял , что надо говорить правильно. Это как бы ясно ? Если Вы порядочный человек — Вы им будете не нужны

    Люди нарушают законодательство, а техники если у Вас нет- очки с камерой или зубная паста с жучками — могут лишить работы/квартиры

    Reply
  17. VmvLer

    (15) Вам бы выступить на конференции Инфостара и расставить все точки над «i».

    Причем, все остальные выступления можно взять и отменить, ибо зачем

    переливать из пустого в порожнее и раздувать мифы о могуществе 1С.

    Жаль, что вам не дадут выступить да и вряд ли вы согласитесь, ибо зачем

    переливать из пустого в порожнее и раздувать мифы о могуществе SAP.

    Reply
  18. user642695_crocus.vladikina

    онипо-моему гарантию дают с возвратом денег….

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *