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

См. также

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

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

15.11.2022    16742    17    SQV0    48    

35

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

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

84000 руб.

19.08.2020    23329    21    1    

24

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

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

48000 руб.

16.11.2018    30317    21    31    

22

Производство готовой продукции (работ, услуг) Внешние источники данных Платформа 1С v8.3 1С:Управление нашей фирмой 1.6 Лесное и деревообрабатывающее хозяйство Россия Управленческий учет Платные (руб)

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

10200 руб.

24.06.2021    19840    53    53    

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

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

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



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


А вот Internet Explorer тоже не дает открыть эту ссылку. В чем может быть дело? IIS неправильно настроен?
6. Serginio 940 20.09.16 11:10 Сейчас в теме
Логин и пароль должны быть на латинице
7. Serginio 940 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 940 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 940 16.12.16 12:41 Сейчас в теме
10. user895038 19.03.18 23:42 Сейчас в теме
Правильно ли я понимаю, что через ODATA я могу получить только примитивные данные, хоть и используя фильтрацию.
Т.е. я не могу увидеть в номенклатуре родителя - только ссылку на него, а чтобы узнать Наименование родителя мне нужно выполнить следующий запрос, используя ранее полученный Guid?
А также, я не могу получить результат запроса к двум соединенным таблицам? Мне надо сначала отфильтровать первую таблицу, запомнить список данных связанного поля, а следующим запросом получить уже данные второй таблицы, послав в запросе весь запомненный список.
И уже только на клиенте я могу соединить две полученные таблицы.

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

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