28.08.2019 Роман Барабанов 26793
Пример обмена 1С OData

Содержание:

1. Как работает OData в 1С?

2. Соединение с http-сервером

   

Появилась необходимость «подружить» 1С справочники конфигураций и в силу того, что эти конфигурации отличаются платформами, на которых работают, соединение через COM не работает, пришла идея использовать интерфейс 1С OData, который по итогу для такой задачи оказался более быстрым решением, нежели создание правил обмена данными.  


1. Как работает OData в 1С?


Все начинается с публикации базы. OData это, по сути, сервис, который позволяет видеть метаданные в ответах на 1С http запросы. Чтобы его включить, необходимо опубликовать базу. Можно не всю и не полностью, а только данный сервис.



 

После его публикации нам становится доступен интерфейс, к которому мы уже можем обращаться через браузер. Но увы, данные объектов конфигурации 1С сейчас «нащупать» не удастся. Для того чтобы открыть доступ к объектам, необходимо воспользоваться функцией: 


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

В МассивОбъектов необходимо поместить метаданные файла, например, так:

МассивОбъектов =Новый Массив;

МассивОбъектов.Добавить(Метаданные.Справочники.Номенклатура);


После этого мы можем считать, что базу-«приемник» мы уже настроили. Теперь необходимо наладить передачу данных. Стоит упомянуть, что конфигурации у нас переписанные, так что мы добавили в нужный нам справочник реквизит для гуида из передатчика. Добавили константы для передатчика, чтобы можно было легко менять базы с тестовой на боевую.

 

2. Cоединение с http-сервером

 

Так как нам необходимо открыть соединение с http-сервером делаем это стандартным образом:


      Адрес = Константы.код_АдресODataДО.Получить();

      Логин = Константы.код_ЛогинOData.Получить();

      Пароль = Константы.код_ПарольOData.Получить();

     

      Соединение = Новый HTTPСоединение(

      Адрес, // сервер (хост)

      80, // порт

      Логин, // пользователь для доступа к серверу

      Пароль, // пароль для доступа к серверу

      , // здесь указывается прокси, если он есть

      , // таймаут в секундах, 0 или пусто - не устанавливать

      // защищенное соединение, если используется https

      );

Далее код, который сам обмен и проводит:


ТелоЗапроса = "/" + База+ "/odata/standard.odata/Catalog_Портфели?$filter=ГУИД_УПП eq '" + Ссылка.УникальныйИдентификатор() + "'&$format=json";

      Запрос = Новый HTTPЗапрос(ТелоЗапроса);

      Результат = Соединение.Получить(Запрос);

      Ответ = Результат.ПолучитьТелоКакСтроку();

     

В коде выше мы просто создаем запрос по соединению, который обращается к справочнику портфели с фильтром по Гуиду 1С. Также указываем, что ответ нам необходим в формате данных json. В ответе мы получаем нужный нам элемент. В случае если он пустой, значит необходимо создавать новый, иначе обновлять.

 

      ЧтениеJson = Новый ЧтениеJSON;

      ЧтениеJson.УстановитьСтроку(Ответ);

      Соответствие = ПрочитатьJSON(ЧтениеJSON,Истина);

      Массив= Соответствие["value"];

      Если Массив.Количество() = 0 Тогда

            Ref_Key = Соответствие["Ref_Key"]

      Иначе

            Ref_Key = Массив[0]["Ref_Key"];

      КонецЕсли;

     

      //Заголовки для запросов

      Заголовки = Новый Соответствие();

      Заголовки.Вставить("Content-Type", "application/json");

      Если Ref_Key = Неопределено Тогда //СоздатьНовыйЭлемент

            ЗапросHTTP = Новый HTTPЗапрос( "/" + База+ "/odata/standard.odata/Catalog_аск_Портфели?$format=json", Заголовки);

            HTTPМетод = "POST";

      Иначе   //ОбновляемЭлемент                                    

            ЗапросHTTP = Новый HTTPЗапрос( "/" + База+ "/odata/standard.odata/Catalog_аск_Портфели(guid'"+ Ref_Key + "')?$format=json", Заголовки);

            HTTPМетод = "PATCH";

      КонецЕсли;


Если результат пустой, то нам необходим POST запрос 1С. В нем нам не нужно указывать конкретный элемент, который мы хотим создать. А вот с патчем ситуация другая. Необходимо строго указать элемент. Для этого воспользуемся гуидом 1С, который мы уже получили в ответе. Вне зависимости от этого нам необходимо создать данные для записи. Этим мы дальше и занимаемся.

     

      //Формируем данные для записи

      ЗаписьJSON = Новый ЗаписьJSON;

      ПараметрыJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Авто,"",Истина);    

      ЗаписьJSON.УстановитьСтроку(ПараметрыJSON);

      Структура = Новый Структура;

      Структура.Вставить("Description",Ссылка.Наименование);

      Структура.Вставить("Code",Ссылка.Код);

      Структура.Вставить("ГУИД_УПП",Строка(Ссылка.Ссылка.УникальныйИдентификатор()));

      Структура.Вставить("DeletionMark",Ссылка.ПометкаУдаления);

      ЗаписатьJSON(ЗаписьJSON, Структура); // ОтправляемыеДанные обязательны в этом случае

      СтрокаДляТела = ЗаписьJSON.Закрыть();

     

      //Отправляем запрос на обновления или создания

      ЗапросHTTP.УстановитьТелоИзСтроки(СтрокаДляТела,КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);

      ОтветHTTP = Соединение.ВызватьHTTPМетод(HTTPМетод, ЗапросHTTP);

      СтруктураОтвета = Новый Структура;

      СтруктураОтвета.Вставить("КодСостояния", ОтветHTTP.КодСостояния);

     

Выше мы отправляем это в наш приемник. Если удалось получить ответ сервера, который находится в диапазоне между 200 и 299 включительно, – обмен прошел, чего не скажешь об остальных кодах.

 

      Если ОтветHTTP.КодСостояния < 200 или ОтветHTTP.КодСостояния >= 300 Тогда

            ЗаписьЖурналаРегистрации("ОбменСДО-oData",УровеньЖурналаРегистрации.Ошибка,ПланыОбмена.oDataДокументооборот,Ссылка,

            "Ошибка "+ ОтветHTTP.КодСостояния+ символы.ПС+ОтветHTTP.ПолучитьТелоКакСтроку("UTF-8"));

            //Сообщить(" Ошибка "+ ОтветHTTP.КодСостояния+ символы.ПС+ОтветHTTP.ПолучитьТелоКакСтроку("UTF-8"));

            Возврат Ложь;

      Иначе

            Возврат Истина;

      КонецЕсли;

     

Помимо таких простых обменов справочниками сейчас можно создавать записи в регистрах сведений, создавать документы и даже проводить их. Об этом, возможно, мы подробно расскажем в следующих статьях.


Специалист компании ООО «Кодерлайн» 

Роман Барабанов.

Наши проекты

Автоматизация кадрового учета на базе «1С:ERP Управление предприятием 2.0»
Автопредприятие ПАО «Газпром»

Отрасль:
Транспорт

Внедренное типовое решение:
1С:ERP Управление предприятием 2.0

- Настройка подсистемы кадрового учета;
- Перенос персональных данных;
- Заполнение НСИ и классификаторов. ...

Автоматизации учета затрат и расчета себестоимости с использованием конфигурации «Koderline: Управление проектами строительства скважин»
ООО «Буровая сервисная компания «ГРАНД»

Отрасль:
Нефтесервис

Внедренное типовое решение:
«Koderline: Управление проектами строительства скважин»

Учет и планирование:
- собственную разработку компании «Кодерлайн» – конфигурацию «Koderline: Управление проектами строительства скважин»...

ООО «Лаборатория успеха»
ООО «Лаборатория успеха»

Отрасль:
Общественное и плановое питание, гостиничный бизнес, туризм

Внедренное типовое решение:
1С:Зарплата и управление персоналом 8. КОРП

Кадровый учет;
Расчет зарплаты;...

ООО «Стейдж Энтертейнмент Россия»
ООО «Стейдж Энтертейнмент Россия»

Отрасль:
Театральная деятельность

Внедренное типовое решение:
Платформа 1С:Предприятие 8

Реализован процесс трансформации данных бухгалтерского учета по РСБУ в данные международного учета (ГААП) на платформе «1С:Предприятие 8»:...

ООО «Мир Аксиомы»
ООО «Мир Аксиомы»

Отрасль:
Аудиторские и консалтинговые услуги

Внедренное типовое решение:
1С:Бухгалтерия КОРП

- Бухгалтерский учет:
Банк и касса
Завершение периода
Нематериальные активы
Расчеты с контрагентами
Регламентированная ...

Внедрение «1С:Зарплата и управление персоналом 8 КОРП» в компании «ПБК»
ООО «Партнер Бухгалтер Консультант»

Отрасль:
Бухгалтерские услуги

Внедренное типовое решение:
1С:Зарплата и управление персоналом

- Интеграция продукта с базой данных оперативного учета Axapta;
- Доработка функционала подсистемы...

Группа компаний АО «Киномакс»
Группа компаний АО «Киномакс»

Отрасль:
Культура, шоу-бизнес

Внедренное типовое решение:
БИТ.Финанс

- Разработка Положения о Казначействе группы компаний
- Разработка Положения об управлении договорами группы компаний ...

Московский филиал ООО «Авиакомпания «Икар»
Московский филиал ООО «Авиакомпания «Икар»

Отрасль:
Авиаперевозки

Внедренное типовое решение:
1С:Бухгалтерия КОРП

Бухгалтерский учет Производственные операции Регламентированная отчетность Учет в обособленных подразделениях Налоговый учет ...

Внедрение блока расчета себестоимости РАУЗ в 1С:УПП 8
ООО «Пелигрин Матен»

Отрасль:
Производство

Внедренное типовое решение:
1С:Управление производственным предприятием

– Оформление заказов покупателей;
– Взаиморасчеты с покупателями;
– Оформление заказов поставщикам;
– Управление отношениями с ...

ЗАО «Многопрофильная формирующая авиагруппа» (ЗАО МФГ)
ЗАО «Многопрофильная формирующая авиагруппа» (ЗАО МФГ)

Отрасль:
Оптовая торговля транспортными средствами и оборудованием

Внедренное типовое решение:
1С:Бухгалтерия ПРОФ

- Финансы, управленческий учет, мониторинг показателей
- Бухгалтерский учет:
- Банк и касса...

ООО “РТИТС”
ООО “РТИТС”

Отрасль:
Транспортные системы

Внедренное типовое решение:
1С:ERP Управление предприятием 2.0

Блок регламентированного кадрового учета и расчета заработной платы в 1С:ERP;
Согласование договоров, командировок в ДО;
Контроль испо...

ООО «Вистеон Автоприбор Электроникс»
ООО «Вистеон Автоприбор Электроникс»

Отрасль:

Внедренное типовое решение:
1C:Управление производственным предприятием

- Управленческий учет; - Расчет зарплаты; - Логистика адресного склада; - Учет брака; - Оперативный учет ТМЦ; - РСБУ (БУ и НУ); ...

Наши соц. сети

Telegram-канал «Koderline 1С» Группа в Вконтакте «Кодерлайн КОРП» Rutube

Остались вопросы - обратитесь к нам!

Впишите свои Имя и Телефон, чтобы мы ответили на все интересующие Вас вопросы.
ФИО*
E-mail*
Телефон*
Сообщение