gifts2017

Интеграция типовой конфигурации из мобильным приложением

Опубликовал Андрей Комар (akomar) в раздел Программирование - Практика программирования

В данной статье речь пойдет о том, как быстро наладить взаимодействие конфигурации УТ 11 из мобильной конфигурацией, написанной на 1С 8.3. В качестве примера мы вместе разработаем отчет «Валовая прибыль по месяцам», который сможем запускать из смартфона или планшета под управлением операционной системы Android 4.2. Взаимодействие между информационной базой и мобильным приложением будет осуществляется с помощью web-сервиса.

Вот уже второй месяц я тружусь над логистическим решением, которое основано на взаимодействии мобильной платформы Android и конфигурации УТ 11. Разработку под Android осуществляет подрядчик, но мне всегда тоже очень хотелось написать приложение для модного «гаджета». К счастью, компания 1С, в стремлении сделать свои продуты более мобильными и облачными, выпустила платформу 8.3, с которой мы и будем играть в «мобильное приложение».

Принцип работы приложения представлен на схеме.

Схема работы приложения

Слева на схеме наша информационная база, которая выступает в роли сервера. С нее мы будем брать данные необходимые для построения отчета в мобильном приложении. Посредником работает web-сервис, который передает информацию в виде XML-файлов. Ну а справа собственно мобильная конфигурация, которая анализирует полученные данные и сохраняет на телефоне.

РАЗРАБОТКА WEB-СЕРВИСА

Для начала определимся с тем, что мы буде передавать и как нам упаковать нужные данные в формат XML. Для построения отчета на клиенте, на необходимо загрузить список организаций, а также выгрузить оборот по данных организациях.

Создадим XDTO-пакет из наименованием CrossProfit следующей структуры.

Пакет XDTO

Объект Organization используется для передачи элемента справочника «Организации». В нем мы передаем уникальный идентификатор ссылки на справочник, а также наименование, которое необходимо для представления справочника пользователю.

В объект OrganizationList мы записываем список организаций, другими словами он фактически является массивом организаций.

Объект Item содержит информацию о валовой прибыли организации за месяц. Соответственно GUID – это уникальный идентификатор элемента справочника, Period – дата, на которую мы получаем оборот, а Revenue и Cost – значения итогов.

Создадим веб-сервис в конфигурации (под таким же именем, как и пакет XDTO). В нашем сервисе будет всего два

  1. GetOrganizationList – метод, который возвращает список организаций. Тип возвращаемого значения OrganizationList.
  2. GetData – метод возвращает информацию по оборотам организаций. Тип возвращаемого значения Items.

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

Ниже приведен код работы сервиса. Комментировать его не стану, поскольку создавался в демонстрационных целях и является тривиальным.
 

Функция GetOrganizationList()

   
OrganizationList = СоздатьФабрикуXDTOПоИмени("OrganizationList");

   
Запрос = Новый Запрос("ВЫБРАТЬ
                          | Ссылка          КАК Ссылка,
                          | Наименование    КАК Наименование
                          |ИЗ
                          | Справочник.Организации
                          |ГДЕ
                          | Не ПометкаУдаления"
);

   
Выборка = Запрос.Выполнить().Выбрать();

    Пока
Выборка.Следующий() Цикл
       
Organization      = СоздатьФабрикуXDTOПоИмени("Organization");
       
Organization.GUID = Строка(Выборка.Ссылка.УникальныйИдентификатор());
       
Organization.Name = Выборка.Наименование;
       
OrganizationList.Organization.Добавить(Organization);
    КонецЦикла;

    Возврат
OrganizationList;

КонецФункции

Функция
GetData()

   
Items = СоздатьФабрикуXDTOПоИмени("Items");

   
Запрос = Новый Запрос("ВЫБРАТЬ
                |   ВыручкаИСебестоимостьПродажОбороты.Период КАК Период,
                |   АналитикаУчета.Организация КАК Организация,
                |   СУММА(ВыручкаИСебестоимостьПродажОбороты.СуммаВыручкиОборот) КАК Выручка,
                |   СУММА(ВыручкаИСебестоимостьПродажОбороты.СебестоимостьОборот) КАК Себестоимость
                |ИЗ
                |   РегистрНакопления.ВыручкаИСебестоимостьПродаж.Обороты(, , Месяц, ) КАК ВыручкаИСебестоимостьПродажОбороты
                |       ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.АналитикаУчетаПоПартнерам КАК АналитикаУчета
                |       ПО ВыручкаИСебестоимостьПродажОбороты.АналитикаУчетаПоПартнерам = АналитикаУчета.КлючАналитики

                |СГРУППИРОВАТЬ ПО
                |   ВыручкаИСебестоимостьПродажОбороты.Период,
                |   АналитикаУчета.Организация
                |
                |УПОРЯДОЧИТЬ ПО
                |   ВыручкаИСебестоимостьПродажОбороты.Период,
                |   АналитикаУчета.Организация.Наименование"
);

   
Выборка = Запрос.Выполнить().Выбрать();

    Пока
Выборка.Следующий() Цикл
       
Item = СоздатьФабрикуXDTOПоИмени("Item");
       
Item.GUID       = Строка(Выборка.Организация.УникальныйИдентификатор());
       
Item.Period     = Выборка.Период;
       
Item.Revenue    = Выборка.Выручка;
       
Item.Cost       = Выборка.Себестоимость;
       
Items.Item.Добавить(Item);
    КонецЦикла;

    Возврат
Items;

КонецФункции


Функция
СоздатьФабрикуXDTOПоИмени(Имя)

   
ТипФабрики = ФабрикаXDTO.Тип("http://www.avtomat.biz/crossprofit", Имя);
    Возврат
ФабрикаXDTO.Создать(ТипФабрики);

КонецФункции
// СоздатьФабрикуXDTOПоИмени()

В примере с веб-сервисом будет работать пользователь из полными правами, однако целесообразно создать дополнительное право, на использование операций веб сервиса.

Осталось только осталось провести публикацию на веб-сервере. Я использую Apache 2.2.

Публикация веб-сервиса на веб-сервере

В случае успешной публикации мы сможем получить WSDL описание нашего веб-сервиса с помощью браузера, по ссылке http://127.0.0.1/yt/ws/CrossProfit?wsdl

WSDL описание веб-сервиса

Все наш веб-сервис готов, переходим к разработки клиентского приложения.

РАЗРАБОТКА КЛИЕНТСКОГО ПРИЛОЖЕНИЯ

Как создавать и собирать приложения для Android с помощью 1С 8.3, я не стану, в интернете есть много статей на эту тему, например вот здесь.

Сначала создадим объект конфигурации WS-ссылка, он нам необходим будет для связи с основной информационной базой. При создании система нас спросит адрес, где работает наш веб сервис. Нам нужно прописать тот же адрес, что мы использовали для тестирования сервиса.

WS ссылка

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

Модель данных веб-сервиса

Теперь все готово для работы с сервисом. Создадим справочник Организации и регистр, где будем сохранять данные. Ниже приведу код общего модуля, для работы с веб-сервисом.


Процедура ЗагрузитьДанныеВРегистр() Экспорт

   
ВебСервис = ПодключитьВебСервис();

   
СписокОрганизаций = ВебСервис.GetOrganizationList().ПолучитьСписок("Organization");

    Для каждого
Организация Из СписокОрганизаций Цикл

       
ИдентификаторОрганизации = Новый УникальныйИдентификатор(Организация.GUID);
       
ОрганизацияСсылка        = Справочники.Организации.ПолучитьСсылку(ИдентификаторОрганизации);

        Если
ПустаяСтрока(ОрганизацияСсылка.ВерсияДанных) Тогда
           
СоздатьЭлементСправочникаОрганизации(ОрганизацияСсылка, Организация.Name);
        КонецЕсли;

    КонецЦикла;

   
Данные       = ВебСервис.GetData().ПолучитьСписок("Item");
   
НаборЗаписей = РегистрыСведений.ВаловаяПрибыль.СоздатьНаборЗаписей();
   
НаборЗаписей.Записать();

    Для каждого
ДанныеЗапись ИЗ Данные Цикл
       
ИдентификаторОрганизации = Новый УникальныйИдентификатор(ДанныеЗапись.GUID);
       
ОрганизацияСсылка        = Справочники.Организации.ПолучитьСсылку(ИдентификаторОрганизации);
        Если
ПустаяСтрока(ОрганизацияСсылка.ВерсияДанных) Тогда
            Продолжить;
        КонецЕсли;
       
НаборЗаписей = РегистрыСведений.ВаловаяПрибыль.СоздатьНаборЗаписей();
       
НаборЗаписей.Отбор.Период.Установить(ДанныеЗапись.Period);
       
НаборЗаписей.Отбор.Организация.Установить(ОрганизацияСсылка);
       
Запись                  = НаборЗаписей.Добавить();
       
Запись.Период           = ДанныеЗапись.Period;
       
Запись.Организация      = ОрганизацияСсылка;
       
Запись.Выручка          = ДанныеЗапись.Revenue;
       
Запись.Себестоимость    = ДанныеЗапись.Cost;
       
НаборЗаписей.Записать();
    КонецЦикла;

КонецПроцедуры



// Служебные процедуры и функции

Функция ПодключитьВебСервис()
   
Прокси              = WSСсылки.CrossProfit.СоздатьWSПрокси("http://www.avtomat.biz/crossprofit","CrossProfit", "CrossProfitSoap12");
   
Прокси.Пользователь = Константы.Пользователь.Получить();
   
Прокси.Пароль       = Константы.Пароль.Получить();
    Возврат
Прокси;
КонецФункции

Процедура
СоздатьЭлементСправочникаОрганизации(ОрганизацияСсылка, Наименование)

   
ЭлементСправочник              = Справочники.Организации.СоздатьЭлемент();
   
ЭлементСправочник.Наименование = Наименование;

   
ЭлементСправочник.УстановитьСсылкуНового(ОрганизацияСсылка);
   
ЭлементСправочник.Записать();

КонецПроцедуры

Функцию ПодключитьВебСервис используем для создания объекта WSПрокси, заполняются данные для регистрации из соответствующих констант. Процедура ЗагрузитьДанныеВРегистр анализирует полученные данные и записывает их в нужные справочники и регистры.

В конфигурации есть еще три общих формы.

Форма меню, она размещается в рабочей области начальной страницы.

Форма меню программы

Форма настройки, используется для сохранения настроек пользователя.

Форма настроек авторизации

Ну и сама форма отчета.

Форма отчета мобильного приложения

Приведу пример кода, который строит отчет в мобильном приложении.

&НаКлиенте
Процедура СформироватьОтчет(Команда)
    Если
ПустаяСтрока(Месяц) Тогда
       
Сообщение = Новый СообщениеПользователю;
       
Сообщение.Текст = НСтр("ru='Необходимо указать месяц'");
       
Сообщение.Поле = "Месяц";
       
Сообщение.Сообщить();
        Возврат;
    КонецЕсли;
    Если
Год < 1 Тогда
       
Сообщение = Новый СообщениеПользователю;
       
Сообщение.Текст = НСтр("ru='Необходимо указать год'");
       
Сообщение.Поле = "Год";
       
Сообщение.Сообщить();
        Возврат;
    КонецЕсли;
   
СформироватьОтчетНаСервере();
КонецПроцедуры

&НаСервере
Процедура СформироватьОтчетНаСервере()

   
Макет            = ПолучитьОбщийМакет("МакетОтчета");
   
ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
   
ОбластьСтроки    = Макет.ПолучитьОбласть("Строки");

   
Период = Дата(Формат(Год, "ЧГ=0") + ПолучитьНомерМесяца() + "01000000");

   
НаборЗаписей = РегистрыСведений.ВаловаяПрибыль.СоздатьНаборЗаписей();
   
НаборЗаписей.Отбор.Период.Установить(Период);

   
НаборЗаписей.Прочитать();

   
Результат.Вывести(ОбластьЗаголовок);

    Для каждого
Запись ИЗ НаборЗаписей Цикл
       
ОбластьСтроки.Параметры.Заполнить(Запись);
       
ОбластьСтроки.Параметры.Прибыль = Запись.Выручка - Запись.Себестоимость;
       
Результат.Вывести(ОбластьСтроки);
    КонецЦикла;

КонецПроцедуры
// СформироватьОтчетНаСервере()

&НаСервере
Функция ПолучитьНомерМесяца()

    Если
Месяц = "Январь" Тогда
        Возврат
"01";
    КонецЕсли;

    Если
Месяц = "Февраль" Тогда
        Возврат
"02";
    КонецЕсли;

    Если
Месяц = "Март" Тогда
        Возврат
"03";
    КонецЕсли;

    Если
Месяц = "Апрель" Тогда
        Возврат
"04";
    КонецЕсли;

    Если
Месяц = "Май" Тогда
        Возврат
"05";
    КонецЕсли;

    Если
Месяц = "Июнь" Тогда
        Возврат
"06";
    КонецЕсли;

    Если
Месяц = "Июль" Тогда
        Возврат
"07";
    КонецЕсли;

    Если
Месяц = "Август" Тогда
        Возврат
"08";
    КонецЕсли;

    Если
Месяц = "Сентябрь" Тогда
        Возврат
"09";
    КонецЕсли;

    Если
Месяц = "Октябрь" Тогда
        Возврат
"10";
    КонецЕсли;

    Если
Месяц = "Ноябрь" Тогда
        Возврат
"11";
    КонецЕсли;

    Если
Месяц = "Декабрь" Тогда
        Возврат
"12";
    КонецЕсли;

    Возврат
"00";

КонецФункции
// ПолучитьНомерМесяца()

Как видите, основным неудобством мобильной платформы является отсутствие запросов и СКД, с которыми так удобно работать. Скомпилируем базу и посмотрим что у нас получилось.

Форма меню основного окна программы и настроек авторизации.

Основное меню программы Форма авторизации

Форма отчета из данными.

Форма отчета Форма отчета

В файле к статье прикреплены файл конфигурации и XML схема пакета XDTO.

Статья написана по материалам сайта avtomat.biz

Скачать файлы

Наименование Файл Версия Размер
Файлы 22
.zip 15,90Kb
15.09.13
22
.zip 1 15,90Kb Скачать

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Дмитрий Шерстобитов (DitriX) 16.09.13 11:55
"Хорошо что месяцев 12" (с)
НаименованиеМесяца = Формат(НовДата, "ДФ=MMMM");

Та и вообще - слишком уж вы усложнили все.
При передачи данных с 1С в 1С - используется минимум кода.
Ваш подход не совсем верный, если вы использовали такие сложные механизмы для примера, то я не увидел этот пример.
Если по не знанию более легкого пути решения, то рекомендую помыслить креативно, тут вся ваша зада уложится в десяток строк кода и пустой веб сервис.
2. crazy1C (detro) 16.09.13 16:30
"WSСсылки.CrossProfit.СоздатьWSПрокси("http://www.avtomat.biz"
пароль будет передан "в открытую"
3. Василий Казьмин (awk) 18.09.13 22:51
(1) DitriX, Если он покреативит, то для таких вещей и 1С на андроиде не нужно будет. Достаточно синхронизации отчетов (exel на андроиде есть) почта, фтп, облака. Фот если бы данные в андроиде вводить, а потом передавать в 1С - это куда более интересно.
4. Дмитрий Шерстобитов (DitriX) 18.09.13 23:12
(3) это была шутка?
Это основная цель веб сервисов - отправка и получение данных.
Выбирая организацю - вы же должны как то ее передать в 1с что бы отбор по ней сделать.
И то, что вы этого не поняли - еще один камень в огород этой статьи :)
5. Василий Казьмин (awk) 18.09.13 23:26
(4) DitriX,
1. Шутка, но грустная... Так как если сесть и подумать, не абстрактно, а применительно к ситуации и людям, то смысл в таких отчетах через 1С мобильное приложение?
2.Посмотри функции веб сервисов (GetOrganizationList, Getdata). 1С уже умеет угадывать параметры? ;)
6. Дмитрий Шерстобитов (DitriX) 19.09.13 09:54
(5)1. При чем тут отчеты? Вы таким образом можете гонять произвольные данные.
2. А этим вы пытались подтвердить сказанное мною выше?
7. Alex Nikolaev (BenderOstap) 16.11.13 15:07
"Интеграция типовой конфигурации из мобильным приложением". Может хватит уже над языком издеваться?
Прикрепленные файлы:
8. Андрей Комар (akomar) 16.11.13 15:48