Rest интерфейс 1с вытащить данные из регистра сведений
В 1С:Предприятие, начиная с версии 8.3.5, платформа автоматически может генерировать REST интерфейс для всей конфигурации. Он работает по протоколу OData и он позволяет работать со справочниками, документами и регистрами через web-сервер. В целом скорость получения данных на несколько порядков быстрее чем через COM или файлы, что не может не радовать.
Для разных операций используются разные запросы:
- GET – используется для получения данных;
- POST – используется для создания объектов;
- PATCH – модификация существующего объекта;
- DELETE – удаление объекта.
Для доступа к различным объектам используются префиксы:
- Справочник — Catalog;
- Документ — Document;
- Журнал документов — DocumentJournal;
- Константа — Constant;
- План обмена — ExchangePlan;
- План счетов — ChartOfAccounts
- План видов расчета — ChartOfCalculationTypes;
- План видов характеристик — ChartOfCharacteristicTypes;
- Регистр сведений — InformationRegister;
- Регистр накопления — AccumulationRegister;
- Регистр расчета — CalculationRegister;
- Регистр бухгалтерии — AccountingRegister;
- Бизнес-процесс — BusinessProcess;
- Задача — Task.
Используя протокол ODATA можно использовать так же и встроенные методы объектов, выполняя POST запросы.
- Для документа – Post() и Unpost();
- Для задачи – ExecuteTask();
- Для бизнес-процесса – Start();
- Для регистра сведений – SliceLast() и SliceFirst();
- Для регистра накопления и регистра бухгалтерии – Balance(), Turnovers() и BalanceAndTurnovers();
- Для регистра расчета – ScheduleData(), ActualActionPeriod(), () и Base().
Чтобы начать работать с этим интерфейсом нужно его опубликовать. Делается это через меню конфигуратора “Администрирование” – “Публикация на веб-сервере”, ставим галку “Публиковать стандартный интерфейс OData” и нажимаем “Опубликовать”.
Если после публикации REST интерфейса состав опубликованных данных пустой, то нужно воспользоваться методом УстановитьСоставСтандартногоИнтерфейсаOData. На входе у него 1 параметр типа “массив”. В массив нужно добавить метаданные, которые нужно опубликовать.
Состав = новый Массив;
Состав.Добавить(Метаданные.Справочники.Контрагенты);
УстановитьСоставСтандартногоИнтерфейсаOData(Состав);
Теперь, когда сама база опубликована и интерфейс работает корректно, можно запрашивать данные конкретного объекта метаданных, для примера возьмем справочник.
При запросе можно использовать следующие параметры:
select – в этом параметре указываем нужные нам поля;
format – задаём формат, в котором мы хотим получить ответ (XML или JSON), по умолчанию XML
odata – если нам в ответе не нужно описание метаданных, то пишем “odata=nometadata”
filter – тут указываем отборы.
Как я и писал выше, мы можем получить ответ в двух форматах XML или JSON, по умолчанию используется XML. Для того чтобы получить данные в формате JSON нужно к URL адресу добавить “?$format=application/json”.
В основном нам нужно получать конкретный элемент справочника, а не все его записи. Для этого используем волшебное слово “filter”.
Если вы обратили внимание, в URL-адресе указано два параметра $format и $filter, располагаться они могут в любом порядке, главное чтобы перед первым параметром был знак “?“, а перед вторым “&“. Логика тут такая, мы указываем адрес справочника в первой части, а параметры во второй. Эти части разделяются знаком “?“, а вот сами параметры между собой разделяются знаком “&“. Если изобразить схематически, то выглядит это так
АдресТаблицы?$Параметр1=ЗначениеПараметра1&$Параметр2=ЗначениеПараметра2
Если Вы уже знакомы с сериями об обмене справочниками и обмене документами, то уже догадываетесь/знаете, как мы "будем строить" наш обмен.
Перечислим процедуры и функции, которыми мы воспользуемся из предыдущих частей:
Итак, для начала, в модуль набора записей регистра сведений в процедуру ПриЗаписи мы вставим следующее:
Список необходимых функций обозначенных комментарием "новое служебное":
Вот и все - единственный нюанс передачи регистров, перед тем как передать запись надо подготовить под нее место - удалить уже существующую на сервере (если она есть).
Спасибо, что дочитали до конца! :)
Специальные предложения
(2) к сожалению (или к счастью) конвертирование на ходу на нашем проекте не понадобилось, поэтому пока конкретной идеи как ее реализовать нет. но фундаментом было получать правила конвертации из хранилищ (регистров), и соответственно транслировать одни объекты в другие
(3) можете выложить пример запроса для записи в любой из регистров: Сведений подчиненный регистратору, Накоплений или Бухгалтерский?
Плюсанул все три статьи - и позаимствовал куски кода, спасибо!
. Расширил у себя границы применения - ограничение "между идентичными конфигурациями" снимается достаточно простой доработкой: передаем (например, в структуре) все необходимые для формирования тела и заголовка запроса данные (такие как GUID, наименование объекта конфигурации базы-корреспондента, наименования и значения реквизитов для заполнения).
Есть ли гдето пример создания набора записей подчиненного регистратору регистра сведений через ODATA?
Просмотры 10665
Загрузки 0
Рейтинг 17
Создание 26.05.18 20:31
Обновление 26.05.18 20:31
№ Публикации 837106
Тип файла Нет файла
Конфигурация Конфигурации 1cv8
Операционная система Не имеет значения
Вид учета Не имеет значения
Доступ к файлу Бесплатно (free)
Код открыт Да
См. также
Обмен данными. Консистентность vs Многопоточность Промо
Рассмотрим теоретические основы обмена данными. Какие бывают обмены, какие гарантии при этом даются, зачем идти на компромиссы и что при этом может пойти не так. Есть ли идеальная схема?
03.09.2019 16305 m-rv 2
Переход с УПП на ERP с сохранением документов. Фантастика или реальность?
В последнее время задача перехода с УПП становится все более актуальной. Причина – ожидаемое снятие УПП с поддержки и более продвинутые возможности последних версий конфигураций 1С. О том, какие методики переноса данных из УПП в ERP можно применить, и как в автоматическом режиме убедиться, что все перенеслось корректно, на конференции Infostart Event 2021 Moscow Premiere рассказал Сергей Сорокин.
28.04.2022 686 primat 0
Выполнение синхронизации (обмен) по событию 1С (двусторонний обмен)
Выполнить синхронизацию(обмен) с другой базой 1С по событию в 1С (проведение документа). Запустить синхронизацию из другой базы 1С.
16.11.2021 2092 Swamt 0
Что делать, когда обмены между разными базами данных портят вам жизнь…
10.09.2021 2050 director04 9
Выгрузка документа по условию Промо
Что делать, если документы нужно выгружать не все подряд, а по какому-то фильтру: статусу, дате, набору условий. А что если он соответствовал этим условиям, а потом перестал? А если потом опять начал? Такие ситуации заставили попотеть не одного программиста.
25.04.2019 18348 m-rv 4
Описание формата 1С JDTO (JSON data transfer object)
Формат 1С JDTO может быть полезен для интеграции информационных баз 1С между собой, а также 1С с внешними системами. Публикация имеет своей целью помочь в освоении этого формата для обмена данными.
16.07.2021 7937 zhichkin 32
Распределенные алгоритмы РИБ 1С
Небольшое исследование на тему применимости классических распределённых алгоритмов репликации и синхронизации данных между узлами обмена РИБ 1С.
02.07.2021 1527 zhichkin 1
Особенности online-обмена между старыми и новыми типовыми
Столкнулся с неприятной особенностью потери части данных при обмене УСО (УПП) - ДО.
01.06.2021 3607 echo77 9
Повышаем эффективность разработки правил обмена Промо
Как повысить скорость и качество разработки правил обмена? Как вести групповую разработку правил обмена? Как облегчить сопровождение правил обмена после передачи в эксплуатацию? Об этом и многом другом вы можете узнать из этой статьи.
25.06.2018 30841 olegtymko 48
Добавление нового документа в формат обмена EnterpriseData (получение)
Данная статья - логическое продолжение (ссылка на первую часть ниже) доработки обмена, но уже на стороне базы приемника.
27.04.2021 1657 con-men 2
Добавление нового документа в формат обмена EnterpriseData (отправка)
Для меня встала задача добавить новый документ, созданный в расширении, в формат обмена EnterpriseData, между БП - УНФ. Изначальный поиск решения не дал результата. Методом проб и ошибок у меня сформировалось свое решение, которым спешу поделиться, чтобы систематизировать информацию в текст и услышать плюсы, минусы подхода. Все доработки осуществляются в расширении, в котором и был создан новый документ.
21.04.2021 3363 con-men 7
Правила обмена больше не нужны
Есть несколько общепринятых подходов к написанию обмена между 1С-системами, каждый из которых упирается в длительное изучение технологии, мучительную отладку правил конвертации и написание большого количества сервисного кода, в котором потом тяжело разобраться. О принципах работы универсального фреймворка liteExchange, который реализует быстрые обмены между 1С и внешними системами, и берет на себя всю техническую обвязку по стандартному преобразованию данных, на INFOSTART MEETUP Saint Petersburg.Online рассказал Николай Крылов.
17.03.2021 14907 Nikola23 40
Универсальный обмен между идентичными конфигурациями через REST интерфейс OData. Часть І: Справочники Промо
Сейчас все чаще интеграции различных конфигураций проектируются через HTTP-сервисы - они и работают быстрее, и "войти" в режим отладки гораздо проще, тем самым обойдя "черный ящик" универсального обмена через xml, например. Более года назад я начал работать в компании, в которой разработчики работали с конфигурациями 1С в режиме совместимости еще 8.2.16 (менять режим совместимости в типичных базах мы не хотели) - а как Вы наверное знаете, если интересовались HTTP-сервисами в 1С, их использование в режиме совместимости 8.3.4 и ниже недопустимо - и здесь я уже не надеялся на разработку и использование HTTP-сервисов. Но позже меня заинтересовал такой "сервис" как REST интерфейс OData, так как его можно использовать не меняя режим совместимости конфигурации - именно он и стал для меня идеальным вариантом решения "нетривиальных" задач.
Основные особенности программного кода этой функции:
5. Я сообщаю пользователю об ошибке в программном коде этой функции, когда получаю код ответа НЕ пределах 200-299. Дело в том, есть случай когда код ответа не равно 200, а 204 например и это не ошибка. Такой код можно получить, например если искомый ответ не найден по полям поиска или идентификационный номер.
В качестве сервера будет выступать опубликованная на веб-сервере БД с именем WebBuh (Демо-база “Бухгалтерия Предприятия 3.0”).
Пример №1 Создать новый элемент справочника если он не найден по идентификационному номеру или по полям поиска
При обмене данными , часто возникает вопрос о создании нового объекта справочника, только в том случае если его. Сначала я буду искать его в базе приемника по идентификационному номеру, а затем по полям поиска. Если его нет , то я его добавлю его в базе приемника с таким же идентификационный номер как в базе источника . Для иллюстрации этого примера я использую простой справочник, который имеет только код и наименования, например Классификатор Стран Мира
Пример №2 Запись в периодическом регистре сведения
В этом примере будет показано как выполнить запись в периодическом и независимом регистре сведения. Работа с зависимыми от документа регистрами не имеет практического смысла, так как запись в этих регистрах происходит в процедуре обработки проведения в модуле объекта документа, которая вызывается при проведении документа.
В качестве примера я буду использовать регистр сведения Документы физических лиц.
Рис 1 Структура регистра сведения Документы физ лиц
Данный регистр является независимым и периодическим в пределах дня.
Особенность записи регистра через протокол odata с помощью технологии интеграции Rest – интерфейс платформы 1С заключается в том, что отсутствие режим замещения существующей записи с тем же набором значений измерений регистра и с тем же периодом (для периодических регистров). Иными словами, если запись регистра сведений с таким набором существует, то невозможно выполнять замещение и приходится сначала удалить запись, а затем добавить. Возможно в будущих платформах 1С такая возможность появится .Однако, на сколько мне известно последнее расширение поддержки протокола OData Реализовано в версии 8.3.8.1652.
В следующем программном коде, мы будем выполнять сначала метод DELETE, а затем метод POST.
Для сокращения программного кода будем считать, что все объекты ссылочного типа ( ВидДокумента_Key и ФизическоеЛицо_Key ) , на которые ссылается регистр сведения добавлены в базе приемника с помощью программного кода примера №1
Главной особенностью архитектуры RESTAPI является то, что при каждом обращении сервер, принимающий запрос, думает, что принял это соединение впервые! То есть при каждом запросе передается уникальный ключ авторизации, который идентифицирует сессию.
Есть несколько основных типов запросов архитектуры REST:
- GETзапрос (получает данные);
- PUTзапрос (передает данные);
- POSTзапрос (меняет данные);
Все эти типы используются в RESTAPI.
Сервер, получая запросы RESTAPI, определяет их тип и понимает, что будет происходить с переданными ему данными. Для того чтобы взаимодействовать с определенным API необходимо зайти на его страницу и изучить документацию. В ней обычно указывается, какие методы доступны для взаимодействия, какие данные и как принимает сервер, пример ответа на функции.
2. Подключение к серверу 1С
На реальном примере это выглядит так: для начала мы создаем подключение к серверу 1С, используя параметры, хранимые, скажем, в константе (адрес сервера, ключ подключения).
Используя функцию добавления параметров к запросу, добавляем необходимые значения. Лично я всегда использую эту функцию для удобства формирования строки запроса. С ее помощью можно легко добавить большое количество разных параметров. Но строку с параметрами можно и вручную написать.
3. Формат данных json
"name": "Датчик движения",
Итак, получаем ответ от сервера:
Обрабатываем json, который содержится в теле ответа. Структура предполагаемых данных хранится, конечно же, в документации к api. Поэтому при чтении json мы точно знаем, к какому полю обратится.
Ответ сервера как массив данных (прочитанный json) мы передаем в функцию, которая записывает результат в базу данных 1С:Предприятие. В нашем примере структура данных 1С (метаданные) почти полностью совпадает по именам с названием формата данных json.
По имени метода определяем справочник, в который будет происходить загрузка. И по id, переданному из сервиса, по реквизиту пытаемся найти элемент справочника.
В итоге мы имеем связь, которую обеспечивает шина данных api сервера. На сервер мы передаем параметры подключения, которые идентифицируют сессию и параметры запроса, а в ответ получаем необходимые данные, которые обрабатываем в процессе синхронизации любым удобным для нас способом.
Полученные данные мы записываем в нужный объект данных. В нашем случае - «Справочник» или «Регистр сведений».
Таким образом, restapi – пример описанного набора команд на стороне архитектуры сервера с базой данных. Передавая имя метода и параметры, мы вызываем определенную функцию, которая может обработать переданные в параметрах данные (например, записать их в базу данных сервера) или вернуть нам запрошенные данные из своей базы. Вот так просто.
Специалист компании ООО «Кодерлайн»
Вас могут заинтересовать следующие статьи:
94 [PROP_CODE] => TAGS2 [TITLE] => Вас могут заинтересовать следующие семинары: ) --> 95 [PROP_CODE] => TAGS [TITLE] => Вас могут заинтересовать следующие вебинары: ) -->
Вас могут заинтересовать следующие вебинары:
Появилась необходимость «подружить» 1С справочники конфигураций и в силу того, что эти конфигурации отличаются платформами, на которых работают, соединение через COM не работает, пришла идея использовать интерфейс 1С OData, который по итогу для такой задачи оказался более быстрым решением, нежели создание правил обмена данными.
1. Как работает OData в 1С?
После его публикации нам становится доступен интерфейс, к которому мы уже можем обращаться через браузер. Но увы, данные объектов конфигурации 1С сейчас «нащупать» не удастся. Для того чтобы открыть доступ к объектам, необходимо воспользоваться функцией:
В МассивОбъектов необходимо поместить метаданные файла, например, так:
МассивОбъектов =Новый Массив;
После этого мы можем считать, что базу-«приемник» мы уже настроили. Теперь необходимо наладить передачу данных. Стоит упомянуть, что конфигурации у нас переписанные, так что мы добавили в нужный нам справочник реквизит для гуида из передатчика. Добавили константы для передатчика, чтобы можно было легко менять базы с тестовой на боевую.
Адрес, // сервер (хост)
Логин, // пользователь для доступа к серверу
Пароль, // пароль для доступа к серверу
, // здесь указывается прокси, если он есть
, // таймаут в секундах, 0 или пусто - не устанавливать
Далее код, который сам обмен и проводит:
ТелоЗапроса = "/" + База+ "/odata/standard.odata/Catalog_Портфели?$filter=ГУИД_УПП eq '" + Ссылка.УникальныйИдентификатор() + "'&$format=json";
В коде выше мы просто создаем запрос по соединению, который обращается к справочнику портфели с фильтром по Гуиду 1С. Также указываем, что ответ нам необходим в формате данных json. В ответе мы получаем нужный нам элемент. В случае если он пустой, значит необходимо создавать новый, иначе обновлять.
ЧтениеJson = Новый ЧтениеJSON;
Если Массив.Количество() = 0 Тогда
//Заголовки для запросов
Заголовки = Новый Соответствие();
Если Ref_Key = Неопределено Тогда //СоздатьНовыйЭлемент
ЗапросHTTP = Новый HTTPЗапрос( "/" + База+ "/odata/standard.odata/Catalog_аск_Портфели?$format=json", Заголовки);
ЗапросHTTP = Новый HTTPЗапрос( "/" + База+ "/odata/standard.odata/Catalog_аск_Портфели(guid'"+ Ref_Key + "')?$format=json", Заголовки);
Если результат пустой, то нам необходим POST запрос 1С. В нем нам не нужно указывать конкретный элемент, который мы хотим создать. А вот с патчем ситуация другая. Необходимо строго указать элемент. Для этого воспользуемся гуидом 1С, который мы уже получили в ответе. Вне зависимости от этого нам необходимо создать данные для записи. Этим мы дальше и занимаемся.
//Формируем данные для записи
ЗаписьJSON = Новый ЗаписьJSON;
ПараметрыJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Авто,"",Истина);
Структура = Новый Структура;
ЗаписатьJSON(ЗаписьJSON, Структура); // ОтправляемыеДанные обязательны в этом случае
//Отправляем запрос на обновления или создания
СтруктураОтвета = Новый Структура;
Выше мы отправляем это в наш приемник. Если удалось получить ответ сервера, который находится в диапазоне между 200 и 299 включительно, – обмен прошел, чего не скажешь об остальных кодах.
"Ошибка "+ ОтветHTTP.КодСостояния+ символы.ПС+ОтветHTTP.ПолучитьТелоКакСтроку("UTF-8"));
//Сообщить(" Ошибка "+ ОтветHTTP.КодСостояния+ символы.ПС+ОтветHTTP.ПолучитьТелоКакСтроку("UTF-8"));
Помимо таких простых обменов справочниками сейчас можно создавать записи в регистрах сведений, создавать документы и даже проводить их. Об этом, возможно, мы подробно расскажем в следующих статьях.
Специалист компании ООО «Кодерлайн»
Вас могут заинтересовать следующие статьи:
94 [PROP_CODE] => TAGS2 [TITLE] => Вас могут заинтересовать следующие семинары: ) --> 95 [PROP_CODE] => TAGS [TITLE] => Вас могут заинтересовать следующие вебинары: ) -->
Вас могут заинтересовать следующие вебинары:
Читайте также: