Эта публикация написана мною, чтобы поделиться решением небольшой, но популярной задачи и, надеюсь, будет полезна определенному кругу читателей. Итак, сначала постановка задачи, необходимо обеспечить новому сотруднику доступ к данным из бухгалтерской базы, в частности это оплаты. Сотрудник при этом не бухгалтер и не работает в 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 части.
А почему web а не http сервис? Это же приводит к тому что при изменении параметров или операций в сервисе приходится делать изменения и в клиентской части
потому что http сервисы появились относительно недавно, и с целью интеграции мобильных приложений, насколько мне известно, если честно не пробовал их использовать, но что то мне подсказывает что плане времени обработки запроса там могут возникнуть вопросы, а может и нет
(2)
4 года назад это
?
Никаких вопросов там не возникнет.
А вообще тут и OData может сгодится, хотя…
(3) OData монструозен ))) хотя как единственный выход в некоторых случаях
Одна из опасностей OData — это невозможность контролировать генерируемый объем возвращаемой информации, нельзя установить максимальное количество. И если в базе данных много и кто-то решил забрать разом все, это может повлиять на работу…всех ))))
(5) стойте, odata вообще мимо, задача не как-то, а нормально по человечески сделать, да через апач, да на пыхе, но это нормальные теххнологии масштабируемые, odata это боль, причем ребята не 1С-ники «не поймут» выбор, если захотят участвовать в разработке клиента))
что имелось ввиду под «вопросами» по http -сервису, как бы вопрос немного раньше чем нужно, потому что речь про самопального веб-клиента пойдет во второй части, но почему мне предложенный способ больше нравится, я ставлю отдельный веб сервер и далаю на нем сайт, сайт посылает запрос получает ответ парсит его выдает результат на страницу, в случае с http-сервисом, ответ передается уже распаренный, получается 1С получает дополнительную нагрузку по ресурсу к серверу 1С на обработку, результата, правильно я понял? роль веб-сервера выполняет сам сервер 1С, ну вы понимаете к чему это я?
(6)
вот тут не понятно, в смысле уже готовая страница?
при использовании http сервиса можно в принцепи и отдавать уже страницу, но обычно отдают xml или json
принцип почти тот же что и с web-сервисом и даже больше, только в случаи с web клиент завязан на soap
(5)
Порционно то кто запрещает выборку делать?
$count чтобы узнать количество записей. А далее $top и $skip
17.2.1.5.3. $top
Имеется возможность ограничить количество записей, возвращаемых при обращении к ресурсу. Для этого используется параметр $top.
17.2.1.5.5. $skip
Позволяет исключить из результата запроса первые несколько записей. Если параметры $top и $skip указываются одновременно, то параметр $skip будет применен раньше, чем параметр $top. Приоритет применения параметров не зависит от порядка их указания в теле запроса.
(6)
Вообще то у веб-сервисов и http-сервисов результат может быть одинаковый, только http-сервисы менее ресурсо-прожорливые.
вот кстати из недавних обсужденийhttps://forum.infostart.ru/forum34/topic188597/
(7)
то есть html еще писать в 1С?
чем Вам не угодил SOAP?
я не утверждаю, а рассуждаю так, я 1С-ник, у меня в базе есть данные, я сделал «розетку», накидал «снаружи» скелет страницы, сайта, как угодно . Отдал вебщикам, которые никогда не согласятся смотреть, а тем более писать в 1С, они там снаружи пусть крутят как хотят, от 1С нужен только общеупотребимый протокол, все.
У меня как раз наоборот. Изменять сервис мне не захочется, как раз пока вебщики не придумают чего нибудь еще,
(9) http-сервис выдает «более готовый» результат, увеличивая нагрузку на 1С-сервер, ну это логично если где-то мы сокращаем потребление ресурса, где-то его увеличиваем, закон сохранения. Может для мобильного приложения это актуально и то вопрос? Если делать движок под мобилу, все равно что возвращает сервис, мне кажется http-сервис еще одна избыточная технология интегрированная в 1С, пока еще точно не определили зачем
(8)
я про то что никто не запрещает клиенту все сразу забрать — это опасность
(10)
привязкой к xml, связанность клиента и сервиса
в случаи с http сервисом есть возможность выбора что и как отдавать
(11) в каком смысле «более готовый» результат? Как раз с веб сервисами работа с xml и xdto как отображением xml ресурсы поедает, а в http можно работать с чистыми ЗаписьXML, ЗаписьJSON, да хоть csv передать.
Хотя в итоге узким местом все равно скорее всего работа с БД будет, а не soap.
(14) еще раз, задача стоит сделать не что-то, а так как будет максимально правильно, я не спорю что http-сервис может выдавать готовую страницу, но ни один вебщик не полезет в 1С, и ни один 1С ник не полезет в веб, правильно? Из того что вы предложили это даже не полуфабрикат, не хочу хейтить но файл xml- это не то, txt тоже не то, задача сделать коннектор. SOAP отлично для этого подходит, я могу заказать сайт хоть у индусов передав им только параметры, с вашим вариантом мне как предлагать индусам писать в 1С, или сказать что у меня есть xml, и надо мной будут смеяться все миллионеры из трущоб
(15) вообще то SOAP — это тоже вполне себе xml, причем в 1с еще и не сказать что по стандарту сделанный, сталкивались мы с проблемами на этой почве, да, было дело.
Ну и никто не предлагает отдавать верстку и подобное из 1с, сейчас в тренде (и я понимаю почему) RestAPI отдающий JSON. Он гораздо проще и приятнее для потребителя API чем SOAP. В пределе можно вообще graphQL запилить, пусть и с некоторыми ограничениями, и отдать разрабам сторонней системы, тогда даже в некоторых случаях правки на стороне 1с при изменении потребностей пользователей не потребуются.
(15)
(16)
Было, было
писали soap, со своей стороны тестили его 1ским клиентом, потребитель был не на 1с, из-за одной недолгядки целый день потратили на поиск проблемы почему потребитель не работает с нами анаш тестовый клиент нормально работает )))
(15)
может, но такое ниразу не приходилось реализовывать
отдаем json, морда на реакте, профит
(17) есть же SoapUI, тестится все отлично, аж интересно в чем беда?
(18) я Вас понял, просто не любите xml))
(19) детали не помню, но что-то было с xdto пакетом, точнее что-то со свойством было
1с клиенту было все равно, все работало, а вот другой клиент при приеме данных сходил сума, и отказывался понимать что ему пришло
(21) единственное что там может вызвать проблему это пространство имен, конечно на симплах все работает, пока не переключишь на стандарт какой нибудь формализованный
(12)
Согласен. С любым инструментом нужно разумно работать. Как говорится раз в жизни и палка стреляет ))
Я исходил из запроса статьи. Там по сути простейшая выборка двух типов документов… причем ни пометка на удаления не проверяется, ни провенность… Да и документы по наименованию контрагента выбираются… Без периода выборки. И в запросе «top», а не «Первые», но это уже просто признаки плохого тона (Встречал как то обработки где на трех языках написано было, «очень читабельно»).
Видно, что руку еще набивают.
Я так понимаю в конторе небольшой документооборот просто. Но убей не приложу почему именно Веб-сервисы?
(19) лично у нас была проблема с тем что 1с не умеет в soap header, причем как на запрос к 1с, так и при вызове из 1с системы которая это поддерживает. Плюс иногда бывает что обе системы имеют ограничения по возможности описания формата в wsdl, и при несовпадении таких возможностей тоже начинаются проблемы.
(20) Люблю
(20)
я такого не говорил ))) просто чем хорош soap — так это валидация на основе xdto (сильная связанность). а в решении нет необходимости в такой опции.
тем более на дворе 2018 год, IoT и прочий хайп ))) там точно никакого soap
(11) Что такое «более готовый» результат?
Я понимаю Ваши ответы так: «Не читал, но презираю».
Вы же честно написали в самом начале:
Я последнии полтора года очень плотно работаю с Веб программистом в крупной компании с большим документооборотом (там и производство и несколько розничных сетей и франшиза), он мне сам сказал отдавай мне JSON. За полтора года мы с ним хренову гору проектов сделали, при этом 65% данных он забирает по OData (с моей стороны только дать доступ к нужным ему объектам и нарисовать сам запрос), а остальные 35% я делаю ему http-сервисы (POST) и он подает некие параметры и получает JSON. Он доволен как «удав». Есть у нас и обратная взаимосвязь, он передает некие параметры и формирует через написанные мной http-сервисы некие объекты.
(26) у нас в организации нет веб- программистов, веб разработка заказывается, иногда даже не в нашей стране, потому что не все наши спецы по веб делают вещи, ваш ответ можно понимать «я знаю потому что спец», я читал изучал пробовал, но в серьезных проектах не считаю данную технологию применимой, odata это прозор, даже не о ней сейчас. мне почему то кажется я старше вас и с 2002 года занимаюсь 1С, с 1997 работаю программистом не надо искать в том что я пишу второй смысл
(27)
Во первых я не хотел никого обидеть и не хотел чтобы мои ответы были восприняты так как Вы их восприняли.
Я лишь так и не смог понять Ваш ответ который Вы повторяли как мантру — «Более готовый».
И так как Вы часто говорили, что веб программисты не должны программировать в 1с в ответ на предложение использовать http-сервисы, я описал ситуацию с текущего места работы. Конкретно написал, что веб программист сам попросил http-сервисы+JSON. При этом я не сомневаюсь в его квалификации, так как он пишет как для нашего, так и для зарубежного рынка.
Во вторых, мы с Вами работаем не охранниками, не грузчиками и т.д, поэтому не важно с какого года мы в 1С. Наши знания частично устаревают, а получение новых знаний зависит только от нас самих. Да я не сразу пошел в программисты 1С, до этого был администратором систем в банке. Да я не программировал на 6 и 7.7, а только забирал данные с 7.7. Да я в 1С с 2012. Но если посмотреть с какой периодичностью платформа выходила до версии 8.3, ясно что до 2014 развитие платформы можно назвать «тихим периодом».
П.С. Беседа уже пошла не в продуктивные и никому не нужные русла.
(12) Можно минимальную прокладку сделать между клиентом и одатой, чисто для базового контроля
(29) через Odata?
(30) пользователь не напрямую обращается к одате а к отдельному http-сервису, передавая те же параметры, а сервис проверяет их и уже сам вызывает одату и отдает что получил
(31) обращается к самому же себе только не напрямую в базу а по OData? Зачем?
(32) Напрямую в базу — это уже надо самому писать запросы, делать полноценное API, а так OData уже готовое, я же и говорю — легкий «прокси»-сервис.
То что к самому себе — какая разница, есть ведь обработки для тестирования http-сервисов, они тоже к той же базе делают запросы