Linq to ODATA

02.11.16

Интеграция - Внешние источники данных

1С сейчас совершенствует REST интерфейс приложения, автоматически генерируемый платформой, и протокол обмена ODATA версии 3. С недавнего времени появилась возможность обмениваться, используя JSON. На просторах интернета мало информации по использованию Linq для ODATA для 1С. Поэтому решил поделиться опытом. Это продолжение статей https://infostart.ru/public/402433/

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

 

http://v8.1c.ru/o7/201312rest/

Есть поддержка JSON

http://v8.1c.ru/o7/201410json/index.htm

 

Хорошая статья по публикации находится здесь

//infostart.ru/public/305854/index.php?back&vote_id=245&rate=1&ID=305854%3Frate%3D1&bxajaxid=2da474348dcf168272d247336e249b99 

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

//infostart.ru/public/297325/

Или программно установить используя метод УстановитьСоставСтандартногоИнтерфейсаOData

Массив = Новый Массив();

Для Каждого
Справочник Из Метаданные.Справочники Цикл
   
Массив.Добавить(Справочник);
КонецЦикла;

УстановитьСоставСтандартногоИнтерфейсаOData(Массив);

 

Затем в VS Добавить ссылку на службу используя URI

http://{АдресВебСервера}/{ИмяПубликации}/odata/standard.odata/$metadata

Получаем описание классов доступ и доступ к ODATA например так

var uriString = @"http://localhost/LinqBD/odata/standard.odata/";

            var context = new ServiceReference1.EnterpriseV8(new Uri(uriString));

 

            context.Format.UseJson();

            var query = context.CreateQuery<ServiceReference1.Catalog_Тестовый>(@"Catalog_Тестовый")

 

если не использовать context.Format.UseJson() то данные будут присылаться в формате XML

Можно получить один элемент по ключу

var query = context.CreateQuery<ServiceReference1.Catalog_Тестовый>(@"Catalog_Тестовый(guid'aada18ad-5308-11e5-8e05-c86000c70663')");

Можно добавлять фильтры например

 

var query = context.CreateQuery<ServiceReference1.Catalog_Тестовый>(@"Catalog_Тестовый")

                         .AddQueryOption("$filter", "Число le 100");

 

Но проще использовать доступ к ODATA через Linq. Например

 

var result = (from Тестовый in context.Catalog_Тестовый

                          where Тестовый.Число < 500

                          select Тестовый).ToList();

 

var result = (from Тестовый in context.Catalog_Тестовый

                          where Тестовый.Ref_Key == new Guid("aada18ad-5308-11e5-8e05-c86000c70663")

                          select Тестовый).SingleOrDefault();

 

То есть можно работать с ODATA полностью на Linq

 Подгрузка ссылочных реквизитов

https://msdn.microsoft.com/ru-ru/library/cc646508(v=vs.110).aspx

var ПустаяСсылка = new Guid("00000000 - 0000 - 0000 - 0000 - 000000000000");

 

            string НоменклатураНаименование = "";

            if (result.РеквизитСправочник_Key != ПустаяСсылка)

            {

                context.LoadProperty(result, "РеквизитСправочник");

 

               НоменклатураНаименование = result.РеквизитСправочник.Description;

            }

 

Для Неопределенных типов Можно создать функцию

object ПолучитьНеопределенныйТип(ServiceReference1.EnterpriseV8 context, string значение, string Тип)

        {

            switch (Тип)

            {

                case "StandardODATA.Undefined":

                    return null;

                case "StandardODATA.Catalog_Номенклатура": return context.Catalog_Номенклатура.Where(Тестовый => Тестовый.Ref_Key == new Guid(значение)).SingleOrDefault();

                case "Edm.Double": return Double.Parse(значение, System.Globalization.CultureInfo.InvariantCulture);

…..

            }

            return null;

        }

 

Ииспользовать

  dynamic    ЛюбаяССылка = ПолучитьНеопределенныйТип(context, result.ЛюбаяСсылка, result.ЛюбаяСсылка_Type);

     dynamic НеСсылочный = ПолучитьНеопределенныйТип(context, result.НеопределенныйНеССылочный, result.НеопределенныйНеССылочный_Type);

 

 По сути некая замена COM.

 

Полезные ссылки для запросов ODATA

https://msdn.microsoft.com/ru-ru/library/vstudio/dd673933(v=vs.100).aspx

 

Обновление, добавление и удаление записей

 https://msdn.microsoft.com/ru-ru/library/vstudio/dd756361(v=vs.100).aspx

Linq ODATA

См. также

SALE! 15%

Внешние источники данных Программист Бизнес-аналитик Пользователь Платформа 1С v8.3 Управляемые формы Анализ и прогнозирование Конфигурации 1cv8 Узбекистан Беларусь Кыргызстан Молдова Россия Казахстан Платные (руб)

Готовое решение для автоматической выгрузки данных из 1С 8.3 в базу данных ClickHouse, PostgreSQL или Microsoft SQL для работы с данными 1С в BI-системах. «Экстрактор данных 1С в BI» работает со всеми типовыми и нестандартными конфигурациями 1С 8.3 и упрощает работу бизнес-аналитиков. Благодаря этому решению, специалистам не требуется быть программистами, чтобы легко получать данные из 1С в вашей BI-системе.

28500 руб.

15.11.2022    21224    21    49    

38

Внешние источники данных Зарплата Бюджетный учет Программист Бухгалтер Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 7.хх учреждений (далее Парус) в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (далее 1С) и начать с ней работать с любого месяца года.

48000 руб.

24.04.2017    51478    102    165    

90

Внешние источники данных Кадровый учет Файловый обмен (TXT, XML, DBF), FTP Перенос данных 1C Программист Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 10 учреждений (далее Парус) в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (далее 1С) и начать с ней работать с любого месяца года.

60000 руб.

05.10.2022    11061    13    8    

15

Зарплата Внешние источники данных Бюджетный учет Перенос данных 1C Системный администратор Программист Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 8 учреждений (далее Парус) в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (далее 1С) и начать с ней работать с любого месяца года.

84000 руб.

19.08.2020    25405    22    1    

25

Зарплата Внешние источники данных Программист Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и Управление Персоналом 3.x Россия Бухгалтерский учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 8 организаций (далее Парус) в конфигурацию 1С:Зарплата и управление персоналом, ред. 3 (далее 1С) и начать с ней работать с любого месяца года.

84000 руб.

07.06.2021    13355    2    3    

3

Внешние источники данных Облачные сервисы, хостинг Программист Бизнес-аналитик Пользователь Руководитель проекта Платформа 1С v8.3 8.3.14 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Бытовые услуги, сервис Розничная и сетевая торговля (FMCG) Оптовая торговля, дистрибуция, логистика Гостиничный бизнес Рестораны, кафе и фаст-фуд Реклама, PR и маркетинг Легкая промышленность, мода и одежда Управленческий учет Платные (руб)

Расширение позволяет автоматизировать управление картами лояльности и взаимодействие с покупателями при помощи интеграции корпоративной системы 1С и специализированного облачного сервиса "CARDPR". Автоматическая онлайн синхронизация сведений о владельце электронной карты лояльности и баланса бонусных баллов на карте между корпоративной системой 1С и мобильным устройством покупателя. Оповещение покупателя об изменении баланса его электронной карты лояльности и проведении каких-либо маркетинговых акций в компании при помощи рассылки push-сообщений на его мобильное устройство.

36000 руб.

20.07.2023    3308    1    2    

12
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. baracuda 2 06.10.15 14:32 Сейчас в теме
Глоток свежего воздуха при изучении C# Odata.
adhocprog; +1 Ответить
2. Serginio 941 06.10.15 16:53 Сейчас в теме
3. avz_1C 10 29.02.16 14:18 Сейчас в теме
Коллега, Вы продолжаете удивлять.
Спасибо.
Сегодня, как раз, возникла потребность разбирать метаданные нескольких
конфигураций, взаимодействием которых управляет модуль, созданный на C#.
Не успел подумать о Linq, как Вы подтвердили, своей публикацией, мои догадки.
4. Serginio 941 29.02.16 17:41 Сейчас в теме
Спасибо. Рад, что мои труды не пропадают зря
5. TeMochkiN 20.09.16 10:58 Сейчас в теме
Здравствуйте!
Помогите, пожалуйста, пытаюсь добавить ссылку на службу в VS, а она постоянно запрашивает учетные данные и не дает её добавить:

Я ввожу имя пользователя, жму ОК, и снова появляется это же окно ввода имени пользователя и пароля.

После нескольких попыток, жму отмена и пишет следующее:



Я пробовал открыть данную ссылку в хроме он тоже запрашивает имя пользователя и пароль, я ввожу имя пользователя и всё загружается:


А вот Internet Explorer тоже не дает открыть эту ссылку. В чем может быть дело? IIS неправильно настроен?
6. Serginio 941 20.09.16 11:10 Сейчас в теме
Логин и пароль должны быть на латинице
7. Serginio 941 25.10.16 14:21 Сейчас в теме
Добавлю, что для Регистров бухгалтерии можно использовать функции для виртуальных таблиц.
<EntityContainer Name="EnterpriseV8" m:IsDefaultEntityContainer="true">
<EntitySet Name="AccountingRegister_Хозрасчетный" EntityType="StandardODATA.AccountingRegister_Хозрасчетный" />
<EntitySet Name="AccountingRegister_Хозрасчетный_RecordType" EntityType="StandardODATA.AccountingRegister_Хозрасчетный_RecordType" />
<FunctionImport Name="Balance" IsBindable="true" IsSideEffecting="false" ReturnType="Collection(StandardODATA.AccountingRegister_Хозрасчетный_Balance)">
<Parameter Name="bindingParameter" Type="StandardODATA.AccountingRegister_Хозрасчетный" />
<Parameter Name="AccountCondition" Type="Edm.String" />
<Parameter Name="Condition" Type="Edm.String" />
<Parameter Name="Dimensions" Type="Edm.String" />
<Parameter Name="ExtraDimensions" Type="Edm.String" />
<Parameter Name="Period" Type="Edm.DateTime" />
</FunctionImport>
<FunctionImport Name="Turnovers" IsBindable="true" IsSideEffecting="false" ReturnType="Collection(StandardODATA.AccountingRegister_Хозрасчетный_Turnover)">
<Parameter Name="bindingParameter" Type="StandardODATA.AccountingRegister_Хозрасчетный" />
<Parameter Name="AccountCondition" Type="Edm.String" />
<Parameter Name="BalancedAccountCondition" Type="Edm.String" />
<Parameter Name="BalancedExtraDimensions" Type="Edm.String" />
<Parameter Name="Condition" Type="Edm.String" />
<Parameter Name="Dimensions" Type="Edm.String" />
<Parameter Name="EndPeriod" Type="Edm.DateTime" />
<Parameter Name="ExtraDimensions" Type="Edm.String" />
<Parameter Name="StartPeriod" Type="Edm.DateTime" />
</FunctionImport>
<FunctionImport Name="BalanceAndTurnovers" IsBindable="true" IsSideEffecting="false" ReturnType="Collection(StandardODATA.AccountingRegister_Хозрасчетный_BalanceAndTurnover)">
<Parameter Name="bindingParameter" Type="StandardODATA.AccountingRegister_Хозрасчетный" />
<Parameter Name="Condition" Type="Edm.String" />
<Parameter Name="Dimensions" Type="Edm.String" />
<Parameter Name="EndPeriod" Type="Edm.DateTime" />
<Parameter Name="StartPeriod" Type="Edm.DateTime" />
</FunctionImport>
<FunctionImport Name="ExtDimensions" IsBindable="true" IsSideEffecting="false" ReturnType="Collection(StandardODATA.AccountingRegister_Хозрасчетный_ExtDimensions)">
<Parameter Name="bindingParameter" Type="StandardODATA.AccountingRegister_Хозрасчетный" />
</FunctionImport>
<FunctionImport Name="RecordsWithExtDimensions" IsBindable="true" IsSideEffecting="false" ReturnType="Collection(StandardODATA.AccountingRegister_Хозрасчетный_RecordsWithExtDimensions)">
<Parameter Name="bindingParameter" Type="StandardODATA.AccountingRegister_Хозрасчетный" />
<Parameter Name="Condition" Type="Edm.String" />
<Parameter Name="EndPeriod" Type="Edm.DateTime" />
<Parameter Name="Order" Type="Edm.String" />
<Parameter Name="StartPeriod" Type="Edm.DateTime" />
<Parameter Name="Top" Type="Edm.Int64" />
</FunctionImport>
<FunctionImport Name="DrCrTurnovers" IsBindable="true" IsSideEffecting="false" ReturnType="Collection(StandardODATA.AccountingRegister_Хозрасчетный_DrCrTurnover)">
<Parameter Name="bindingParameter" Type="StandardODATA.AccountingRegister_Хозрасчетный" />
<Parameter Name="AccountCondition" Type="Edm.String" />
<Parameter Name="BalancedAccountCondition" Type="Edm.String" />
<Parameter Name="BalancedExtraDimensions" Type="Edm.String" />
<Parameter Name="Condition" Type="Edm.String" />
<Parameter Name="Dimensions" Type="Edm.String" />
<Parameter Name="EndPeriod" Type="Edm.DateTime" />
<Parameter Name="ExtraDimensions" Type="Edm.String" />
<Parameter Name="StartPeriod" Type="Edm.DateTime" />
</FunctionImport>
</EntityContainer>
</Schema>
8. Serginio 941 25.10.16 14:27 Сейчас в теме
К сожалению VS их не подгружает. Но можно использовать CreateQuery. Но есть нюансы. Если сделать такой запрос

var query3 = context.CreateQuery<StandardODATA.AccountingRegister_Хозрасчетный_Turnover>(@"AccountingRegister_Хозрасчетный/Turnovers").ToList();


То 1С вернет такй тип

{

"odata.metadata": "http://localhost/DemoAccounting/odata/standard.odata/$metadata#Collection(StandardODATA.AccountingRegister_Хозрасчетный_Turnover)";,

"value": [


Для того, что бы программа поняла ответ нужно сделать такой запрос и программа не может привести Collection(StandardODATA.AccountingRegister_Хозрасчетный_Turnover)" к AccountingRegister_Хозрасчетный_Turnover

Поэтому создадим такой запрос

var query3 = context.CreateQuery<List<StandardODATA.AccountingRegister_Хозрасчетный_Turnover>>(@"AccountingRegister_Хозрасчетный/Turnovers").ToList();


То возвращается тип

query3 Count = 1 System.Collections.Generic.List<System.Collections.Generic.List<StandardODATA.AccountingRegister_Хозрасчетный_Turnover>>

Где вся коллекция лежит в первом элементе query3.Items[0]
9. Serginio 941 16.12.16 12:41 Сейчас в теме
10. user895038 19.03.18 23:42 Сейчас в теме
Правильно ли я понимаю, что через ODATA я могу получить только примитивные данные, хоть и используя фильтрацию.
Т.е. я не могу увидеть в номенклатуре родителя - только ссылку на него, а чтобы узнать Наименование родителя мне нужно выполнить следующий запрос, используя ранее полученный Guid?
А также, я не могу получить результат запроса к двум соединенным таблицам? Мне надо сначала отфильтровать первую таблицу, запомнить список данных связанного поля, а следующим запросом получить уже данные второй таблицы, послав в запросе весь запомненный список.
И уже только на клиенте я могу соединить две полученные таблицы.

Если это не устриавает, то надо использовать преднастроенные WS ссылки и SOAP
11. ture 613 29.10.18 11:20 Сейчас в теме
Odata это ведь стандарт такой?
Ну так и что же этому стандарту не соответствует всеми "любимая" 1С?

И так во всем, кстати.
Оставьте свое сообщение