Разработка бизнес-приложений 1С + Android

в 21:26, , рубрики: android, Разработка под android, метки:

Здравствуйте, уважаемые.

Разработка бизнес приложений 1С + Android
В данной статье хочу познакомить вас с новым продуктом “FBA Toolkit”, который существенно облегчает процесс разработки корпоративного мобильного приложения на 1С + Android.
“FBA Toolkit” это:
— разработка «нативного» приложения Android в родной IDE на языке Java;
— 1С: Предприятие 8.1 (8.2) в роли источника данных, корпоративной информационной системы.

В первую очередь, фреймворк будет полезен программистам 1С, которые хотели бы заняться разработкой бизнес-приложений под Android, но испытывают трудности с освоением новой для них платформы. Чтобы начать разработку достаточно будет начальных знаний Java. Далее я покажу, как создать рабочий прототип клиент-серверного приложения буквально за пару часов.

Подготавливаем рабочее место

Прежде чем начать непосредственно процесс разработки, необходимо подготовить рабочее место разработчика. Потребуется:

1. Установить и настроить:
— Java SDK + Eclipse + Android SDK;
— Web-сервер (IIS или Apache);
— 1С: Предприятие 8.1 (8.2)

2. Для Eclipse произвести импорт двух библиотечный проектов: ActionBarSherlock и ru_profu1c_fba из хранилища SVN.

3. Установить дистрибутив конфигурации «FBA» и объединить ее с вашим прикладным решением на базе 1С.

Подробно весь процесс предварительной настройки описан в статьях:
Подготовка рабочего места разработчика
Установка дистрибутива конфигурации “FBA”
Объединение конфигурации “FBA” с прикладным решением и публикация на web-сервере

Настройка не должна занять много времени, и скорее всего, часть необходимого ПО у вас уже установлена.

Описание приложения

Создадим мобильное приложение «Рапорт руководителю», предназначенное для регулярного информирования руководителя о состоянии дел на предприятии. Приложение будет состоять из 3-х экранов:

  1. “Вход” — авторизация пользователя при запуске программы.
  2. “Список отчетов” – основной экран нашего приложения. Отображается список доступных отчётов с возможностью просмотра и обновления данных из базы 1С.
  3. “Настройки программы” – здесь пользователь задает параметры авторизации и адрес сервера 1С, настраивает расписание автоматического обмена с сервером 1С.

Разработка бизнес приложений 1С + Android Разработка бизнес приложений 1С + Android Разработка бизнес приложений 1С + Android

В приложении будет реализовано 2 варианта получения данных от сервера 1С:

  1. Отчет «Товары на складах». Формируется на сервере и компилируется как HTML документ, в мобильном приложении просто отображается. Самый простой вариант, форма отчета фиксирована и не может быть изменена.
  2. Отчет «Финансовые показатели». Здесь исходные данные для отчета получаются в виде таблицы, по которой затем строится отчет. Плюсы данного варианта: произвольная форма вывода отчета, в т.ч. в виде графиков и диаграмм; возможна установка отборов и сортировки.

Создание шаблона мобильного приложения в 1С

Разработка мобильного приложения начинается в 1С, как это не удивительно. Здесь вы определяетесь с составом метаданных, настраиваете схему обмена и регенерируете шаблон вашего будущего мобильного приложения.

Создайте новый элемент в справочнике «Мобильные приложения» с наименованием «Рапорт руководителю» и идентификатором SAMPLE_REPORT_HEAD.

Выделите в списке “Метаданные” группу “Внешние данные” и нажмите кнопку “Добавить” на панели инструментов. Заполните параметры новой таблицы как показано на рисунке:

Разработка бизнес приложений 1С + Android

«Показатель» — тестовое представление показателя отчета, строка (250)
«Значение» — числовое значение показателя, число (15.2)
Имена колонок и самой таблицы здесь, как правило, задаются на русском языке, по ним будет производиться заполнение таблицы данными средствами встроенного языка 1С. Нажмите ОК, таблица будет добавлена в дерево метаданных, для мобильного приложения имена автоматически переводятся в латиницу.

Таким образом, мы подготовили структуру таблицы значений (в терминах 1С) в которой будем передавать данные для отчета «Финансовые показатели». Для второго отчета «Товары на складах» данные будут передаваться как внешний файл.

На закладке «Схема обмена» проверьте, что отмечен флаг «Выгрузка». Флаг «Загрузка» не важен, т.к. мы не собираемся обрабатывать в 1С полученные изменения этой таблицы от мобильного приложения.

Разработка бизнес приложений 1С + Android

Сохраните изменения. Нажмите на кнопку “Шаблон мобильного приложения” на панели инструментов, установите параметры вашего мобильного приложения

Разработка бизнес приложений 1С + Android

«Каталог шаблонов» — путь к каталогу, в котором будут сохранены сгенерированные файлы шаблона мобильного приложения.

На закладке «Основные» укажите имя пакета, это должен быть уникальный идентификатор. Если у вас есть сайт, используйте его для генерации префикса. В этом примере я указал ru.profi1c.samples.report.head

На закладке «Web-сервис» указан IP-адрес 10.0.2.2, по умолчанию это адрес вашего компьютера при доступе с Android-эмулятора. В поля «Имя веб-сервиса» и «Подкаталог приложения» введите данные, которые были указаны при публикации веб-сервиса.

Разработка бизнес приложений 1С + Android

Обратите внимание, что для 1С 8.2, скорее всего, подкаталог приложения у вас будет с дополнительным подкаталогом /ws, т.е demoFba/ws, подробнее см. здесь.
Нажмите Создать, шаблон Android-проекта будет сгенерирован.

Подготовка исходных данных для отчетов в 1С

Откройте в конфигураторе 1С модуль fbaПодпискаНаСобытия и добавьте следующий код в процедуру ПередОтправкойВнешнейТаблицы:

Если СокрЛП(МобильноеПриложение.Код) = "SAMPLE_REPORT_HEAD" Тогда
                            	
            	Если ИмяТаблицы = "РапортРуководителю" Тогда
                        //фиктивные данные отчета
                        СписокТемп = fbaОбщий.ИзСтрокиСРазделителями("Денежные средства,Расчеты с подотчетными лицами,Общая дебиторская задолженность,Остатки товаров,Кредиторская задолженность,Объем продаж");
                        ГСЧ = Новый ГенераторСлучайныхЧисел(123456789);
                                            	
                         Для каждого ЭлементСписка Из СписокТемп Цикл
                                 НоваяСтрока = ВнешняяТаблица.Добавить();
                                 НоваяСтрока.Показатель = ЭлементСписка.Значение;
                                 НоваяСтрока.Значение = ГСЧ.СлучайноеЧисло(0,999999) + Sin(ГСЧ.СлучайноеЧисло(0,999));
                         КонецЦикла;
            	КонецЕсли;
КонецЕсли

В этом примере таблица заполняется фиктивными данными, в реальном приложении здесь можете передавать произвольное количество показателей отчета.
С данными для первого отчета разобрались, осталось подготовить для второго. В этом же модуле fbaПодпискаНаСобытия добавите в процедуру ПодготовитьДвоичныеДанныеДляОтправки следующий код:

ДД = Неопределено;
                    	
Если СокрЛП(МобильноеПриложение.Код) = "SAMPLE_REPORT_HEAD" Тогда
                                            	
              	Если Идентификатор = "REPORT_PRODUCTS_IN_STOK" Тогда
                                            	
                    ИмяФайла = ПолучитьИмяВременногоФайла("html");
                    Отчет = Отчеты.ТоварыНаСкладах.Создать();
                    Если Отчет.СохранитьОтчетВHTML(ИмяФайла) Тогда
                        ДД = Новый ДвоичныеДанные(ИмяФайла);
                        УдалитьФайлы(ИмяФайла);
                    КонецЕсли;
      	КонецЕсли;
                                            	
КонецЕсли;
                                           	
Возврат ДД;      

Прокомментирую код. Когда мобильное приложение запрашивает произвольные данные (в виде файла) с идентификатором «REPORT_PRODUCTS_IN_STOK», в 1С выполняется отчет и результат его сохраняется во временный файл. Затем этот временный файл считывается как двоичные данные и передается мобильному приложению. Временный файл удаляется.

Как в данном случае генерируется html файл, нам не важно. Вы можете использовать штатный механизм 1С сохранения табличного документа в виде HTML или сформировать HTML вручную. Пример вывода можете посмотреть в конфигурации «FBA демо», отчет «Товары на складах».

С 1С всё, переходим к разработке мобильного приложения на Android.

Проектирование Android – приложения

Созданный в 1С шаблон Android-проекта импортируем в рабочее пространство Eclipse.

Запустите Eclipse и выполните импорт проекта: File > Import… В группе Android выберите элемент «Exists Android Code Into Workspace» нажмите Next, укажите путь к каталогу шаблона Android-проекта и нажмите Finish, новый проект будет добавлен в рабочее пространство. Если возникнут сложности см. здесь, процесс описан в картинках.

1. Создаем отчет «Финансовые показатели», источником данных для которого является таблица значений, полученная от 1С. Для этого добавьте новый класс ToChiefReport.java, вот полный исходный код:

Показать

/**
 * Пример построения отчета по данным из локальной базы sqlite. Источником
 * данных выступает внешняя таблица «Рапорт руководителю»
 *
 */
public class ToChiefReport extends SimpleMapHtmlReport {
 
	@Override
	public int getResIdIcon() {
        	return R.drawable.report_01;
	}
 
	@Override
	public int getResIdTitle() {
        	return R.string.report_name_to_chief;
	}
 
	@Override
	public void build(Context context, IReportBuilderResult builderResult) {
 
        	try {
                	makeReport(context);
        	} catch (SQLException e) {
                	e.printStackTrace();
                	setHeader1("Упс, отчет не создан!");
        	}
 
        	super.build(context, builderResult);
	}
 
	private void makeReport(Context context) throws SQLException {
 
        	DBHelper helper = new DBHelper(context);
 
        	// Заголовок отчета и таблицы
        	setHeader2("Финансовые показатели");
        	setTableHeader("Наименование ", "Сумма, руб.");
 
        	// Строки таблицы будут в порядке добавления
        	Map<Object, Object> mapData = new LinkedHashMap<Object, Object>();
 
        	// Выборка данных из локальной базы данных sqlite, внешняя таблица
        	// «Рапорт руководителю»
        	ExTableRaportRukovoditelyuDao dao = helper
                        	.getDao(ExTableRaportRukovoditelyu.class);
        	List<ExTableRaportRukovoditelyu> rows = dao.select();
        	for (ExTableRaportRukovoditelyu row : rows) {
                	mapData.put(row.pokazatel, row.znachenie);
        	}
        	setTableData(mapData);
 
	}
}

Прокомментирую код. Абстрактный класс SimpleMapHtmlReport, от которого наследуется, предназначен для построения простого HTML отчета с таблицей из двух колонок.
Первые 2 метода getResIdIcon() и getResIdTitle() возвращают иконку и название нашего отчета для отображения в списке. В обработчике события «build» вызывается метод makeReport, в котором наша реализация компиляции отчета.
При построении отчета сначала устанавливается заголовок отчета и таблицы, затем все записи из локальной таблицы sqlite считываются как строки таблицы отчета. И наконец, в методе setTableData() устанавливаем данные для таблицы отчета. Уф, как сложно комментировать очевидные вещи.

2.Создаем второй отчет, здесь все еще проще:

Показать

/**
 * Пример скомпилированного отчета, просто выводит Html файл. В этом примере
 * данных файл сгенерирован в 1С и передан мобильному клиенту во время обмена
 *
 */
public class ProductsInStokReport extends SimpleCompiledHtmlReport {
 
    	// Имя, под которым сохраняется полученный файл от 1с (см. процедуру обмена
    	// MyExchangeTask)
    	public static final String REPORT_FILE_NAME = "products_in_stok.html";
 
    	public ProductsInStokReport(File file) {
            	super(file);
    	}
 
    	@Override
    	public int getResIdIcon() {
            	return R.drawable.report_02;
    	}
 
    	@Override
    	public int getResIdTitle() {
            	return R.string.report_name_products_in_stok;
    	}
 
}

3. Расширим предопределенную процедуру обмена с сервером 1С, т.е. добавим в нее еще один шаг — получение данных для нашего второго отчета в виде скомпилированного файла. Добавим класс MyExchangeTask наследник от ExchangeTask:

Показать

/**
 * Стандартная процедура обмена дополненная пользовательскими правилами.
 * Дополнительно получается один скомпилированный файл – отчет.
 *
 */
public class MyExchangeTask extends ExchangeTask {
 
    	// Идентификатор отчета как он задан в 1С
    	private static final String ID_REPORT_PRODUCTS_IN_STOK = "REPORT_PRODUCTS_IN_STOK";
 
    	public MyExchangeTask(ExchangeVariant exchangeVariant, WSHelper wsrvHelper,
                    	DBOpenHelper dbOpenHelper) {
            	super(exchangeVariant, wsrvHelper, dbOpenHelper);
    	}
 
    	@Override
    	protected boolean doExecute() throws Exception {
 
            	// Выполнить шаги обмена по предопределенным правилам
            	boolean success = super.doExecute();
            	if (success) {
                    	// Получить произвольные данные - наш 2-ой отчет
                    	onStepInfo("Получаю отчеты…");
 
                    	String fPath = appSettings.getCacheDir().getAbsolutePath() + "/"
                                    	+ ProductsInStokReport.REPORT_FILE_NAME;
                    	File f = wsHelper.getLargeData(ID_REPORT_PRODUCTS_IN_STOK, null,
                                    	"", fPath);
                    	success = (f != null);
            	}
 
            	return success;
    	}
}

Для получения данных отчета используется метод веб-сервиса getLargeData, который в случае успеха сохраняет результат в файл по указанному пути. Обратите внимание на идентификатор ID_REPORT_PRODUCTS_IN_STOK, он должен быть таким же, как в 1С в методе ПодготовитьДвоичныеДанныеДляОтправки.

4. Вывод списка отчетов на главной форме. Откройте файл res activity_main.xml и добавьте listView в котором будет отображать список отчетов:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >
 
	<ListView
    	android:id="@android:id/list"
    	android:layout_width="match_parent"
    	android:layout_height="wrap_content"
    	android:layout_alignParentLeft="true"
    	android:layout_alignParentTop="true" >
	</ListView>
 
</RelativeLayout>

В MainActtiviy.java добавляем:

а) локальную переменную для списка

private ListView list;

б) метод инициализации

private void init() {
    	list = (ListView) findViewById(android.R.id.list);
 
    	// Создать адаптер для отображения списка отчетов
    	ReportListAdapter adapter = new ReportListAdapter(this,createReportList());
    	list.setAdapter(adapter);
    	list.setOnItemClickListener(new OnItemClickListener() {
 
            	@Override
            	public void onItemClick(AdapterView<?> parent, View view,   	int position, long id) {
 
                    	// Показываем отчет в диалоге по клику на нем
                    	IReport report = (IReport) list.getItemAtPosition(position);
                    	report.onShow(MainActivity.this);
            	}
    	});
}

и вызов его в onCreate() после установки макета формы

setContentView(R.layout.activity_main);
init();

в) метод инициализации списка отчетов

/*
* Подготовить список отчетов
*/
private List<IReport> createReportList() {
 
    	List<IReport> lst = new ArrayList<IReport>();
 
    	// Создать первый отчет, временный каталог где сохранен файл берем из
    	// настроек
    	IReport report = new ProductsInStokReport(new File(getAppSettings()
                    	.getCacheDir(), ProductsInStokReport.REPORT_FILE_NAME));
    	lst.add(report);
 
    	// Создать и добавить в список прочие отчеты
    	lst.add(new ToChiefReport());
}

г) процедуру запуска обмена по вашим правилам

/*
* Запуск обмена по моим правилам. Обратите внимание, что в планировщике
* (если установлен) обмен остался по стандартным правилам
*/
private void startExchangeMyRules(ExchangeVariant variant,boolean cancelable) {
 
// хелпер для вызова методов web-сервиса
   	WSHelper wsHelper = new WSHelper(getExchangeSettings());
   	MyExchangeTask task = new MyExchangeTask(variant, wsHelper, getHelper());
 
   	startExchange(task, cancelable);
}

И изменяем вызов процедуры обмена startExchange(ExchangeVariant.FULL, true) в обработчике onOptionsItemSelected на startExchangeMyRules(ExchangeVariant.FULL, true).

Приложение готово, формы авторизации и настроек программы будут созданы автоматически, изменять их не будем.
Давайте проверим его на эмуляторе. Если вы нигде не ошиблись, приложение запустится. Однако, вместо окна авторизации будет отображено сразу окно настроек, так как не указаны данные авторизации (имя пользователя и пароль).

Укажите имя пользователя: ivanov
И пароль: 123456

Запустите базу 1С и откройте справочник «Мобильные сотрудники». В качестве мобильного устройства укажите предопределённый элемент «Эмулятор устройства», в табличную часть «Мобильные приложения» добавьте приложение «Рапорт руководителю» и установите идентичные имя и пароль пользователя.

Разработка бизнес приложений 1С + Android

Запустите на эмуляторе процедуру обмена (кнопка со стрелочкой «Вверх» на панели справа)
Разработка бизнес приложений 1С + Android

результат работы обмена выводится в уведомлении:
Разработка бизнес приложений 1С + Android

Нажмите на него для запуска вашего приложения (или для просмотра подробной информации об ошибке, если обмен завершился неудачно).

Проверим, что получилось. Кликните мышкой по отчету в списке:

Показать

Разработка бизнес приложений 1С + Android Разработка бизнес приложений 1С + Android
Отлично! Отчеты выводятся, можно изменять масштаб по кнопке или жестами.

Приложение готово, получилось вполне функциональным и легко расширяемым. Добавление других отчетов не составит большого труда.
Вы можете передавать документы в различных форматах, например *.doc или *.pdf и использовать внешние приложения для их просмотра. Смотрите исходный код примера, там есть еще 3 отчета:

  • диаграмма с использованием Google Chart Tools
  • график с использованием jQuery плагина Plot
  • вывод PDF-отчета внешним приложением (PdfReport.java)

Детально описывать не буду, и так статья получилась большая. Если возникнут вопросы, готов ответить в комментариях. Вот результат вывода:

Показать

Разработка бизнес приложений 1С + Android Разработка бизнес приложений 1С + Android

Полный код примера вы можете скачать по адресу https://xp-dev.com/svn/fba_toolkit_public/samples/fbaSample4ReportHead/

Использование HTML для построения отчетов позволяет создавать весьма разнообразные отчеты, в т.ч. и с интерактивными элементами. Например, в одном нашем проекте используется вот такой отчет:

Показать

Разработка бизнес приложений 1С + Android

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

И конечно, вы ничем не ограничены, можете использовать сторонние библиотеки для вывода отчетов и диаграмм, например achartengine или самостоятельно создать свой график/диаграмму (примеров полно, в т.ч. есть и в Android SDK).

На этом все, с другими примерами вы можете ознакомиться на сайте http://profi1c.ru.
В ближайшее время планируется добавить уроки по интерактивным элементам и адаптерам библиотеки FBA, а так же показать как работать с офф-лайн картами mapsforge.

Ложка дегтя

Продукт «FBA Toolkit» планируется распространять на коммерческой основе, сейчас он в статусе «демо-версии». Вы можете свободно использовать его для тестирования и изучения.
Ограничения:

  • программа перестает работать по окончании срока демо-лицензии т.е. после 31.12.13;
  • при запуске выводится уведомление:

Разработка бизнес приложений 1С + Android

В ближайшее время (не более месяца) будет коммерческая версия, информацию о стоимости и порядке лицензирования добавим на наш сайт.

Спасибо, что дочитали до конца. Готов ответить на ваши вопросы в комментариях как по 1С, так и по Android.

Автор: avesha

Источник

Поделиться

* - обязательные к заполнению поля