PowerApps Подключение к 1С часть 1

Posted by     "Andrey Paltusov" on Saturday, July 13, 2019

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