Мой опыт небольшого проекта с веб-сервисами (Часть 1)

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

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

Что нам необходимо:

1. Веб- сервер (я выбрал Apache 2.4)

2. Написать веб-сервис в конфигурации 1С (у меня это Бухгалтерия 2.0). Опубликовать базу на веб-сервере.

3. Любой язык для веб-разработки, так как конечный результат это страничка, которая будет отрываться в браузере. (у меня это PHP);

Наверно все, еще если делать это впервые, немного терпения.

Про установку Apache +PHP+1C, очень популярная тема для обсуждения (даже на этом ресурсе их дюжина)  в плане установки, каждый уважающий себя ит-шник , может начать кивать со знанием дела, услышав про установку Apache и 1С, и конечно же имел опыт публикации базы. Указанным мною дистрибутивам лет по 10, но они ничем принципиально не отличаются от более свежих, в рамках поставленной задачи

Устанавливаем веб-сервер, после установки для регистрации компоненты 1С на веб сервере в файле httpd.conf  из папки conf веб-сервера прописываем строку вида

LoadModule _1cws_module "C:/Program Files (x86)/1cv8/8.3.11.3034/bin/wsap24.dll"

в строке указывается путь к библиотеке 1С установленной текущей версии платформы. Запускаем веб-сервер.

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

Создаем новый веб-сервис, в модуле пишем основную функцию, например

Функция DocObmen(SubName, offset, limit)

Код = "%"+SubName+"%";

InTheEnd =  offset+limit-1;


ТипXDTOИнвойс = ФабрикаXDTO.Тип("http://www.sample-package.org", "Инвойс");
XDTOИнвойс = ФабрикаXDTO.Создать(ТипXDTOИнвойс);

Запрос = Новый Запрос;
тхт = "ВЫБРАТЬ
| Поступление.Номер КАК Номер,
| Поступление.СуммаДокумента КАК Сумма,
| Поступление.Контрагент.Наименование КАК Контрагент,
| Поступление.Дата КАК Дата,
| ""Поступление"" КАК Вид,
| Поступление.ДатаВходящегоДокумента КАК ДатаВх,
| Поступление.НомерВходящегоДокумента КАК НомерВх
|Поместить Таб
|ИЗ
| Документ.ПоступлениеТоваровУслуг КАК Поступление
|ГДЕ
| Поступление.Контрагент.Наименование ПОДОБНО &Код
|ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ
| Оплата.Номер,
| Оплата.СуммаДокумента,
| Оплата.Контрагент.Наименование,
| Оплата.Дата,
| ""Оплата"",
| Оплата.ДатаВходящегоДокумента,
| Оплата.НомерВходящегоДокумента
|ИЗ
| Документ.СписаниеСРасчетногоСчета КАК Оплата
|ГДЕ
| Оплата.Контрагент.Наименование ПОДОБНО &Код
|Индексировать ПО
| Номер
| ,Дата
|;";


Если (limit>0) Тогда
тхт = тхт + "
|Выбрать *
|Из
| (Выбрать  top "+limit +" *
|  Из (ВЫБРАТЬ top "+InTheEnd +" *
|    ИЗ Таб
|    УПОРЯДОЧИТЬ ПО Дата desc
|   ) КАК Таб_desc
|     УПОРЯДОЧИТЬ ПО Дата asc
| ) КАК Таб_asc
|УПОРЯДОЧИТЬ ПО Дата desc
|";
Иначе
тхт = тхт +
"Выбрать *
|ИЗ Таб";
КонецЕсли;

Запрос.Текст = тхт;

Запрос.УстановитьПараметр("Код", Код);
Выборка = Запрос.Выполнить().Выбрать();

ТипXDTOДокумент = ФабрикаXDTO.Тип("http://www.sample-package.org", "Документ");

Пока Выборка.Следующий() Цикл

XDTOПозиции = ФабрикаXDTO.Создать(ТипXDTOДокумент);
ЗаполнитьЗначенияСвойств(XDTOПозиции, Выборка);

XDTOИнвойс.Приход.Добавить(XDTOПозиции);

КонецЦикла;

Возврат XDTOИнвойс;

КонецФункции

Сразу оговорюсь, думаю не сложно догадаться зачем мне нужен лимит строк и позиция последней выведенной, на странице клиента установлен лимит выводимых строк, subname —  это часть наименования контрагента.

Так как функция возвращает данные в виде набора данных, нужно добавить описание пакета. который будет передан браузеру, в 1С это xdto, то есть схема xml,

Далее, все сохраняем, и публикуем на веб-сервере. Кстати, после публикации 1С все равно потребует пользователя для базы 1С, так что пользователя типа ObmenWeb  с соответствующими правами создать придется.

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

33 Comments

  1. pallid

    А почему web а не http сервис? Это же приводит к тому что при изменении параметров или операций в сервисе приходится делать изменения и в клиентской части

    Reply
  2. alex_bitti

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

    Reply
  3. dsdred

    (2)

    http сервисы появились относительно недавно

    4 года назад это

    относительно недавно

    ?

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

    Никаких вопросов там не возникнет.

    А вообще тут и OData может сгодится, хотя…

    Reply
  4. pallid

    (3) OData монструозен ))) хотя как единственный выход в некоторых случаях

    Reply
  5. pallid

    Одна из опасностей OData — это невозможность контролировать генерируемый объем возвращаемой информации, нельзя установить максимальное количество. И если в базе данных много и кто-то решил забрать разом все, это может повлиять на работу…всех ))))

    Reply
  6. alex_bitti

    (5) стойте, odata вообще мимо, задача не как-то, а нормально по человечески сделать, да через апач, да на пыхе, но это нормальные теххнологии масштабируемые, odata это боль, причем ребята не 1С-ники «не поймут» выбор, если захотят участвовать в разработке клиента))

    что имелось ввиду под «вопросами» по http -сервису, как бы вопрос немного раньше чем нужно, потому что речь про самопального веб-клиента пойдет во второй части, но почему мне предложенный способ больше нравится, я ставлю отдельный веб сервер и далаю на нем сайт, сайт посылает запрос получает ответ парсит его выдает результат на страницу, в случае с http-сервисом, ответ передается уже распаренный, получается 1С получает дополнительную нагрузку по ресурсу к серверу 1С на обработку, результата, правильно я понял? роль веб-сервера выполняет сам сервер 1С, ну вы понимаете к чему это я?

    Reply
  7. pallid

    (6)

    ответ передается уже распаренный

    вот тут не понятно, в смысле уже готовая страница?

    при использовании http сервиса можно в принцепи и отдавать уже страницу, но обычно отдают xml или json

    принцип почти тот же что и с web-сервисом и даже больше, только в случаи с web клиент завязан на soap

    Reply
  8. dsdred

    (5)

    Одна из опасностей OData — это невозможность контролировать генерируемый объем возвращаемой информации, нельзя установить максимальное количество. И если в базе данных много и кто-то решил забрать разом все, это может повлиять на работу…всех ))))

    Порционно то кто запрещает выборку делать?

    $count чтобы узнать количество записей. А далее $top и $skip

    17.2.1.5.3. $top

    Имеется возможность ограничить количество записей, возвращаемых при обращении к ресурсу. Для этого используется параметр $top.

    17.2.1.5.5. $skip

    Позволяет исключить из результата запроса первые несколько записей. Если параметры $top и $skip указываются одновременно, то параметр $skip будет применен раньше, чем параметр $top. Приоритет применения параметров не зависит от порядка их указания в теле запроса.

    Reply
  9. dsdred

    (6)

    в случае с http-сервисом, ответ передается уже распаренный, получается 1С получает дополнительную нагрузку по ресурсу к серверу 1С на обработку, результата, правильно я понял? роль веб-сервера выполняет сам сервер 1С, ну вы понимаете к чему это я?

    Вообще то у веб-сервисов и http-сервисов результат может быть одинаковый, только http-сервисы менее ресурсо-прожорливые.

    вот кстати из недавних обсуждений https://forum.infostart.ru/forum34/topic188597/

    Reply
  10. alex_bitti

    (7)

    при использовании http сервиса можно в принцепи и отдавать уже страницу, но обычно отдают xml или json

    то есть html еще писать в 1С?

    чем Вам не угодил SOAP?

    я не утверждаю, а рассуждаю так, я 1С-ник, у меня в базе есть данные, я сделал «розетку», накидал «снаружи» скелет страницы, сайта, как угодно . Отдал вебщикам, которые никогда не согласятся смотреть, а тем более писать в 1С, они там снаружи пусть крутят как хотят, от 1С нужен только общеупотребимый протокол, все.

    приводит к тому что при изменении параметров или операций в сервисе приходится делать изменения и в клиентской части

    У меня как раз наоборот. Изменять сервис мне не захочется, как раз пока вебщики не придумают чего нибудь еще,

    Reply
  11. alex_bitti

    (9) http-сервис выдает «более готовый» результат, увеличивая нагрузку на 1С-сервер, ну это логично если где-то мы сокращаем потребление ресурса, где-то его увеличиваем, закон сохранения. Может для мобильного приложения это актуально и то вопрос? Если делать движок под мобилу, все равно что возвращает сервис, мне кажется http-сервис еще одна избыточная технология интегрированная в 1С, пока еще точно не определили зачем

    Reply
  12. pallid

    (8)

    Порционно то кто запрещает выборку делать?

    я про то что никто не запрещает клиенту все сразу забрать — это опасность

    Reply
  13. pallid

    (10)

    чем Вам не угодил SOAP?

    привязкой к xml, связанность клиента и сервиса

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

    Reply
  14. neikist

    (11) в каком смысле «более готовый» результат? Как раз с веб сервисами работа с xml и xdto как отображением xml ресурсы поедает, а в http можно работать с чистыми ЗаписьXML, ЗаписьJSON, да хоть csv передать.

    Хотя в итоге узким местом все равно скорее всего работа с БД будет, а не soap.

    Reply
  15. alex_bitti

    (14) еще раз, задача стоит сделать не что-то, а так как будет максимально правильно, я не спорю что http-сервис может выдавать готовую страницу, но ни один вебщик не полезет в 1С, и ни один 1С ник не полезет в веб, правильно? Из того что вы предложили это даже не полуфабрикат, не хочу хейтить но файл xml- это не то, txt тоже не то, задача сделать коннектор. SOAP отлично для этого подходит, я могу заказать сайт хоть у индусов передав им только параметры, с вашим вариантом мне как предлагать индусам писать в 1С, или сказать что у меня есть xml, и надо мной будут смеяться все миллионеры из трущоб

    Reply
  16. neikist

    (15) вообще то SOAP — это тоже вполне себе xml, причем в 1с еще и не сказать что по стандарту сделанный, сталкивались мы с проблемами на этой почве, да, было дело.

    Ну и никто не предлагает отдавать верстку и подобное из 1с, сейчас в тренде (и я понимаю почему) RestAPI отдающий JSON. Он гораздо проще и приятнее для потребителя API чем SOAP. В пределе можно вообще graphQL запилить, пусть и с некоторыми ограничениями, и отдать разрабам сторонней системы, тогда даже в некоторых случаях правки на стороне 1с при изменении потребностей пользователей не потребуются.

    Reply
  17. pallid

    (15)

    (16)

    причем в 1с еще и не сказать что по стандарту сделанный, сталкивались мы с проблемами на этой почве, да, было дело.

    Было, было

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

    Reply
  18. pallid

    (15)

    я не спорю что http-сервис может выдавать готовую страницу

    может, но такое ниразу не приходилось реализовывать

    отдаем json, морда на реакте, профит

    Reply
  19. alex_bitti

    (17) есть же SoapUI, тестится все отлично, аж интересно в чем беда?

    Reply
  20. alex_bitti

    (18) я Вас понял, просто не любите xml))

    Reply
  21. pallid

    (19) детали не помню, но что-то было с xdto пакетом, точнее что-то со свойством было

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

    Reply
  22. alex_bitti

    (21) единственное что там может вызвать проблему это пространство имен, конечно на симплах все работает, пока не переключишь на стандарт какой нибудь формализованный

    Reply
  23. dsdred

    (12)

    я про то что никто не запрещает клиенту все сразу забрать — это опасность

    Согласен. С любым инструментом нужно разумно работать. Как говорится раз в жизни и палка стреляет ))

    Я исходил из запроса статьи. Там по сути простейшая выборка двух типов документов… причем ни пометка на удаления не проверяется, ни провенность… Да и документы по наименованию контрагента выбираются… Без периода выборки. И в запросе «top», а не «Первые», но это уже просто признаки плохого тона (Встречал как то обработки где на трех языках написано было, «очень читабельно»).

    Видно, что руку еще набивают.

    Я так понимаю в конторе небольшой документооборот просто. Но убей не приложу почему именно Веб-сервисы?

    Reply
  24. neikist

    (19) лично у нас была проблема с тем что 1с не умеет в soap header, причем как на запрос к 1с, так и при вызове из 1с системы которая это поддерживает. Плюс иногда бывает что обе системы имеют ограничения по возможности описания формата в wsdl, и при несовпадении таких возможностей тоже начинаются проблемы.

    Reply
  25. pallid

    (20) Люблю

    (20)

    просто не любите xml))

    я такого не говорил ))) просто чем хорош soap — так это валидация на основе xdto (сильная связанность). а в решении нет необходимости в такой опции.

    тем более на дворе 2018 год, IoT и прочий хайп ))) там точно никакого soap

    Reply
  26. dsdred

    (11) Что такое «более готовый» результат?

    Я понимаю Ваши ответы так: «Не читал, но презираю».

    Вы же честно написали в самом начале:

    если честно не пробовал их использовать

    ни один вебщик не полезет в 1С

    Я последнии полтора года очень плотно работаю с Веб программистом в крупной компании с большим документооборотом (там и производство и несколько розничных сетей и франшиза), он мне сам сказал отдавай мне JSON. За полтора года мы с ним хренову гору проектов сделали, при этом 65% данных он забирает по OData (с моей стороны только дать доступ к нужным ему объектам и нарисовать сам запрос), а остальные 35% я делаю ему http-сервисы (POST) и он подает некие параметры и получает JSON. Он доволен как «удав». Есть у нас и обратная взаимосвязь, он передает некие параметры и формирует через написанные мной http-сервисы некие объекты.

    Reply
  27. alex_bitti

    (26) у нас в организации нет веб- программистов, веб разработка заказывается, иногда даже не в нашей стране, потому что не все наши спецы по веб делают вещи, ваш ответ можно понимать «я знаю потому что спец», я читал изучал пробовал, но в серьезных проектах не считаю данную технологию применимой, odata это прозор, даже не о ней сейчас. мне почему то кажется я старше вас и с 2002 года занимаюсь 1С, с 1997 работаю программистом не надо искать в том что я пишу второй смысл

    Reply
  28. dsdred

    (27)

    у нас в организации нет веб- программистов, веб разработка заказывается, иногда даже не в нашей стране, потому что не все наши спецы по веб делают вещи, ваш ответ можно понимать «я знаю потому что спец», я читал изучал пробовал, но в серьезных проектах не считаю данную технологию применимой, odata это прозор, даже не о ней сейчас. мне почему то кажется я старше вас и с 2002 года занимаюсь 1С, с 1997 работаю программистом не надо искать в том что я пишу второй смысл

    Во первых я не хотел никого обидеть и не хотел чтобы мои ответы были восприняты так как Вы их восприняли.

    Я лишь так и не смог понять Ваш ответ который Вы повторяли как мантру — «Более готовый».

    И так как Вы часто говорили, что веб программисты не должны программировать в 1с в ответ на предложение использовать http-сервисы, я описал ситуацию с текущего места работы. Конкретно написал, что веб программист сам попросил http-сервисы+JSON. При этом я не сомневаюсь в его квалификации, так как он пишет как для нашего, так и для зарубежного рынка.

    Во вторых, мы с Вами работаем не охранниками, не грузчиками и т.д, поэтому не важно с какого года мы в 1С. Наши знания частично устаревают, а получение новых знаний зависит только от нас самих. Да я не сразу пошел в программисты 1С, до этого был администратором систем в банке. Да я не программировал на 6 и 7.7, а только забирал данные с 7.7. Да я в 1С с 2012. Но если посмотреть с какой периодичностью платформа выходила до версии 8.3, ясно что до 2014 развитие платформы можно назвать «тихим периодом».

    П.С. Беседа уже пошла не в продуктивные и никому не нужные русла.

    Reply
  29. s_vidyakin

    (12) Можно минимальную прокладку сделать между клиентом и одатой, чисто для базового контроля

    Reply
  30. pallid

    (29) через Odata?

    Reply
  31. s_vidyakin

    (30) пользователь не напрямую обращается к одате а к отдельному http-сервису, передавая те же параметры, а сервис проверяет их и уже сам вызывает одату и отдает что получил

    Reply
  32. pallid

    (31) обращается к самому же себе только не напрямую в базу а по OData? Зачем?

    Reply
  33. s_vidyakin

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

    То что к самому себе — какая разница, есть ведь обработки для тестирования http-сервисов, они тоже к той же базе делают запросы

    Reply

Leave a Comment

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