Вот уже второй месяц я тружусь над логистическим решением, которое основано на взаимодействии мобильной платформы Android и конфигурации УТ 11. Разработку под Android осуществляет подрядчик, но мне всегда тоже очень хотелось написать приложение для модного «гаджета». К счастью, компания 1С, в стремлении сделать свои продуты более мобильными и облачными, выпустила платформу 8.3, с которой мы и будем играть в «мобильное приложение».
Принцип работы приложения представлен на схеме.
Слева на схеме наша информационная база, которая выступает в роли сервера. С нее мы будем брать данные необходимые для построения отчета в мобильном приложении. Посредником работает web-сервис, который передает информацию в виде XML-файлов. Ну а справа собственно мобильная конфигурация, которая анализирует полученные данные и сохраняет на телефоне.
РАЗРАБОТКА WEB-СЕРВИСА
Для начала определимся с тем, что мы буде передавать и как нам упаковать нужные данные в формат XML. Для построения отчета на клиенте, на необходимо загрузить список организаций, а также выгрузить оборот по данных организациях.
Создадим XDTO-пакет из наименованием CrossProfit следующей структуры.
Объект Organization используется для передачи элемента справочника «Организации». В нем мы передаем уникальный идентификатор ссылки на справочник, а также наименование, которое необходимо для представления справочника пользователю.
В объект OrganizationList мы записываем список организаций, другими словами он фактически является массивом организаций.
Объект Item содержит информацию о валовой прибыли организации за месяц. Соответственно GUID – это уникальный идентификатор элемента справочника, Period – дата, на которую мы получаем оборот, а Revenue и Cost – значения итогов.
Создадим веб-сервис в конфигурации (под таким же именем, как и пакет XDTO). В нашем сервисе будет всего два
- GetOrganizationList – метод, который возвращает список организаций. Тип возвращаемого значения OrganizationList.
- 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
Все наш веб-сервис готов, переходим к разработки клиентского приложения.
РАЗРАБОТКА КЛИЕНТСКОГО ПРИЛОЖЕНИЯ
Как создавать и собирать приложения для Android с помощью 1С 8.3, я не стану, в интернете есть много статей на эту тему, например вот здесь.
Сначала создадим объект конфигурации 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