Contents
Идея
Мне давно хотелось попробовать в PowerApps создать пользовательские подключения для тех случаев, когда стандартных источников данных недостаточно. Первое, что пришло мне на ум из сторонних систем, работающих с OData, был 1C. Это достаточно распространенная система в России и было бы полезно иметь возможность подключаться к ней из облачных сервисов Microsoft. В компании AWARA-IT сильная практика 1С, поэтому мы без труда смогли развернуть тестовую среду для проверки работы такой архитектуры.
Настройку OData в 1С я не буду рассматривать в этой статье. Важно, чтобы адрес был доступен во внешней сети. Например, такого вида:
http://ХХХХ/BuhDemo/odata/standard.odata/
Конфигурация базы не имеет значения. Я не претендую на правильность заполнения реквизитов документов 1С в этой статье, все действия по созданию и изменению записей являются лишь примером успешных вызовов команд, которые меняют данные в 1С. В реальной жизни вы можете подобрать нужную конфигурацию 1С и заполнять те атрибуты, которые необходимы для ваших бизнес-задач.
Для проверки работы с 1С я попробую вызвать несколько самых распространенных команд: чтение списка документов, создание документа, обновление табличной части.
Пользовательские соединители (Custom Connectors)
Итак, давайте зайдем в PowerApps и найдем там раздел с пользовательскими подключениями.
Создадим подключение с нуля
В открывшемся окне введем общие данные о подключении.
В разделе «Безопасность» выбираем тип проверки подлинности и название атрибутов логина и пароля.
ВНИМЕНИЕ!! Не нужно писать здесь реальный логин и пароль, это просто названия атрибутов, пишите просто login, password.
Чтение списка документов
Далее переходим к главному разделу – Определение. Прочитаем список авансовых отчетов. Для этого создадим действие чтения и внесем его название, описание и название метода.
Теперь укажем адрес вызова и заголовки. http://XXXX/BuhDemo/odata/standard.odata/Document_АвансовыйОтчет
Чтобы указать ответ, нужно выполнить запрос из какого-нибудь клиента, например, в Restlet Client для Chrome.
Для импорта примера достаточно одной строки из списка документов, остальные значения из JSON результата можно удалить. Так же можно удалить атрибуты «odata.metadata». В результате должно получиться вот что:
{
"value": [
{
"Ref_Key": "faf65bf1-966d-11e9-80e4-441ea1539724",
"DataVersion": "AAAAAAACmiU=",
"DeletionMark": false,
"Number": "КП00-000001",
"Date": "2019-06-24T00:00:00",
"Posted": false,
"ВалютаДокумента_Key": "a8c61b74-cc0d-11e5-9653-3085a93ddca2",
"Комментарий": "",
"КурсДокумента": 1,
"КратностьДокумента": "1",
"Организация_Key": "8a276db6-ce58-11e5-982d-14dae9b19a48",
"Склад_Key": "c23de3dc-cc0d-11e5-9653-3085a93ddca2",
"СуммаВключаетНДС": true,
"СуммаДокумента": 3200,
"ТипЦен_Key": "00000000-0000-0000-0000-000000000000",
"УдалитьУчитыватьНДС": true,
"ФизЛицо_Key": "8a276dc7-ce58-11e5-982d-14dae9b19a48",
"Ответственный_Key": "aa00559e-ad84-4494-88fd-f0826edc46f0",
"НДСВключенВСтоимость": true,
"НазначениеАванса": "",
"КоличествоДокументов": "",
"КоличествоЛистов": "",
"РучнаяКорректировка": false,
"ПодразделениеОрганизации_Key": "00000000-0000-0000-0000-000000000000",
"НДСНеВыделять": false,
"ВыданныеАвансы": [
],
"Товары": [
],
"ВозвратнаяТара": [
],
"ОплатаПоставщикам": [
],
"Прочее": [
{
"Ref_Key": "faf65bf1-966d-11e9-80e4-441ea1539724",
"LineNumber": "1",
"ВидДокВходящий": "Билет",
"НомерВходящегоДокумента": "",
"ДатаВходящегоДокумента": "0001-01-01T00:00:00",
"Поставщик_Key": "00000000-0000-0000-0000-000000000000",
"СчетФактура_Key": "00000000-0000-0000-0000-000000000000",
"Номенклатура_Key": "00000000-0000-0000-0000-000000000000",
"Содержание": "Билет С.Петербург - Балашов 222",
"Сумма": 3200,
"СтавкаНДС": "НДС18",
"СуммаНДС": 0,
"СчетЗатрат_Key": "00000000-0000-0000-0000-000000000000",
"Субконто1": "",
"Субконто1_Type": "StandardODATA.Undefined",
"Субконто2": "",
"Субконто2_Type": "StandardODATA.Undefined",
"Субконто3": "",
"Субконто3_Type": "StandardODATA.Undefined",
"СчетЗатратНУ_Key": "00000000-0000-0000-0000-000000000000",
"СубконтоНУ1": "",
"СубконтоНУ1_Type": "StandardODATA.Undefined",
"СубконтоНУ2": "",
"СубконтоНУ2_Type": "StandardODATA.Undefined",
"СубконтоНУ3": "",
"СубконтоНУ3_Type": "StandardODATA.Undefined",
"ОтражениеВУСН": "",
"СчетУчетаНДС_Key": "00000000-0000-0000-0000-000000000000",
"ПредъявленСФ": false,
"ДатаСФ": "0001-01-01T00:00:00",
"НомерСФ": "",
"ПодразделениеЗатрат_Key": "00000000-0000-0000-0000-000000000000",
"БланкСтрогойОтчетности": false,
"СпособУчетаНДС": ""
}
],
"ВалютаДокумента@navigationLinkUrl": "Document_АвансовыйОтчет(guid'faf65bf1-966d-11e9-80e4-441ea1539724')/ВалютаДокумента",
"Организация@navigationLinkUrl": "Document_АвансовыйОтчет(guid'faf65bf1-966d-11e9-80e4-441ea1539724')/Организация",
"Склад@navigationLinkUrl": "Document_АвансовыйОтчет(guid'faf65bf1-966d-11e9-80e4-441ea1539724')/Склад",
"ФизЛицо@navigationLinkUrl": "Document_АвансовыйОтчет(guid'faf65bf1-966d-11e9-80e4-441ea1539724')/ФизЛицо",
"Ответственный@navigationLinkUrl": "Document_АвансовыйОтчет(guid'faf65bf1-966d-11e9-80e4-441ea1539724')/Ответственный"
}
]
}
Прописываем это в пример ответа.
Если нажать на название ответа, можно посмотреть какие поля определены.
Пришло время проверить как работает наш метод. Сохраните подключение перед тестированием. Переходим в раздел тестирования. Для начала нужно создать подключение на основе вашего определения.
Здесь как раз придется указать логин и пароль от вашей базы 1С.
После создания вас перекинет на раздел подключений, поэтому нужно будет вернуться обратно к определению своего подключения, в раздел тестирования. Выбираем подключение, указываем значение заголовка и вызываем операцию.
Смотрим, что нам возвращает вызов. Если что-то пошло не так, нужно вернуться в определения и исправить запрос или ответ.
После этого создать новое подключение на основе этого определения, старое можно безболезненно удалить и проверить вызов снова.
Создание документа
Теперь рассмотрим вариант, когда нужно создать новый документ в 1С. В нашем случае мы будем создавать документ Авансового отчета. Для этого нужно настроить новое действие.
Настройки запроса выглядят следующим образом. URL адрес: http://XXXX/BuhDemo/odata/standard.odata/Document_АвансовыйОтчет
{
"ВалютаДокумента_Key": "a8c61b74-cc0d-11e5-9653-3085a93ddca2",
"Организация_Key": "8a276db6-ce58-11e5-982d-14dae9b19a48",
"Склад_Key": "c23de3dc-cc0d-11e5-9653-3085a93ddca2",
"ФизЛицо_Key": "8a276dc7-ce58-11e5-982d-14dae9b19a48",
"ДатаНачалаКомандировки":"2019-06-23T00:00:00",
"ДатаОкончанияКомандировки":"2019-06-26T00:00:00"
}
В ответе удаляем атрибут «odata.metadata» и прописываем следующее:
{
"Ref_Key": "90bd5e08-a281-11e9-80e4-441ea1539724",
"DataVersion": "AAAAAAACmqc=",
"ФизЛицо_Key": "8a276dc7-ce58-11e5-982d-14dae9b19a48",
"Организация_Key": "8a276db6-ce58-11e5-982d-14dae9b19a48",
"КурсДокумента": 1,
"СуммаДокумента": 0,
"ТипЦен_Key": "00000000-0000-0000-0000-000000000000",
"Number": "КП00-000020",
"Date": "2019-07-09T00:00:00",
"НазначениеАванса": "",
"КоличествоДокументов": "",
"ВалютаДокумента_Key": "a8c61b74-cc0d-11e5-9653-3085a93ddca2",
"DeletionMark": false,
"КоличествоЛистов": "",
"Posted": false,
"СуммаВключаетНДС": true,
"Склад_Key": "c23de3dc-cc0d-11e5-9653-3085a93ddca2",
"КратностьДокумента": "1",
"УдалитьУчитыватьНДС": true,
"Ответственный_Key": "77658e1f-9d93-11e9-80e4-441ea1539724",
"НДСВключенВСтоимость": true,
"Комментарий": "",
"ВыданныеАвансы": [
],
"РучнаяКорректировка": false,
"НДСНеВыделять": false,
"ПодразделениеОрганизации_Key": "00000000-0000-0000-0000-000000000000",
"Товары": [
],
"ВозвратнаяТара": [
],
"ОплатаПоставщикам": [
],
"Прочее": [
],
"ВалютаДокумента@navigationLinkUrl": "Document_АвансовыйОтчет(guid'90bd5e08-a281-11e9-80e4-441ea1539724')/ВалютаДокумента",
"Склад@navigationLinkUrl": "Document_АвансовыйОтчет(guid'90bd5e08-a281-11e9-80e4-441ea1539724')/Склад",
"ФизЛицо@navigationLinkUrl": "Document_АвансовыйОтчет(guid'90bd5e08-a281-11e9-80e4-441ea1539724')/ФизЛицо",
"Организация@navigationLinkUrl": "Document_АвансовыйОтчет(guid'90bd5e08-a281-11e9-80e4-441ea1539724')/Организация",
"Ответственный@navigationLinkUrl": "Document_АвансовыйОтчет(guid'90bd5e08-a281-11e9-80e4-441ea1539724')/Ответственный"
}
Обновим соединитель и создадим новое подключение в разделе тестирования.
Создаем новое подключение с новым действием.
Если все нормально, то получаем код ответа 201 и радуемся.
Обновление табличной части
Осталось проверить как работает обновление табличной части. Для этого нужно так же определить новое действие.
URL адрес: http://XXXX/BuhDemo/odata/standard.odata/Document_АвансовыйОтчет('{EntityID}')
EntityID будет параметром, который будет передаваться в запрос. Это ID документа, у которого будет меняться табличная часть «Прочее».
Тело запроса:
{
"ВидОперации ":"Прочее",
"Прочее": [
{
"Ref_Key": "a9e8b422-1cda-11e6-a31d-14dae9b19a48",
"LineNumber": "1",
"ВидДокВходящий": "Билет",
"Содержание": "Билет С.Петербург - Балашов",
"Сумма": 3200,
"СтавкаНДС": "НДС18",
"СуммаНДС": 488.14
}
]
}
Важно, что табличная часть каждый раз перезаписывается и нужно проставлять самим номера строк, что очень неудобно. Об этом я расскажу в следующей статье, когда буду создавать приложение для работы с этим подключением.
Определяем ответ
{
"Товары": [
],
"ВозвратнаяТара": [
],
"ОплатаПоставщикам": [
],
"Прочее": [
{
"LineNumber": "1",
"ВидДокВходящий": "Билет",
"НомерВходящегоДокумента": "",
"ДатаВходящегоДокумента": "0001-01-01T00:00:00",
"Поставщик_Key": "00000000-0000-0000-0000-000000000000",
"СчетФактура_Key": "00000000-0000-0000-0000-000000000000",
"Номенклатура_Key": "00000000-0000-0000-0000-000000000000",
"Содержание": "Билет С.Петербург - Балашов",
"Сумма": 3200,
"СтавкаНДС": "НДС18",
"СуммаНДС": 488.14,
"СчетЗатрат_Key": "00000000-0000-0000-0000-000000000000",
"Субконто1": "",
"Субконто1_Type": "StandardODATA.Undefined",
"Субконто2": "",
"Субконто2_Type": "StandardODATA.Undefined",
"Субконто3": "",
"Субконто3_Type": "StandardODATA.Undefined",
"СчетЗатратНУ_Key": "00000000-0000-0000-0000-000000000000",
"СубконтоНУ1": "",
"СубконтоНУ1_Type": "StandardODATA.Undefined",
"СубконтоНУ2": "",
"СубконтоНУ2_Type": "StandardODATA.Undefined",
"СубконтоНУ3": "",
"СубконтоНУ3_Type": "StandardODATA.Undefined",
"ОтражениеВУСН": "",
"СчетУчетаНДС_Key": "00000000-0000-0000-0000-000000000000",
"ПредъявленСФ": false,
"ДатаСФ": "0001-01-01T00:00:00",
"НомерСФ": "",
"ПодразделениеЗатрат_Key": "00000000-0000-0000-0000-000000000000",
"БланкСтрогойОтчетности": false,
"СпособУчетаНДС": ""
}
],
"Ref_Key": "a9e8b422-1cda-11e6-a31d-14dae9b19a48",
"DataVersion": "AAAAAAACmqk=",
"Склад_Key": "00000000-0000-0000-0000-000000000000",
"СуммаВключаетНДС": true,
"СуммаДокумента": 3200,
"КурсДокумента": 1,
"ТипЦен_Key": "00000000-0000-0000-0000-000000000000",
"УдалитьУчитыватьНДС": false,
"КратностьДокумента": "1",
"ФизЛицо_Key": "00000000-0000-0000-0000-000000000000",
"Date": "2016-03-09T00:00:00",
"Number": "КП00-000001",
"Posted": true,
"Комментарий": "",
"Организация_Key": "00000000-0000-0000-0000-000000000000",
"DeletionMark": false,
"ВалютаДокумента_Key": "00000000-0000-0000-0000-000000000000",
"РучнаяКорректировка": false,
"НДСВключенВСтоимость": false,
"НазначениеАванса": "",
"Ответственный_Key": "00000000-0000-0000-0000-000000000000",
"КоличествоДокументов": "",
"КоличествоЛистов": "",
"НДСНеВыделять": false,
"ПодразделениеОрганизации_Key": "00000000-0000-0000-0000-000000000000",
"ВыданныеАвансы": [
]
}
Пересоздаем подключением и проверяем вызов действия.
Итог
В результате нашей настройки мы получили подключение к 1С с действиями для чтения и изменения данных. Теперь осталось использовать его в приложении PowerApps, о чем и пойдет речь в следующей статье.
--Andrey Paltusov--
comments powered by Disqus