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

Обмен - Интеграция с WEB

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

Эта публикация написана мною, чтобы поделиться решением небольшой, но популярной задачи и, надеюсь, будет полезна определенному кругу читателей. Итак, сначала постановка задачи, необходимо обеспечить новому сотруднику доступ к данным из бухгалтерской базы, в частности это оплаты. Сотрудник при этом не бухгалтер и не работает в 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 части.

4

См. также

Комментарии
Сортировка: Древо
1. pallid 183 08.08.18 13:45 Сейчас в теме
А почему web а не http сервис? Это же приводит к тому что при изменении параметров или операций в сервисе приходится делать изменения и в клиентской части
2. alex_bitti 58 08.08.18 14:36 Сейчас в теме
потому что http сервисы появились относительно недавно, и с целью интеграции мобильных приложений, насколько мне известно, если честно не пробовал их использовать, но что то мне подсказывает что плане времени обработки запроса там могут возникнуть вопросы, а может и нет
3. dsdred 470 08.08.18 14:55 Сейчас в теме
(2)
http сервисы появились относительно недавно

4 года назад это
относительно недавно
?

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

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

А вообще тут и OData может сгодится, хотя...
4. pallid 183 08.08.18 15:36 Сейчас в теме
(3) OData монструозен ))) хотя как единственный выход в некоторых случаях
5. pallid 183 08.08.18 15:53 Сейчас в теме
Одна из опасностей OData - это невозможность контролировать генерируемый объем возвращаемой информации, нельзя установить максимальное количество. И если в базе данных много и кто-то решил забрать разом все, это может повлиять на работу...всех ))))
6. alex_bitti 58 08.08.18 16:42 Сейчас в теме
(5) стойте, odata вообще мимо, задача не как-то, а нормально по человечески сделать, да через апач, да на пыхе, но это нормальные теххнологии масштабируемые, odata это боль, причем ребята не 1С-ники "не поймут" выбор, если захотят участвовать в разработке клиента))

что имелось ввиду под "вопросами" по http -сервису, как бы вопрос немного раньше чем нужно, потому что речь про самопального веб-клиента пойдет во второй части, но почему мне предложенный способ больше нравится, я ставлю отдельный веб сервер и далаю на нем сайт, сайт посылает запрос получает ответ парсит его выдает результат на страницу, в случае с http-сервисом, ответ передается уже распаренный, получается 1С получает дополнительную нагрузку по ресурсу к серверу 1С на обработку, результата, правильно я понял? роль веб-сервера выполняет сам сервер 1С, ну вы понимаете к чему это я?
7. pallid 183 08.08.18 18:31 Сейчас в теме
(6)
ответ передается уже распаренный


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

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

принцип почти тот же что и с web-сервисом и даже больше, только в случаи с web клиент завязан на soap
10. alex_bitti 58 09.08.18 08:38 Сейчас в теме
(7)
при использовании http сервиса можно в принцепи и отдавать уже страницу, но обычно отдают xml или json


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


У меня как раз наоборот. Изменять сервис мне не захочется, как раз пока вебщики не придумают чего нибудь еще,
13. pallid 183 09.08.18 09:07 Сейчас в теме
(10)
чем Вам не угодил SOAP?


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

в случаи с http сервисом есть возможность выбора что и как отдавать
9. dsdred 470 08.08.18 21:52 Сейчас в теме
(6)
в случае с http-сервисом, ответ передается уже распаренный, получается 1С получает дополнительную нагрузку по ресурсу к серверу 1С на обработку, результата, правильно я понял? роль веб-сервера выполняет сам сервер 1С, ну вы понимаете к чему это я?


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

вот кстати из недавних обсуждений https://forum.infostart.ru/forum34/topic188597/
11. alex_bitti 58 09.08.18 08:45 Сейчас в теме
(9) http-сервис выдает "более готовый" результат, увеличивая нагрузку на 1С-сервер, ну это логично если где-то мы сокращаем потребление ресурса, где-то его увеличиваем, закон сохранения. Может для мобильного приложения это актуально и то вопрос? Если делать движок под мобилу, все равно что возвращает сервис, мне кажется http-сервис еще одна избыточная технология интегрированная в 1С, пока еще точно не определили зачем
14. neikist 09.08.18 11:01 Сейчас в теме
(11) в каком смысле "более готовый" результат? Как раз с веб сервисами работа с xml и xdto как отображением xml ресурсы поедает, а в http можно работать с чистыми ЗаписьXML, ЗаписьJSON, да хоть csv передать.
Хотя в итоге узким местом все равно скорее всего работа с БД будет, а не soap.
15. alex_bitti 58 09.08.18 12:14 Сейчас в теме
(14) еще раз, задача стоит сделать не что-то, а так как будет максимально правильно, я не спорю что http-сервис может выдавать готовую страницу, но ни один вебщик не полезет в 1С, и ни один 1С ник не полезет в веб, правильно? Из того что вы предложили это даже не полуфабрикат, не хочу хейтить но файл xml- это не то, txt тоже не то, задача сделать коннектор. SOAP отлично для этого подходит, я могу заказать сайт хоть у индусов передав им только параметры, с вашим вариантом мне как предлагать индусам писать в 1С, или сказать что у меня есть xml, и надо мной будут смеяться все миллионеры из трущоб
16. neikist 09.08.18 12:24 Сейчас в теме
(15) вообще то SOAP - это тоже вполне себе xml, причем в 1с еще и не сказать что по стандарту сделанный, сталкивались мы с проблемами на этой почве, да, было дело.

Ну и никто не предлагает отдавать верстку и подобное из 1с, сейчас в тренде (и я понимаю почему) RestAPI отдающий JSON. Он гораздо проще и приятнее для потребителя API чем SOAP. В пределе можно вообще graphQL запилить, пусть и с некоторыми ограничениями, и отдать разрабам сторонней системы, тогда даже в некоторых случаях правки на стороне 1с при изменении потребностей пользователей не потребуются.
ArchLord42; pallid; +2 Ответить
17. pallid 183 09.08.18 15:07 Сейчас в теме
(15)
(16)
причем в 1с еще и не сказать что по стандарту сделанный, сталкивались мы с проблемами на этой почве, да, было дело.


Было, было

писали soap, со своей стороны тестили его 1ским клиентом, потребитель был не на 1с, из-за одной недолгядки целый день потратили на поиск проблемы почему потребитель не работает с нами анаш тестовый клиент нормально работает )))
19. alex_bitti 58 09.08.18 17:34 Сейчас в теме
(17) есть же SoapUI, тестится все отлично, аж интересно в чем беда?
21. pallid 183 09.08.18 17:37 Сейчас в теме
(19) детали не помню, но что-то было с xdto пакетом, точнее что-то со свойством было

1с клиенту было все равно, все работало, а вот другой клиент при приеме данных сходил сума, и отказывался понимать что ему пришло
22. alex_bitti 58 09.08.18 17:40 Сейчас в теме
(21) единственное что там может вызвать проблему это пространство имен, конечно на симплах все работает, пока не переключишь на стандарт какой нибудь формализованный
24. neikist 09.08.18 18:11 Сейчас в теме
(19) лично у нас была проблема с тем что 1с не умеет в soap header, причем как на запрос к 1с, так и при вызове из 1с системы которая это поддерживает. Плюс иногда бывает что обе системы имеют ограничения по возможности описания формата в wsdl, и при несовпадении таких возможностей тоже начинаются проблемы.
18. pallid 183 09.08.18 15:14 Сейчас в теме
(15)
я не спорю что http-сервис может выдавать готовую страницу


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

отдаем json, морда на реакте, профит
20. alex_bitti 58 09.08.18 17:36 Сейчас в теме
(18) я Вас понял, просто не любите xml))
25. pallid 183 09.08.18 18:33 Сейчас в теме
(20) Люблю
(20)
просто не любите xml))


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

тем более на дворе 2018 год, IoT и прочий хайп ))) там точно никакого soap
26. dsdred 470 09.08.18 18:42 Сейчас в теме
(11) Что такое "более готовый" результат?

Я понимаю Ваши ответы так: "Не читал, но презираю".
Вы же честно написали в самом начале:
если честно не пробовал их использовать



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

Я последнии полтора года очень плотно работаю с Веб программистом в крупной компании с большим документооборотом (там и производство и несколько розничных сетей и франшиза), он мне сам сказал отдавай мне JSON. За полтора года мы с ним хренову гору проектов сделали, при этом 65% данных он забирает по OData (с моей стороны только дать доступ к нужным ему объектам и нарисовать сам запрос), а остальные 35% я делаю ему http-сервисы (POST) и он подает некие параметры и получает JSON. Он доволен как "удав". Есть у нас и обратная взаимосвязь, он передает некие параметры и формирует через написанные мной http-сервисы некие объекты.
27. alex_bitti 58 10.08.18 08:45 Сейчас в теме
(26) у нас в организации нет веб- программистов, веб разработка заказывается, иногда даже не в нашей стране, потому что не все наши спецы по веб делают вещи, ваш ответ можно понимать "я знаю потому что спец", я читал изучал пробовал, но в серьезных проектах не считаю данную технологию применимой, odata это прозор, даже не о ней сейчас. мне почему то кажется я старше вас и с 2002 года занимаюсь 1С, с 1997 работаю программистом не надо искать в том что я пишу второй смысл
28. dsdred 470 10.08.18 11:54 Сейчас в теме
(27)
у нас в организации нет веб- программистов, веб разработка заказывается, иногда даже не в нашей стране, потому что не все наши спецы по веб делают вещи, ваш ответ можно понимать "я знаю потому что спец", я читал изучал пробовал, но в серьезных проектах не считаю данную технологию применимой, odata это прозор, даже не о ней сейчас. мне почему то кажется я старше вас и с 2002 года занимаюсь 1С, с 1997 работаю программистом не надо искать в том что я пишу второй смысл


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

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

П.С. Беседа уже пошла не в продуктивные и никому не нужные русла.
8. dsdred 470 08.08.18 21:39 Сейчас в теме
(5)
Одна из опасностей OData - это невозможность контролировать генерируемый объем возвращаемой информации, нельзя установить максимальное количество. И если в базе данных много и кто-то решил забрать разом все, это может повлиять на работу...всех ))))


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

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

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

17.2.1.5.5. $skip
Позволяет исключить из результата запроса первые несколько записей. Если параметры $top и $skip указываются одновременно, то параметр $skip будет применен раньше, чем параметр $top. Приоритет применения параметров не зависит от порядка их указания в теле запроса.
12. pallid 183 09.08.18 09:04 Сейчас в теме
(8)
Порционно то кто запрещает выборку делать?


я про то что никто не запрещает клиенту все сразу забрать - это опасность
23. dsdred 470 09.08.18 18:02 Сейчас в теме
(12)
я про то что никто не запрещает клиенту все сразу забрать - это опасность


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

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

Я так понимаю в конторе небольшой документооборот просто. Но убей не приложу почему именно Веб-сервисы?
29. badboychik 60 13.08.18 14:39 Сейчас в теме
(12) Можно минимальную прокладку сделать между клиентом и одатой, чисто для базового контроля
30. pallid 183 13.08.18 15:38 Сейчас в теме
31. badboychik 60 13.08.18 18:12 Сейчас в теме
(30) пользователь не напрямую обращается к одате а к отдельному http-сервису, передавая те же параметры, а сервис проверяет их и уже сам вызывает одату и отдает что получил
32. pallid 183 13.08.18 18:23 Сейчас в теме
(31) обращается к самому же себе только не напрямую в базу а по OData? Зачем?
33. badboychik 60 14.08.18 01:30 Сейчас в теме
(32) Напрямую в базу - это уже надо самому писать запросы, делать полноценное API, а так OData уже готовое, я же и говорю - легкий "прокси"-сервис.
То что к самому себе - какая разница, есть ведь обработки для тестирования http-сервисов, они тоже к той же базе делают запросы
Оставьте свое сообщение