0. Dementor 626 05.12.17 15:59 Сейчас в теме

Практика доступа в базу 1С через протокол oData. Чтение данных

Для чего нужен доступ в базу 1С через REST-интерфейс по протокол oData? Как его организовать? Как не будучи гуру в JavaScript и .NET получить быстрый визуальный доступ к данным базы 1С? Попробую дать ответ на эти вопросы и прокомментирую некоторые нюансы, с которыми я столкнулся.

Перейти к публикации

Комментарии
Избранное Подписка Сортировка: Древо
1. sandybaev 140 12.12.17 06:56 Сейчас в теме
Мдааа, прикольная вещь.

надо на досуге попробовать похимичить.
с меня +
2. 🅵🅾️🆇 12.12.17 08:51 Сейчас в теме
С меня , попозже повнимательнее прочту.
3. shura_k 12.12.17 11:29 Сейчас в теме
Я тоже в свое время покопался с подобным механизмом и немного устал от необходимости строить много запросов к запросам с джоинами. Хотя в прошлом я хорошо программировал на SQL и это для меня не новость. Но вот повторять отчет, который реализован в 1С заново нет не времени не желания.
Поэтому я сделал свой http сервис, где любой банальный отчет или немного адаптированный можно вывалить в виде OData. И он прекрасно открывается что в Екселе, что в Power BI.
Если будет интерес, могу попробовать сделать публикацию здесь своего решения.
P.S. кстати если у вас Ексель 2010, то он штатно не умеет открывать OData. Что бы научить, Майкрософт сделала аддон - Power Query.
myoker; TreeDogNight; distorshion; 🅵🅾️🆇; ye_s; alexey-simf; Gang031; apd1c; fancy; zakiap; Огонек; корум; z86; echo77; +14 Ответить
4. vovan_victory 61 12.12.17 12:13 Сейчас в теме
Прежде всего, автору + за труды.
(3)
Если будет интерес, могу попробовать сделать публикацию здесь своего решения.

Я думаю, что многим будет интересно...ждем
5. Dementor 626 12.12.17 13:30 Сейчас в теме
(3) Интерес уже от двух человек :)
А под "любой банальный отчет" вы понимаете только отчеты на компоновке данных или вообще все возможные, включая на базе построителя отчетов и полностью "ручные" на макете из табличного документа?
Valerich; +1 Ответить
7. shura_k 12.12.17 15:43 Сейчас в теме
А под "любой банальный отчет" вы понимаете только отчеты на компоновке данных или вообще все возможные, включая на базе построителя отчетов и полностью "ручные" на макете из табличного документа?

меня пока интересовали СКД.
но там суть в том чтобы получить ТЗ или ТД. А дальше уже функция формирует из него ответ в Odata.
Так что можно при желании и умении адаптировать под себя :)
14. karimov_m 13.12.17 22:47 Сейчас в теме
(7) интересно, ждем.
Фактически - любой отчет на СКД да и просто макете - суть плоская таблица (не будем брать в расчет возможные вставки графиков в СКД), которую можно "выгрузить" в ТЗ. А если есть ТЗ, то есть XML ее описывающий и содержащий данные отчета, а если есть XML - считай сконвертировать его в oData не сложно и отдать "наружу".

Но ждем вашей реализации!
6. baracuda 2 12.12.17 13:56 Сейчас в теме
Статья о чем? О том что есть oData и по url с параметрами можно "какие-то" данные получить?

Ожидал увидеть какую нибудь реализацию какого нибудь мало мальски сложного проекта. А получил как обычно.
8. Dementor 626 12.12.17 16:53 Сейчас в теме
(6) Жаль, что вы не попали в целевую аудиторию. Я ориентировался больше на новичков, которых нужно заинтересовать и показать новый интересный путь применения своих навыков.

P.S. Ждем от вас обещанную статью по реализации "какого нибудь мало мальски сложного проекта" в виде DashBoard на базе OData.
TreeDogNight; lueur; +2 Ответить
9. baracuda 2 12.12.17 17:03 Сейчас в теме
(8) если я свою задачу по написанию софта на ТСД решу через oData, то статья будет не переживайте.
42. al_zzz 145 19.09.19 11:06 Сейчас в теме
Видимо, так и не решил...
YanTsys; dron9205; user1300186; user756416; Dementor; +5 Ответить
10. Alien_job 169 12.12.17 19:37 Сейчас в теме
(6)Поддерживаю, статьи "как я прочитал по OData элементы справочника" переодически появляются, но статьи https://infostart.ru/public/403426/ и https://infostart.ru/public/503059/ за авторством https://infostart.ru/profile/63337/ убедительно свидетельствуют о неработопригодности технологии.

"Помимо выпуска OData SDK для разработки под .NET, AJAX, PHP, Java, JavaScript, WebOS и Objective-C, эта компания внедрила данный протокол в свои популярные продукты: Excel, PowerPoint, SharePoint, MsSQL и других."

А вот 1С у себя не реализовала работу с О-Дата, поэтому при попытке интегрировать одну базу 1с с другой через этот механизм - велкам в велосипедостроение.

Возможно автор в следующей статье раскроет тему создания и изменения документов 1С из другой базы 1С посредством OData, был бы очень признателен.
11. ni032mas 99 13.12.17 07:57 Сейчас в теме
(10)
Возможно автор в следующей статье раскроет тему создания и изменения документов 1С из другой базы 1С посредством OData, был бы очень признателен.

Механизм очень даже рабочий и в последних версиях платформы улучшен и исправлены критические баги. Создавать и изменять документы из другой базы 1С лучше с помощь планов обмена. ODATA хорошо подходит для интеграции со сторонними системами. Я например, успешно скрестил 1С и нативный клиент android с помощью ODATA.
12. Alien_job 169 13.12.17 11:32 Сейчас в теме
(11) одна из особенностей одата - то что не нужно изменять конфигурацию с которой собираешься интегрироваться. И планы обмена тут не подходят
13. Dementor 626 13.12.17 16:36 Сейчас в теме
(10) у меня заметки еще на 3-4 статьи. Если делать одну мегастатью, то она будет закончена только к весне, а читать ее будут единицы. И так "многа букав" получилось. Во второй заметке по плану будет простое изменение и удаление. В третьей будет обмен.
15. karimov_m 13.12.17 22:49 Сейчас в теме
Автору:
Я открыл статью с перечнем самых популярных на сегодняшний день библиотек создания таблиц и нашел в нем простенькую библиотечку jsGrid как раз для нашего случая. Изучаем их сайт, берем пример ихнего кода по использованию OData и вставляем туда путь к нашим данным.

аай. больно то как. аа))
16. Dementor 626 14.12.17 02:39 Сейчас в теме
(15) а как правильно? Просто я обучался в украиноязычной школе, а в украинском языке именно так и будет: "...беремо приклад їхнього коду по використанню...". Думаю, что подобная проблема есть и у некоторых жителей Курской, Воронежской, Ростовской, Белгородской областей и Краснодарского края ;-)
18. dock 35 14.12.17 09:02 Сейчас в теме
(16) Считается, что в литературном языке такого слова "ихнего" нет. Это просторечное слово, т.е. используется только в устной речи.
А ведь на этом сайте присутствуют только высококультурные, с высшим филологическим образованием пользователи. Поэтому совершенно недопустимо использовать в письменной форме просторечия!
Учитывая всё вышесказанное написанное, правильное написание "берем пример их кода" и ни в коем случае "ихнего"!
З.Ы. САРКАЗМ
TreeDogNight; letzteKraft; +2 Ответить
21. karimov_m 14.12.17 11:11 Сейчас в теме
(18) В устной речи так тоже нельзя говорить) Точнее, говорить то можно.. но.. черт побери, это режет слух..
letzteKraft; +1 Ответить
20. karimov_m 14.12.17 11:09 Сейчас в теме
(16) Да, правильно будет "Их"
17. dock 35 14.12.17 08:32 Сейчас в теме
(15)
Словарь Ожегова
Ихний
-яя, -ее, мест. притяж. (прост.). То же, что их (во 2 знач.). * По-ихнему (прост.) — 1) нареч., по их воле, желанию. Упрямые, все будь по-ихнему; 2) нареч., так, как делают они. Не буду поступать по-их-нему; 3) вводи, ел., по их мнению. Я, по-их-нему, бездельник.

:) вполне нормальное слово
19. dock 35 14.12.17 09:19 Сейчас в теме
22. Dementor 626 14.12.17 12:44 Сейчас в теме
(15) и (17) спасибо за урок стилистики. Загуглил и оказалось, что в русском это вполне себе литературное слово, которое любили употреблять Булгаков, Толстой, Достоевский, Чуковский и многие другие классики (и современники); не говоря о том, что это слово есть в словарях Даля, Ушакова и Ожегова.
23. karimov_m 14.12.17 12:55 Сейчас в теме
(22) Литературное, спору нет..

Но вот воспринимается оно примерно так же, как если говорить: Ехай, тута, накласть, заместо, здеся, ивоный, "у ней", тама, "в лифту" и тп..

Но каждому, конечно же, своя стилистика..
YanTsys; eeeio; +2 Ответить
24. dock 35 15.12.17 11:37 Сейчас в теме
Ох развели холивар... устроили флудильню...
по теме:
у меня заметки еще на 3-4 статьи. Если делать одну мегастатью, то она будет закончена только к весне, а читать ее будут единицы. И так "многа букав" получилось. Во второй заметке по плану будет простое изменение и удаление. В третьей будет обмен.

Когда ждать "по плану" продолжение ? :) Готовы почитать даже заметки :)
25. Dementor 626 15.12.17 15:48 Сейчас в теме
(24) Могу сказать только что вторая статья точно будет в этом году.

Готовы почитать даже заметки :)

А толку? Так ведь можно на ИТС открыть раздел документации и вроде все уже ясно.
26. VasilVtoroy 15.12.17 18:22 Сейчас в теме
а особенно актуально ограничить раскрываемую информацию по параметру $expand, который тянет полностью весь связанный объект, в то время когда нам нужны из него всего одно-два поля.


Такая возможность давно есть, вот документация:

https://its.1c.ru/db/v8311doc#bookmark:dev:TI000001365

http://host/base/odata/standard.odata/Catalog_Клиенты?$expand=Сертификат&$select=Сертификат/Дата
27. VasilVtoroy 15.12.17 18:25 Сейчас в теме
"Просмотрев результат, мы можем заметить, что у нас нет представлений для контрагентов, а только ключи для таблицы справочника контрагентов. Следовательно будем запрашивать и эти вспомогательные данные."

Можно проще:

https://its.1c.ru/db/v8311doc#bookmark:dev:TI000001361, подраздел
___Presentation

Хотя все равно спасибо за описание способа связывания запросов
28. Dementor 626 15.12.17 19:24 Сейчас в теме
(27)
Хотя все равно спасибо за описание способа связывания запросов

Когда я решил написать статью, то оказалось, что тут уже была одна чем-то похожая статья, в которой Excel получал данные таблиц OData с помощью пункта "Получение внешних данных". Я же хотел показать работу именно через механизм запросов с соединением нескольких источников.

Про возможность получить представление, если явно запросив его через параметр $select, я уже в курсе, но все равно спасибо за замечание.

(26) Приятно, что кто-то внимательно прочитал :)
29. Vi_ru_S123 07.02.18 11:16 Сейчас в теме
Добрый день. Подскажите пожалуйста. Пытаюсь использовать year(дата) в GET запросе через браузер строку но мне выдает ошибку:

<m:error xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
<m:code>6</m:code>
<m:message>Сегмент пути Дата не найден!</m:message>
</m:error>

вот сам запрос: http://localhost/server/odata/standard.odata/AccumulationRegister_Продажи_RecordType?$filter=year(Дата) eq 2018

в: http://localhost/server/odata/standard.odata/$metadata следующие данные:

<EntityType Name="AccumulationRegister_Продажи_RecordType" OpenType="true">
<Key>
<PropertyRef Name="Recorder"/>
<PropertyRef Name="LineNumber"/>
<PropertyRef Name="Recorder_Type"/>
</Key>
<Property Name="Recorder" Type="Edm.String" Nullable="false"/>
<Property Name="Period" Type="Edm.DateTime" Nullable="true"/>
<Property Name="LineNumber" Type="Edm.Int64" Nullable="false"/>
<Property Name="Active" Type="Edm.Boolean" Nullable="true"/>
<Property Name="Номенклатура_Key" Type="Edm.Guid" Nullable="true"/>
<Property Name="ХарактеристикаНоменклатуры_Key" Type="Edm.Guid" Nullable="true"/>
<Property Name="ЗаказПокупателя" Type="Edm.String" Nullable="true"/>
<Property Name="ДоговорКонтрагента_Key" Type="Edm.Guid" Nullable="true"/>
<Property Name="ДокументПродажи" Type="Edm.String" Nullable="true"/>
<Property Name="Подразделение_Key" Type="Edm.Guid" Nullable="true"/>
<Property Name="Проект_Key" Type="Edm.Guid" Nullable="true"/>
<Property Name="Организация_Key" Type="Edm.Guid" Nullable="true"/>
<Property Name="Контрагент_Key" Type="Edm.Guid" Nullable="true"/>
<Property Name="Количество" Type="Edm.Double" Nullable="true"/>
<Property Name="Стоимость" Type="Edm.Double" Nullable="true"/>
<Property Name="СтоимостьБезСкидок" Type="Edm.Double" Nullable="true"/>
<Property Name="НДС" Type="Edm.Double" Nullable="true"/>
<Property Name="Recorder_Type" Type="Edm.String" Nullable="false"/>
<Property Name="ЗаказПокупателя_Type" Type="Edm.String" Nullable="true"/>
<Property Name="ДокументПродажи_Type" Type="Edm.String" Nullable="true"/>
<NavigationProperty Name="Номенклатура" Relationship="StandardODATA.AccumulationRegister_Продажи_RecordType_Номенклатура" FromRole="Begin" ToRole="End"/>
<NavigationProperty Name="ХарактеристикаНоменклатуры" Relationship="StandardODATA.AccumulationRegister_Продажи_RecordType_ХарактеристикаНоменк­латуры" FromRole="Begin" ToRole="End"/>
<NavigationProperty Name="ДоговорКонтрагента" Relationship="StandardODATA.AccumulationRegister_Продажи_RecordType_ДоговорКонтрагента" FromRole="Begin" ToRole="End"/>
<NavigationProperty Name="Подразделение" Relationship="StandardODATA.AccumulationRegister_Продажи_RecordType_Подразделение" FromRole="Begin" ToRole="End"/>
<NavigationProperty Name="Проект" Relationship="StandardODATA.AccumulationRegister_Продажи_RecordType_Проект" FromRole="Begin" ToRole="End"/>
<NavigationProperty Name="Организация" Relationship="StandardODATA.AccumulationRegister_Продажи_RecordType_Организация" FromRole="Begin" ToRole="End"/>
<NavigationProperty Name="Контрагент" Relationship="StandardODATA.AccumulationRegister_Продажи_RecordType_Контрагент" FromRole="Begin" ToRole="End"/>
</EntityType>

У меня конфигурация УТ 10.3.46.2 Платформа 8.3.11.2867

Скажите пожалуйста как сформировать запрос что бы мне выдало данные за 2018?
30. Dementor 626 07.02.18 21:44 Сейчас в теме
(29) сейчас проверить не могу, но почему Дата? Вы дорабатывали УТшку и явно создали такое измерение? Если нет, то нужен Период.
31. user895038 20.03.18 00:00 Сейчас в теме
Правильно ли я понимаю, что через ODATA/REST я могу получить только примитивные данные, хоть и используя фильтрацию.
Т.е. я не могу увидеть в номенклатуре родителя - только ссылку на него, а чтобы узнать Наименование родителя мне нужно выполнить следующий запрос, используя ранее полученный Guid?
А также, я не могу получить результат запроса к двум соединенным таблицам? Мне надо сначала отфильтровать первую таблицу, запомнить список данных связанного поля, а следующим запросом получить уже данные второй таблицы, послав в запросе весь запомненный список.
И уже только на клиенте я могу соединить две полученные таблицы.

Если это не устриавает, то надо использовать преднастроенные WS ссылки и SOAP
32. maxx 840 30.03.18 12:51 Сейчас в теме
(31)
Правильно ли я понимаю, что через ODATA/REST я могу получить только примитивные данные, хоть и используя фильтрацию.
Т.е. я не могу увидеть в номенклатуре родителя - только ссылку на него, а чтобы узнать Наименование родителя мне нужно выполнить следующий запрос, используя ранее полученный Guid?


Нет неправильно, в запросе для полей ссылочных данных можно использовать слово $expand=ВашаПолеСсылка/Parent

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

Если это не устриавает, то надо использовать преднастроенные WS ссылки и SOAP


Вот тут да, нужно делать в несколько шагов. Только я бы использовал hs ссылки, а не SOAP он по легче будет.
33. user895038 06.04.18 13:40 Сейчас в теме
(32)
Спасибо за ответ. В общем, я плюнул на это дело и сделал WEB сервис(5 строчек кода), принимающий текст запроса, и посылающий в ответ таблицу в формате JSON.
По легкости ответа получилось как REST, а по сути полноценный инструмент для получения любых данных, к которым разрешен доступ подключающемуся пользователю.
34. m912 13.06.18 09:46 Сейчас в теме
А что с авторизацией? Как я понял любые данные могут быть получены без пароля?
35. Dementor 626 13.06.18 13:34 Сейчас в теме
(34) авторизация есть. Хотя при желании "анонимности" можно прописать логин/пароль для подключения напрямую в публикацию на веб-сервере.
36. pavel_pss 256 04.12.18 17:05 Сейчас в теме
Спасибо, за статью. очень интересно, Убили с напарником целый день на повторение и приведение к нормальному виду, В итоге плюнули на это, т.к. больше 500 строк редактор запроса в офис 2016 не показывает (после слияния двух таблиц запросов с 3 колонками), а в саму форму эксель из редактора вообще не смогли вернуть, пишет ошибку соединения.
Dementor; +1 Ответить
37. Dementor 626 04.12.18 21:45 Сейчас в теме
(36) спасибо за отзыв. Год назад резко сменил деятельность и не успел самостоятельно по граблям попрыгать. Кстати, если интересна данная тематика, то посмотрите запись недавнего хакатона: https://www.youtube.com/watch?v=gYcKdXtrdRw&t=4s
38. mulder242 3 27.05.19 10:09 Сейчас в теме
Добрый день, кто-нибудь сталкивался с ошибкой при подключении
у меня при попытке вызвать ссылку

localhost/имябазы/odata/standard.odata/

ошибка
Сеанс отсутствует или удален ID=5555855a-628a-4471-9bea-4ffaaff85f1b, File=src\ClusterDistribImpl.cpp(1436)
Прикрепленные файлы:
39. IvanPoh 14 31.05.19 17:35 Сейчас в теме
Добрый день. Я правильно понял что в запросной строке нельзя одновременно наложить filter и select?
Допустим я хочу выбрать организацию с ИНН = "11111111111111" и вернуть только ссылку:
http://192.168.1.1/MyBase1c/odata/standard.odata/Catalog_Организации?$filter=ИНН eq '11111111111111'?$select=Ref_Key
В ответ упорно приходят все поля. На ИТС тоже нигде не нашел ни примера, ни упоминания о совместном использовании filter и select.
40. distorshion 14 23.06.19 21:36 Сейчас в теме
(39)
Да можно конешно вот например :

http://localhost/Zup/odata/standard.odata/Catalog_СотрудникиОрганизаций?$format=json&$filter=cast(ПодразделениеОрганизации, 'Catalog_ПодразделенияОрганизаций') eq guid'd9506d66-165d-11df-b6af-00195b699aff'&$select=Description,Ref_Key

тут фильтр по подразделению, а выбор полей Наименование и уид
Dementor; IvanPoh; +2 Ответить
41. Derushev 5 13.09.19 23:17 Сейчас в теме
Доброго дня! Подскажите, можно ли в строке запроса исключить кириллицу?
Например, вместо http://*.*.*.*/U10/odata/standard.odata/Catalog_Номенклатура?$select=Ref_Key,Description,IsFolder%20&$format=json;odata=nometadata, Написать http://*.*.*.*/U10/odata/standard.odata/Catalog_Goods?$select=Ref_Key,Description,IsFolder%20&$format=json;odata=nometadata
Что нужно сделать для этого?
43. Дмитрий74Чел 179 31.10.19 15:13 Сейчас в теме
(41) задать наименования объектов в конфигураторе на английском. Т.е. сделать конфу где все объекты с английскими именами. :-)
Dementor; +1 Ответить
44. user719779 13.11.19 10:01 Сейчас в теме
Добрый день. У заказчика поднял Rest. Все было хорошо до того момента пока не попытался получить запись из регистра сведений КонтактнаяИнформация. Формирую обычный http запрос на получение записи по ид
http://host/base/odata/standard.odata/InformationRegister_КонтактнаяИнформация(Объект='5e98dd87-0481-11ea-bab4-00155d006608',%20Объект_Type='StandardODATA.Catalog_КонтактныеЛицаКонтрагентов',%20Тип='Телефон',%20Вид='2388c2a9-98e9-4282-8a93-9940c9ef0a86',%20Вид_Type='StandardODATA.Catalog_ВидыКонтактнойИнформации')
либо
http://host/base/odata/standard.odata/InformationRegister_КонтактнаяИнформация(Объект=cast(guid'5e98dd87-0481-11ea-bab4-00155d006608', 'Catalog_КонтактныеЛицаКонтрагентов'), Тип='Телефон', Вид=cast(guid'2388c2a9-98e9-4282-8a93-9940c9ef0a86', 'Catalog_ВидыКонтактнойИнформации')).
В 1 случае 400 ошибка. Во втором случае возвращалось Произошла внутренняя ошибка OData сервиса.
По 1 если увеличить максимальный размер запроса тоже возвращается Произошла внутренняя ошибка OData сервиса. Если для поля вид убрать комплексный тип (а там сейчас строка и ВидКонтактнойИнформации) и оставить только ВидКонтактнойИнформации - то все начинает работать. Но убирать его нельзя потому что уже есть данные с типом строка. Можете подсказать как бороться с подобным?
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

Программист 1С
Санкт-Петербург
зарплата от 80 000 руб. до 120 000 руб.
Полный день

Консультант по 1С:Документооборот
Санкт-Петербург
зарплата от 120 000 руб. до 150 000 руб.
Полный день

Программист по 1С:Бухгалтерии
Санкт-Петербург
зарплата от 120 000 руб. до 150 000 руб.
Полный день

Программист по 1С:ЗУП
Санкт-Петербург
зарплата от 120 000 руб. до 150 000 руб.
Полный день

Консультант-аналитик 1С
Москва
зарплата от 100 000 руб. до 150 000 руб.
Полный день