0. Dementor 625 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 625 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 625 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 143 19.09.19 11:06 Сейчас в теме
Видимо, так и не решил...
YanTsys; dron9205; user1300186; user756416; Dementor; +5 Ответить
10. Alien_job 168 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 96 13.12.17 07:57 Сейчас в теме
(10)
Возможно автор в следующей статье раскроет тему создания и изменения документов 1С из другой базы 1С посредством OData, был бы очень признателен.

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

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

Если это не устриавает, то надо использовать преднастроенные WS ссылки и SOAP
32. maxx 839 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 625 13.06.18 13:34 Сейчас в теме
(34) авторизация есть. Хотя при желании "анонимности" можно прописать логин/пароль для подключения напрямую в публикацию на веб-сервере.
36. pavel_pss 253 04.12.18 17:05 Сейчас в теме
Спасибо, за статью. очень интересно, Убили с напарником целый день на повторение и приведение к нормальному виду, В итоге плюнули на это, т.к. больше 500 строк редактор запроса в офис 2016 не показывает (после слияния двух таблиц запросов с 3 колонками), а в саму форму эксель из редактора вообще не смогли вернуть, пишет ошибку соединения.
Dementor; +1 Ответить
37. Dementor 625 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С
Воронеж
зарплата от 70 000 руб.
Полный день

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

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

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

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