Linq to ODATA
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
Хорошая статья по публикации находится здесь
Для того, что бы редактировать состав стандартного интерфейса можно воспользоваться обработкой
//sale.itcity.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
