gifts2017

Acode tools - расширение возможностей мобильной платформы 1С (Android)

Опубликовал Дмитрий Шерстобитов (DitriX) в раздел Программирование - Внешние компоненты

Не хватает возможностей в мобильной платформе 1С? Надо push сообщения, логи, zip, ftp, работа с nfc и bluetooth сканерами в режиме "внешнего события"? Или, может, хотите исполнить произвольный код андроида с передачей параметра из 1С и получением обратно? Тогда Вам сюда.

Обновление от 02.09.2016

Версия 3.01 (тестовая)

Среди обновлений:

1. Поддержка Android 6

2. Возможность получить IMEI

3. На Android 6 - не работают больше FakeSMS

Обновление от 11.02.2016

Версия 2.08

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

Исправили мелкие баги

Добавили возможность запускать скрипты при старте программы (например, после перезагрузки устройства, или приложения, приложение сразу запустит некий скрипт)

Обновление от 28.03.2015

Версия 2.07

Добавили остановку утилит.

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

Изменили механизм работы с ТСД Acode, из-за бага в 8.3.6.110 - 1С падает в крит при подключении обработчика приема смс. Теперь все работает как через push (точнее, броадкаст) так и по смс, соотвественно появилась новая операция при работе со сканерами.

Механизм работы с bluetooth сканерами тоже переведен на новый режим работы.

Всякие мелкие исправления.

Все изменения, которые были сделанны - не должны повлиять на старые механизмы работы. Т.е. вы просто обновляете модули и все. (Ну кроме бага 8.3.6.110, надо убедиться, что у вас отключены приемы смс)

  

Сразу несколько моментов. Если вы сканируете, когда 1С свернуто, то у вас появляться будут пуши от 1С.

Пуши от 1С не появляются, если у вас сейчас открыта база 1С. Они просто приходят незаметно.

В версии 8.3.6.110 - не принимаются отчеты по багам, при работе с смс - баги в самой платформе.

Обновление материала от 16.01.2015:

Как я раньше уже обещал - выпускаем новую версию утилит. В ней появилось несколько новых интересных вещей.

Самые основные - это то, что мы теперь научили 1С "прослушивать" события андроида. Например, теперь 1С может узнать про блокировку экрана, поворот экрана, и даже событие сканирования bluetooth сканера или nfc сканера, ну или сканирование терминалов ACODE. Ранее мы вынуждены были считывать это все с буфера, а это было неудобно, и даже криво.

Теперь же, мы можем даже со стационарной 1С - заставить мобильную 1С сделать обмен. А это важно. Так как на текущий момент у мобильной платформы нет регламентов, та и если бы были, то делать холостые обмены - это зло. А так - появился документ, мы сообщили мобильной - что пора бы обновиться, и она обновилась :)

Эту статью - мы публикуем как видео уроки из полного курса по мобильной платформе, так как тема эта очень нужная многим людям, мы решили опубликовать ее в свободный доступ.

Старую статью - я не удаляю, так как она все еще корректно отображает многие аспекты.

Кроме этого - просьба написать в комментариях о том, какой вид вам больше пришелся по душе - видео или текстовая статья.

Может, в дальнейшем имеет смысл сразу делать видео уроки :)

Во вводном видеоуроке представлена общая информация о расширении возможностей мобильной 1С.

В этом уроке мы поговорим о том, что такое Acode Tools, для чего они создавались и какой принцип работы с ними нужно использовать.

После знакомства с утилитами мы пройдемся по некоторому функционалу, для того чтобы понять суть работы с ними. Тут мы познакомимся с toast-сообщениями, push-сообщениями и многим другим.

Что такое намерения (intent) и как с ними работать – об этом мы будем говорить в этом уроке. Узнаем, как вызвать окно выбора файла, причем по маске. Что такое path, uri, как бороться с uri вида «content://» и т.д.

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

То есть как их заставить делать то, что нам нужно.

Какие существуют варианты работы с ними и еще пару интересных моментов.

Зачастую пользователи, работающие с мобильной платформой, терпят неудобства из-за того, что нельзя сделать элементарные вещи, например, заархивировать или разархивировать файл обмена. Как это сделать при помощи утилит – мы разберем в этом видеоуроке. И как бонус, не многие знают, что xlsx-формат (то есть Office 2007) – это заархивированные в zip xml-файлы. В данном видео мы и посмотрим, как можно создать такой файл.

Теперь мы умеем архивировать и разархивировать.

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

Это мы и научимся делать в данном видеоуроке.

Что делать если нам нужно, к примеру, подключить Bluetooth-сканер и ловить сам момент сканирования, или сканирование nfc-метки? Узнать момент, когда появился или пропал интернет, да и еще узнать тип канала, или запретить работу пользователя, если заряд батареи упал ниже 10%? Как узнатьориентацию экрана и факт поворота, или даже – заблокировали экран или нет? Ответы на эти вопросы смотрите в данном видеоуроке.

В последнее время большинство приложений переходит на свои способы оповещений – при помощи push-сообщений.
Поэтому в этом уроке мы отойдем от мобильной платформы 1С, а вместо этого рассмотрим – какие сервисы предоставляют возможность оповещать пользователей под Android, iOS и даже на стационарных компьютерах.

В заключительном видеоуроке подведем итоги по изученной теме.

Отметим важные моменты, касающиеся темы расширения возможностей мобильной платформы 1С.

Предыдущая версия статьи

Оглавление

Что такое ACODE tools?. 1

Суть взаимодействия 1С и ACODEtools. 1

Особенности работы с утилитами. 1

Что надо для работы с утилитами. 1

Toast сообщения. 1

Push сообщения. 1

Информация об устройстве. 1

LogCat – запись логов. 1

Остальной функционал. 1

Подключение Bluetooth сканеров. 1

Тестирование ТСД.. 1

Плагины.. 1

Принцип написания плагинов. 1

 

Добрый день.

Сегодня мы будем говорить о том, как же можно интегрировать мобильную платформу в среду Android.

Сразу оговорюсь - все, про что здесь будет идти речь - не доступно на iOS, и врдяли я этим вопросом когда-либо задамся :) Без обид :)

Начнем же мы все с основ. А именно - что такое утилиты в принципе, и как они работают.

Что такое ACODE tools?

ACODE tools - это утилиты, которые позволяют расширить возможности мобильной платформы и даже стационарной. Основная их направленность - взаимодействие с устройство на ОС Android.

Работать взаимодействие с ними выполняется при помощи следующих решений:

1.     Вызов намерения (Intent), детальней тут http://infostart.ru/public/301851;

2.     http соединений из локального устройства;

3.     http соединение из любого другого устройства, это может быть, как центральная база, так и другое мобильное устройство, в общем все, что может слать POSTзапросы, и достучаться до мобильного устройства по сети.

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

И это действительно так, и у такого подхода есть несколько, просто колоссальных, преимуществ:

1.     Можно вызывать функции с серверных модулей (&НаСервере), так как работа с намерениями (ЗапуститьМобильноеПриложение) доступна только с клиентских вызовов (&НаКлиенте);

2.     Есть возможность работать с утилитами вне контекста мобильной платформы 1С. Т.е. для того, чтобы послать push-уведомление на мобильное устройство – не обязательно ставить на него 1С, достаточно установить только утилиты.

Суть взаимодействия 1С и ACODEtools

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

Но, ничего делать в ручную не надо, так как есть готовая конфигурация с модулями, так что для того, чтобы встроить утилиты в ваш проект – достаточно перенести в вашу конфигурацию 3 модуля. И далее работать просто с их функциями.

К примеру, чтобы  вызвать вибрацию устройства, достаточно прописать вот такую строку:

УтилитыACODEСервер.Вибрация(ВибрацияДлительность);

Или вот такую:

УтилитыACODEКлиент.Вибрация(ВибрацияДлительность);

В зависимости от того, в каком контексте надо выполнить действие.

Теперь давайте детальней рассмотрим – что происходит, когда выполняется эта функция.

По структуре функции понятно, что вызывается она из общего модуля. В этих модулях – описание функций выглядит так:

// Функция предназначена для Вибрации.
// Доступность: Клиент;
//
// Параметры:
//  Длительность  - Число - Длительность вибрации
//
// Возвращаемое значение:
//   Соответствие, Неопределено   - Если ответ = Неопределено, то была ошибка.
//
&НаКлиенте
Функция Вибрация(Длительность)  Экспорт
    СтруктураСообщения = УтилитыACODEСлужебный.СформироватьСтруктуруДляВибрации(Длительность);
    Возврат ВыполнитьИнтенты(СтруктураСообщения);
КонецФункции

Или вот так, в случае сервера:

// Функция предназначена для Вибрации.
// Доступность: Клиент, Сервер;
//
// Параметры:
//  Длительность  - Число - Длительность вибрации
// Возвращаемое значение:
//   Соответствие, Неопределено   - Если ответ = Неопределено, то была ошибка.
//
Функция Вибрация(Длительность)  Экспорт
    СтруктураСообщения = УтилитыACODEСлужебный.СформироватьСтруктуруДляВибрации(Длительность);
    Возврат ПредопределенноеПодключение(СтруктураСообщения);
КонецФункции

Как видно – обе функции обращаются к модулю УтилитыACODEСлужебный.

Там и происходит формирование параметров для отправки. И как вы понимаете – оно идентично для работы как с веб-сервером, так и с намерениями.

Выглядит оно вот так:

Функция СформироватьСтруктуруДляВибрации(Длительность)  Экспорт
	Сервис = Новый Соответствие;	
	Сервис.Вставить("Service","Vibration");
	Сервис.Вставить("Duration", Длительность);
	Возврат Сервис;
КонецФункции

Т.е. формируется вложенная структура соответствий, где указывается само действие (Vibration) и его параметры.

После этого, в зависимости от того – что мы вызываем (намерение или веб-сервер), у нас происходит следующее:

В случае работы с намерениями:

&НаКлиенте
Функция ВыполнитьИнтенты(Параметры, ВернутьСтроку = Ложь) Экспорт
	#Если МобильноеПриложениеКлиент Тогда
		НовВз = Новый ЗапускПриложенияМобильногоУстройства();
		НовВз.Действие = "ru.acode.1c.tools";
		Если ТипЗнч(Параметры) = Тип("Массив") Тогда
			Массив = Параметры;
		Иначе
			Массив = Новый Массив;
			Массив.Добавить(Параметры);
		КонецЕсли;
		НовВз.ДополнительныеДанные.Добавить("Data",УтилитыACODEСлужебный.Сериализовать(Массив));
		
		Результат = НовВз.Запустить(Истина);
		Если Результат = 0 Тогда
			Сообщить("Ошибка выполнения " + Результат);
			Возврат Неопределено;
		Иначе
			Результат = НовВз.ДополнительныеДанные.Получить("Data").Значение;
			Возврат УтилитыACODEСлужебный.ОбработкаОтвета(Результат);
		КонецЕсли;		 
	#Иначе
		Возврат "Доступно только на мобильном устройстве!"
	#КонецЕсли
КонецФункции

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

Далее проверяем результат, если он равен 0, то все ок, иначе – вот список ошибок:

//Коды ошибок при ответе:
 //E_OK = 0;
 //E_INVALID_SERVICE = 1;
 //E_INVALID_PARAMS = 2;
 //E_INVALID_PARAM_VALUE = 3;
 //E_FILE_ERROR = 4;
 //E_NETWORK_ERROR = 5;
 //E_HARDWARE_NOT_SUPPORTED = 6;
 //E_BUSY = 7;
 //E_AUTH_REQUIRED = 8;
 //E_INTERNAL_ERROR = 9;

Если все хорошо, то мы возвращаем ответ.

В случае работы с веб-сервером:

Функция ПредопределенноеПодключение(Параметры) Экспорт
	АдресСервера = Константы.АдресСервера.Получить();//"127.0.0.1";
	ПортСервера = "8090";
	
	//Если подключение идет извне, то надо указать ID устройства.
	ID = Константы.ID.Получить();
	Если ТипЗнч(Параметры) = Тип("Массив") Тогда
		Массив = Параметры;
	Иначе
		Массив = Новый Массив;
		Массив.Добавить(Параметры);
	КонецЕсли;

	Если ЗначениеЗаполнено(ID) Тогда
		ОписаниеДанных = Новый Соответствие;
		ОписаниеДанных.Вставить("Key", ID);	
		Массив.Вставить(0,ОписаниеДанных); 
	КонецЕсли;
	
	ТелоСообщения = УтилитыACODEСлужебный.Сериализовать(Массив);
	
	Попытка
		Соединение = Новый HTTPСоединение(АдресСервера,ПортСервера,,,,5);
		Заголовки = Новый Соответствие;
	
		Запрос = Новый HTTPЗапрос("/", Заголовки);
		Запрос.УстановитьТелоИзСтроки(ТелоСообщения);
		ОтветСервера =Соединение.ОтправитьДляОбработки(Запрос);
		Если ОтветСервера.КодСостояния = 200 Тогда // Данные получены, обрабатываем их
			Возврат УтилитыACODEСлужебный.ОбработкаОтвета(ОтветСервера.ПолучитьТелоКакСтроку());
		КонецЕсли;
		//"Не получен ответ от сервера! " + Ответ + ОтветСервера.КодСостояния
		Возврат Неопределено;
	Исключение
		//Не удалось установить соединение с сервером
		Возврат Неопределено;
	КонецПопытки;
	
КонецФункции

Тут, как видите – мы в тело запроса добавляем xml, ну и получаем тоже xml, все точно так же, как и с интентами. За исключением одного – если вызов сервера идет не с локального устройства, то необходимо еще и указать IDклиента. Это сделано для безопасности, т.е. не зная связку IP + ID– не получится что-то выполнить на устройстве.

Ответ же обрабатывается следующим кодом:

Функция ОбработкаОтвета(Ответ) Экспорт
	Попытка
		МассивРезультатов = Десериализовать(Ответ);
	Исключение
		Сообщить("Ошибка десериализации ответа!");
		Сообщить(ОписаниеОшибки());
		Возврат Неопределено;
	КонецПопытки;
	
	Для Каждого СтрОтвета Из МассивРезультатов Цикл
		//Обрабатываем только первый элемент. Ответ от цепочки - надо анализировать самостоятельно
		Если СтрОтвета.Получить("Result") = 0 Тогда
			Возврат СтрОтвета.Получить("Data");
		Иначе
			Сообщить("Ошибка выполнения (утилиты) " + СтрОтвета.Получить("Result"));
			Возврат Неопределено;
		КонецЕсли;
	КонецЦикла;
	
КонецФункции

Особенности работы с утилитами

Утилиты делятся на две части:

1.     Предопределенные функции

2.     Произвольные скрипты

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

К таким функциям относятся следующие:

      Push-сообщения

      Toast-сообщения

      Получение конфигураций оборудования:

      модель,

      бренд,

      версию андроид,

      ip адрес,

      уникальный ID устройства;

      Запуск мобильных приложений на сервере;

      Работа с Bluetooth сканерами

      Motorola CS3070

      Cipherlab 1660

      Работа с NFC;

      Проигрывание звука, или системного, или из файла;

      Включение GPS трекинга с возможностью забрать трек;

      Запись данных в logcat;

      Проверка на включен/выключен:

      wi-fi,

      gps,

      мобильный интернет,

      И т.д.

      Проверка наличия интернета;

      Виджет с выводом html страницы из мобильной 1С или переходом на сайт;

      Возможность заархивировать файлы в zip;

      Работа с ftp (отправка и получение файлов);

      И др.

И выполнением произвольного кода Android, на основе скриптов BeanShell. Про это мы поговорим позже.

Теперь я предлагаю рассмотреть суть дополнительного функционала, т.е. легкий экскурс в то, какие параметры за что отвечают и т.д.

Что надо для работы с утилитами

Ну ясное дело – их необходимо установить. Для этого – я предлагаю взять конфигурацию и подключить ее к вашей мобильной платформой.

Как это сделать – я рассказывал тут (http://infostart.ru/public/242857/).

Вы можете скачать конфигурацию из раздачи к этой публикации и подключить ее.

Если же нет особого желания возиться с этим, то можете подключить конфигурацию по пути: http://acode.pro/~mu.

После запуска приложения – вас встретит вот такое вот окно:

После этого – нажимаем на самую первую кнопку «Установить утилиты». В этот момент – из макета 1С будет выгружен apk файл и будет запущенна установка приложения. Устанавливаем его. И самое главное – после этого приложение надо запустить. Если все ок, то у вас в статусах появится вот такое приложение:

Нажимаем на него. Откроется окно приложения:

Тут будут отображаться логи вызовов сервера, а так же ваши логи, которые вы будете записывать через функцию LogCat.

Далее – переходим в настройки, и видим вот такую картину:

Объяснять тут нечего, все вроде и так понятно.

После всех этих манипуляций – считаем, что с тем, что такое утилиты и их опциями – мы познакомились.

Теперь переходим к работе с ними.

Toast сообщения

Тоаст сообщения – это не навязчивая всплывающая подсказка, выглядит она вот так:

У нее только два параметра – само сообщение и длительность. Такие сообщения имеет смысл показывать только в контексте &НаКлиенте, так как в этот момент мы уверены, что человек работает с устройством и он увидит это сообщение.

Push сообщения

Пуши – это одна из самых важных опций для общения с пользователем.

Давайте разберем ее настройки:

 

Ну с заголовком, текстом и описанием – я думаю и так все понятно.

А вот действие (Добавить/Удалить) – тесно связанно с ID сообщением. Т.е. каждое сообщение имеет свой ID, и если вы добавляете сообщение с тем же ID, то оно обновит существующее.

Картинки доступны только 4, и увы, Андроид не позволяет добавлять картинки произвольные, только те, которые вшиты в само приложение. Поэтому – придется обходиться тем, что есть. Но если есть надобность добавить, обоснованная надобность, то пишите в камментах.

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

Информация об устройстве

Это один из пунктов, про которые стоит поговорить подробней.

Выглядит это вот так:

На счет галочек:

Моб. инет – говорит о том, что сейчас используется мобильный интернет. Так что если вам надо синхронизировать 50 метров данных, то стоит задуматься – надо ли это делать сейчас?

Сеть – говорит о том, что есть некое сетевое подключение к инету, или моб инет, или wi-fi.

Wi-Fi – говорит о том, что wi-fiвключен и, главное, что есть подключение к ней сети. А есть ли выход в инет, можно узнать по предыдущей галочке.

Про остальное – ID устройства, это уникальный идентификатор текущего устройства. Он является не стационарным в контексте текущего устройства.

Если кому интересно – высчитывается он вот так:

String tmDevice, tmSerial, androidId;
     TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
     tmDevice = "" + tm.getDeviceId();
     tmSerial = "" + tm.getSimSerialNumber();
     androidId = "" + android.provider.Settings.Secure.getString(getContentResolver(), android.provider.Settings.Secure.ANDROID_ID);

     UUID deviceUuid = new UUID(androidId.hashCode(), ((long)tmDevice.hashCode() << 32) | tmSerial.hashCode());
     Adler32 adler = new Adler32();
     adler.update(deviceUuid.toString().getBytes());
     _ID = (int)(adler.getValue() & 0xffffffff); 

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

Статус бренд – это данные полученные из файла настроек build.prop. Из этого файла можно получать разные данные, включая бренд устройства и т.д. Для того, что бы понять – что можно получить с вашего устройства – откройте сам файлик, это можно сделать при помощи разных программ, например вот этой, и смотрите ключ и значение. Передав ключ в параметры функции – вы получите значение в ответ.

Ну с IP адресами вроде и так все понятно.

LogCat – запись логов

LogCat – это некий аналог технологического журнала для 1С.

Данная опция – позволяет записывать данные в этот журнал и считывать их оттуда.

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

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

Читать логи можно специальными программами, например вот этой. Но, logcat – это место, куда скидывается вся информация с андроида, поэтом и надо указывать плавильный тег. По этому тегу – среди всего этого мусора и ищется то, что вам нужно.

Но, кроме этого – лог дублируется в главное окно программы. Выглядит это вот так:

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

Тут же – удобно анализировать некие общие данные. Так как тут поддерживаются некие теги html, то вы можете цветами выделить нужные вам области. В Остальных программах – теги игнорируются.

Остальной функционал

К остальному функционалу описание давать смысла не имеет особого, смотрите в демо конфигурации.

Кроме этого, что делать, если надо сделать пуш сообщение, провибрировать и сделать звуковое сообщение?

Т.е. первая мысль – а давайте вызовем сразу три события. Отчасти это правда.

Но я думаю вы уже увидели, что передается массив структур, и не спроста.

А причина в том, что можно составить алгоритм и отправить и выполнить его.

Все функции будут выполнятся последовательно. Т.е. можно заархивировать файл, отправить на ftp, получить файл, разархивировать, прочитать и т.д. И все это можно сделать в фоне.

Вот пример решения описанной задачи:

            Массив = Новый Массив;
            Массив.Добавить(УтилитыACODEСлужебный.СформироватьСтруктуруТоастСообщения("Сейчас выполняется сразу 4 операции"));
            Массив.Добавить(УтилитыACODEКлиент.ПушСообщение("Некий пуш","Это 2 операция"));
            Массив.Добавить(УтилитыACODEКлиент.Вибрация(500));
            Массив.Добавить(УтилитыACODEСервер.ПроигратьЗвук("Sound","Balloon"));
            УтилитыACODEКлиент.ВыполнитьИнтенты(Массив);

Подключение Bluetoothсканеров

Поддерживается работа только со сканерами MotorolaCS3070 и CipherLab 1660. Возможно и с другими тоже, но их под рукой нету.

Для работы – необходимо сканер перевести в режим SPP (Serial Port Profile), обратите внимание – НЕ В HID режим.

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

После этого – у вас НЕ будет сканировать сканер в активное поле.

Вы идете в 1С, получаете список спаренных устройств и подключаете нужное вам, теперь сканер подключится и все, что он будет сканировать – будет попадать в ACODEtools, далее, вы можете забирать данные оттуда.

Тестирование ТСД

Это опция только для тех, у кого есть терминал фирмы ACODE. Позволяет из 1С работать со сканерами терминала.

Плагины

Теперь одна из самых интересных вещей. Плагины.

Плагины основаны на BeanShell, суть этого действа заключается в том, что вы пишете некое свое решение под Android. Просто в текстовый документ. Помещаете документ в папку ACODE, и перезагружаете утилиты (кнопочка справа вверху).

После этого – утилиты компилируют код и подключают плагин. Теперь вы можете с ним работать.

Например, давайте решим задачу ввода некой строки. Или количества. Видь те формы, которые дает 1С для решения этой задачи – вообще не подходят.

Для этого – нажимаем в конфигурации Выгрузить плагины. Будет создан файлик из макета 1С. Это просто текстовый файл. Далее – перезагружаем утилиты и нажимаем кнопку Ввод строки. И видим вот такую картинку:

Т.е. красивое и элегантное поле. При вводе данных – всплывает клавиатура, и как видите совсем не для строки, а для чисел.

А вот какая клавиатура всплывет – отвечает параметр Тип. Сейчас он равен 1002.

Про типы можно прочитать тут - https://github.com/android/platform_frameworks_base/blob/master/core/java/android/text/InputType.java.

Суть типов сводится к следующему – последний символ говорит о том, что это будет за тип данных, а первый – маску ввода.

Давайте посмотрим пару примеров:

/**
* Variation of {@link #TYPE_CLASS_TEXT}: entering an e-mail address.
*/
public static final int TYPE_TEXT_VARIATION_EMAIL_ADDRESS = 0x00000020;

/**
* Class for a phone number. This class currently supports no variations
* or flags.
*/
public static final int TYPE_CLASS_PHONE = 0x00000003;

Ну и ясное дело, что если тип поля стоит строковый, то к нему подойдут маски только для этого типа.

Принцип написания плагинов

Теперь давайте разберемся с тем, как эти плагины пишутся.

Для этого можете посмотреть файлик sample.bsh. Можете выгрузить его из общего макета конфигурации.

//Внутренние пакеты модули.
import ru.acode.helper.instances.ScriptHelper;
import ru.acode.helper.ServiceDescriptor;
import ru.acode.helper.ServiceDescriptor.MethodParamType;
import ru.acode.helper.ServiceDescriptor.MethodParam;
import ru.acode.helper.Services;
import ru.acode.utils.ValueMap;
//Этот код переносите просто как шаблон.
 
// Импортизпакетов Android
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.R;
import android.content.Context;
import android.widget.CheckBox;
import android.widget.LinearLayout;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;
import android.widget.Spinner;
import android.widget.EditText;
import android.widget.ArrayAdapter;

//Глобальные переменные
TYPE_EDITFIELD = 1;
TYPE_CHECKBOX = 2;

ValueMap result = new ValueMap();
result.put(Services.INVOKE_RESULT, Services.E_OK);

initializer = new ScriptHelper.Initializer() {
  onInit(descriptor) {
      descriptor.setWaitForUserFinish(true);  //указываем, что делаем модальный вызов
      descriptor.setName("SampleDialog"); //Имя сервиса. Именно по нему мы и обращаемся к этому плагину из 1С
//Далее мы уже описываем переменные. Можно и не описывать, но тогда надо делать контроль заполнения и проверку типов самому.
              //MethodParam - состоит из имени параметра, типа, и обязательности использования (Истина - не обязательный).
              //Типы могут быть:
              //decimal,string,bool,map,array,bytearray
//Тут мы говорим, что у нас есть параметр «Type», который должен быть числовым, и он должен таки быть. Ну и т.д.
//Этакой модуль проверки заполнения
      descriptor.params().add(newMethodParam("Type",MethodParamType.decimal,false)); // Булево параметр, может отсутсвовать
      descriptor.params().add(newMethodParam("Params",MethodParamType.map,false)); // Массив строк, может отсутствовать
  }
};

var type,inputField; // Объявляем глобальные переменные


//Это идет вызов события после нажатия кнопки. Т.е. мы помещаем в Value– результат ввода.
buttonListener = new DialogInterface.OnClickListener() {
  onClick(DialogInterface dialog, int button) {
     if(button == DialogInterface.BUTTON_POSITIVE) {
                        if(type == TYPE_EDITFIELD)
                            result.put("Value",inputField.getText().toString());
                        else if(type == TYPE_CHECKBOX)
                        result.put("Value",inputField.isChecked());
     }
  }
};
 

dismissListener = new DialogInterface.OnDismissListener() {
  onDismiss(DialogInterface dialog) {
     helper.finish(result);
  }
}; 

 

executor = new ScriptHelper.Executor() {

  onExecute(Context context, ValueMap params) {
     //А вот тут и идет само описание того, что нам надо выполнить.
      builder = new AlertDialog.Builder(context);
//Обратите внимание как мы получаем значение параметра.
      type = params.getInt("Type",-1);
              typeParams = params.getValueMap("Params");
              if(type == TYPE_EDITFIELD) {
                        layout = new LinearLayout(context);
        layout.setOrientation(LinearLayout.VERTICAL);
                        layout.setPadding(8, 8, 8, 8);
                        TextView label = new TextView(context);
                        label.setText(typeParams.getString("Title"));
                        LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT);
                        lp.rightMargin = 4;
                        layout.addView(label,lp);
                        inputField = new EditText(context);
                        inputField.setInputType(Integer.parseInt(typeParams.getString("InputType"),16));
                        LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.WRAP_CONTENT);
                        layout.addView(inputField,lp);
                        String Str = "";
//Проверяем, если у нас в Valueпередана строка, то мы заполняем это поле. Обратите внимание – мы не проверяем на заполнение, а именно проверку типов.
                        if(typeParams.isString("Value"))
                            Str = typeParams.getString("Value");
                        inputField.setText(Str.trim());
                        builder.setView(layout);                      
              }
              else if(type == TYPE_CHECKBOX) {
                        inputField = new CheckBox(context);
                        inputField.setText(typeParams.getString("Title"));
                        inputField.setChecked(typeParams.getBoolean("Value",false));
                        builder.setView(inputField);
              }
     builder.setPositiveButton(R.string.ok,buttonListener);
     builder.setNegativeButton(R.string.cancel,buttonListener);
     dialog = builder.create();
     dialog.setOnDismissListener(dismissListener);
     dialog.show();
     return result;

  }

};

helper = new ScriptHelper(initializer,executor); // Именавпакетахмогутсовпадать, ничегострашного
//initializer - тут описываем сам сервис, при перезагрузке утилит
//executor - интерфейс который вызван при вызове скрипта.

Вот и все, т.е. грубо говоря – все состоит из трех блоков:

1.     Проверка заполненных данных

2.     Описание возврата результат

3.     Описание алгоритма работы.

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

Заключение

Вот на этом пока и все. Предлагаю теперь обмениваться интересными скриптами, для решения тех или иных задач.

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

Наименование Файл Версия Размер
Acode Tools (Android 6) 39
.cf 6,18Mb
02.09.16
39
.cf 6,18Mb Скачать
ACODE утилиты 109
.cf 6,16Mb
02.09.16
109
.cf 2.08 6,16Mb Скачать

См. также

Подписаться Добавить вознаграждение
Комментарии
2. Эмиль Карапетян (amon_ra) 10.11.14 00:58
Наконец-то появилась статья! :) Ждал ее появления с нетерпением после конференции)
3. Vladimir none (Montecrizto) 10.11.14 03:45
Например, давайте решим задачу ввода некой строки. Или количества. Видь те формы, которые дает 1С для решения этой задачи – вообще не подходят.
4. Дмитрий Шерстобитов (DitriX) 10.11.14 07:40
5. Андрей Волин (kser87) 10.11.14 10:27
Потрясающая статья! Очень полезная!
6. John Smith (PiccaHut001) 10.11.14 11:28
7. Артем Ватан (v.a.ryag) 10.11.14 11:53
(3) Montecrizto, тоже ненадолго завис пытаясь понять что такое "Видь"))
За статью большой + !!! Действительно всех этих вещей пока очень не хватает в мобильной платформе, равно как и гибкой настройки форм - что крайне необходимо при использовании мобильного приложения (например меню в виде плитки я лично реализовывал через "одно место" - в итоге все равно форма получилась чуть шире экрана и при движении пальцем немного прокручивается)
8. Sergey Mosalov (dablack) 10.11.14 12:06
Я ждал этого больше года!!! НО, у меня ни как не получается подключить ChipeLab 1560, вроде все делаю как надо, перевел сканер в режим SPP Slave (проверил программой типа BT SPP terminal - в ней все ок, штрихи читает), в 1с на кпк в списке показывает BT cканер, но пытаюсь подключиться пишет "Ошибка выполнения 0". Подскажите плиз куда можно капнуть, очень ждал Ваш функционал и тут ах... Спасибо.
9. VVV (V_V_V) 10.11.14 13:21
Прикольно. Пригодится.
Надеюсь, на платную основу нет мыслей переводить? :)
10. Дмитрий Шерстобитов (DitriX) 10.11.14 13:28
(8) dablack, ну мы тестировали на 1660. Список активных сопряжений выводит?
(9) если мы даже будем продавать по 1000 на каждого программиста, то этот функционал окупит себя с первого клиента, так как добавляет много доп работы программисту 1с.
Но мы пока про это все не думаем.
11. Сергей Галюк (dj_serega) 10.11.14 16:10
DitriX, Вы красавчик!!! Премию бы Вам выдать.
12. Sergey Mosalov (dablack) 10.11.14 16:12
(10) DitriX, Да, выводит, а при нажатии "подключить" вываливает сообщение с MACом и "Ошибка выполнения 0". А сканер нужно перевести в SPP Slave или SPP Master? Я когда переводу в Slave, то КПК нормально его видит, а когда в Master - то ни как не могу подключить сканер к КПК (пишет, что не верный пин или пароль). Очень надеюсь, получиться получать ШК в 1с.
13. Дмитрий Шерстобитов (DitriX) 10.11.14 16:37
(11) уже получил премию на конференции инфостарта :)
(12) а какой пин вводите? Введите 1234 на смарте и на терминале. Или 0000.
14. Sergey Mosalov (dablack) 10.11.14 16:54
(13) DitriX, немножко повторюсь: у меня без проблем сканер подключается к КПК в режиме BT Slave (при этом 1С с ACODE сканер видит, но не подключает), а в режиме BT Maser я не могу подключить сканер к КПК, у меня даже не спрашивает PIN а сразу выдает сообщение, что не верный PIN или пароль. Но я не знаю, мне может быть и сто лет не нужен режим BT Master т.к. ACODE с таким режимом не работает (это я и хочу выяснить).
15. Дмитрий Шерстобитов (DitriX) 10.11.14 17:22
(14) я вам тоже не отвечу, увы. Я оба сканера и моторолу и сайферлаб - забыл в питере :)
Давайте тогда методом тыка пытать все это.
Для начала - выключите сканер, но оставьте его в списке сопряженных устройств и оставьте включенный BT.
Попробуйте еще раз получить список сканеров - он у вас должен появиться в списке.
Нажмите подключиться - должа выпасть ошибка 6. Т.е. ошибка устройства. Если ошибка 0, то это ошибка в самом плагине.
Напоминаю, все это делается при выключенном сканере.

Далее - сформируйте лог при помощи программки logcat, ссылку на нее я указал в статье - сделайте отбор по acode - меню - отправить - как приложение и отправьте себе на почту или куда нибудь, потом прикрепите файл сюда.
16. Sergey Mosalov (dablack) 10.11.14 18:32
(15) DitriX, Спасибо Вам большое за советы. Проблема видимо в блютузе конкретных КПК (Fly, Explay хотя в режиме HID с этими аппаратами проблем не было), взял Samsung и вуаля! сканер в Режиме BT Slave из 1с подключился (только пока не совсем понял реализацию сканирования, кнопку "обновить" надо нажать чтобы увидеть что отсканировано?, а по типу "Внешнее событие" как делать?). Logcat поставил, но он только под рутом работает, попозже попробую снять логи Fly и Explay почему они заразы не хотят работать. Еще раз большое спасибо за вашу разработку!
17. Дмитрий Шерстобитов (DitriX) 10.11.14 18:46
(16) увы, 1с не поддерживает внешние события, так что по другому никак. По крайней мере - пока что.
Но, можно подключить обработчик ожидания, вот как с терминалами сделано и тогда все будет норм.
18. Ruslan (flyer) 11.11.14 14:33
классная разработка однозначно что то подобное начинал делать но бросил. такая вещица мне сейчас на google play нужна к моим программам но у вас политика другая вы ее там размещать не будете.
19. Дмитрий Шерстобитов (DitriX) 11.11.14 15:00
(18) если держать ее там, то это значит что надо поддерживать кучу вариантов апи, т.е. версионность, а это слишком сложно.
Проще в конфу добавлять их и все. 3 метра особой погоды не сделают, либо где то у себя ее выложить и оттуда устанавливать.
20. Sergey Mosalov (dablack) 12.11.14 16:37
(19) DitriX, Продолжил выяснение причин почему у меня не подключаются сканеры на ряде устройств. Сделал лог с помощью CatLog и вот, что увидел при попытке подключения :
11-12 17:23:17.561 W/System.err(482): java.lang.SecurityException: Need BLUETOOTH_ADMIN permission: Neither user 10084 nor current process has android.permission.BLUETOOTH_ADMIN.
Какая то у меня проблема с правами. Хотя на форумах по этой проблеме пишут, что надо править в манифесте андроид приложения.
p.s. устройства на которых не работает объединяет то, что она на Adroid 4.2.2. Устройство на котором Adroid 4.1.2 - все работает.
Прикрепленные файлы:
2014-11-12-17-23-41.txt
21. Дмитрий Шерстобитов (DitriX) 12.11.14 18:07
(20) спасибо, скоро обновим.
22. Sergey Mosalov (dablack) 12.11.14 18:09
(21) DitriX, Вам спасибо! Буду очень ждать обновления.
23. Ярослав Радкевич (WKBAPKA) 13.11.14 10:31

Не хватает возможностей в мобильной платформе 1С?
Надо push сообщения, логи, zip, ftp, работа с nfc и bluetooth сканерами в режиме "внешнего события"?
Или может хотите исполнить произвольный код андроида с передачей параметра из 1С и получением обратно?


используйте Eclipse или Android Studio и изучайте язык программирования Java :)
omegus; OLEG4120; eugeniezheludkov; antonbezrukov; ZLENKO; Persempre; ya.Avoronov; Anixx; DigitalMan; dour-dead; baton_pk; sorb; +12 Ответить 2
24. Дмитрий Шерстобитов (DitriX) 13.11.14 14:10
(23) есть шанс не вернуться на 1с :)
el-gamberro; omegus; Anixx; ezhik_2000; +4 Ответить
25. Александр Брязгин (abryazgin) 14.11.14 14:05
А можно плагин написать, который бы брал фотографию, полученную с камеры средствами 1С и преобразовывал в нужный формат, чтобы уменьшить объем передаваемых в центральную базу данных?
26. Дмитрий Шерстобитов (DitriX) 14.11.14 14:40
(25) можно. Но разве не проще сразу делать фото нужного качества?
27. Александр Брязгин (abryazgin) 14.11.14 18:09
Возможно и проще. Есть 2 но.
1) 1С не выдает фото нужного качества. Настроек я не нашел.
2) Нужна еще картинка просмотра, чтобы форма не висла. У меня сейчас при добавлении на форму 5-ти полей картинки платформа вылетает (если 4, то форма открывается нормально). Когда переделал на отображение картинок в Поле html, то с каждой новой картинкой все больше проявляются подвисания отображения этого поля. В итоге к 5 картинкам платформа не вылетает, но работать невозможно ). Каждая картинка получена с камеры и весит порядка 1,5 мб.

Если есть вариант как сделать картинку и просмотр без применения кувалды, то хочу его знать )))
У меня на тестируемом девайсе не получилось поместить фотографию сделанную через вызов запустить приложение.
Делал по примеру "Как сделать фото (видео) в любом качестве?" из другой вашей публикации (http://infostart.ru/public/301851/). Картинку получаю, но поместить ее внутрь базы 1С не получилось.
В с этим вопросом тоже хотел бы разобраться.

Но все равно это не решение, так как при использовании получения фото из 1С требуется меньше кликов по экрану (ровно один, против 2-х через запустить приложение: сделать фото, нажать вроде "ок", чтобы закрылось окно просмотра фото и данные можно было забирать в 1С).
28. Дмитрий Шерстобитов (DitriX) 15.11.14 13:53
(27) а как вы убедитесь, что фото было сделано верно? Т.е. не смазано и т.д.?
По поводу той статьи - что именно у вас не получилось? Создать двоичные данные и поместить в хранилище?
29. Sergey Mosalov (dablack) 17.11.14 14:29
(21) DitriX, А когда примерно можно ждать обновления с исправленным подключением сканера?
Заметил еще одну проблему: если форма, в которой работает ОбработчикОжидания получающий каждую 1сек. штрихкоды открыта около 8 минут то мобильное приложение виснет, а потом просто закрывается. Поставил 3 секунды - зависло примерно через 24 минуты.

30. Дмитрий Шерстобитов (DitriX) 17.11.14 15:26
(29) сейчас допиливаем новый функционал и выложим.
На счет вылета - какая версия платформы?
И пробовали ли вы переподключать обработчик каждые 8 минут? Это конечно через Ж, но что поделать...
31. Дмитрий Шерстобитов (DitriX) 17.11.14 15:32
(29) и посмотрите логкат, может там хоть что то попадает туда?
32. Дмитрий Шерстобитов (DitriX) 17.11.14 15:52
(29) Да, по ходу нашел ошибку :) Точнее - очередной прикол 1с, хотя, с другой стороны - вызывать интенты в цикле - тоже не совсем верно.
&НаКлиенте
Процедура АвтоОбновление(Команда)
	ОтключитьОбработчикОжидания("Обновить");
	ПодключитьОбработчикОжидания("Обновить",1,Ложь);
	УтилитыACODEКлиент.ТоастСообщение("Подключен обработчик опроса сканера раз в секунду");
КонецПроцедуры

&НаКлиенте
Процедура Обновить()
	Сервис = Новый Массив;
	ПараметрыДанных = Новый Соответствие;
	ПараметрыДанных.Вставить("Service","BTReader");
	ПараметрыДанных.Вставить("Action","Read"); 	
	Сервис.Добавить(ПараметрыДанных); 
	//МассивСканеров = УтилитыACODEКлиент.ВыполнитьИнтенты(Сервис);
	МассивСканеров = УтилитыACODEСервер.ПредопределенноеПодключение(Сервис);
	Если МассивСканеров = Неопределено Тогда Возврат КонецЕсли;
	Для Каждого Стр Из МассивСканеров Цикл
		Нов = Объект.Штрихкода.Добавить();
		Нов.Штрихкод = Стр;
	КонецЦикла;
КонецПроцедуры
...Показать Скрыть


Обратите внимание - вызов надо делать через сервер, а не клиент :)
33. Sergey Mosalov (dablack) 17.11.14 17:12
(32) DitriX, Еще раз спасибо! Ближе к ночи смогу попробовать побороть проблему с вылетами.
34. Sergey Mosalov (dablack) 17.11.14 19:14
(32) DitriX, Проверил, после 8 минут появляется сообщение: "Ошибка выполнения (утилиты) 2". Но главное, что ни чего не вылетает и убрав это сообщение можно след. 8 минут работать :) Как вариант в принципе все равно можно будет попробовать через 8 мин перезапускать обработчик.
Кстати такой вариант, наверное через одно место но все же: есть такой стандартный обработчик ПодключитьОбработчикSMSСообщений("ИмяПроцедуры"), а нельзя ли как нибудь в него с помощью андроид приложения эмулировать отправку смс, но в котором будет шк? Вот и был бы аналог внешнего события.
35. Дмитрий Шерстобитов (DitriX) 17.11.14 19:16
(34) подумаем. Спасибо за идеи. Такой же обработчик есть и сканирования штрихкодов. Вот сейчас думаем на эту тему.
А эта ошибка один раз появляется? А то у меня через интенты 1С зависала через минуту, а через сервер - я тестировал пол часа и было норм.
36. Николай Моисеев (Azathtot) 17.11.14 19:18
(34) dablack, Спасибо за идею. Разослать броадкаст о якобы приходе SMS не сложно,но есть ненулевая вероятность, что у других программ, читающих SMS от этого "снесет крышу".
37. Sergey Mosalov (dablack) 17.11.14 19:39
(35) DitriX, Ошибка (с одинаковым содержанием) у меня появляется каждый 8 мин, закрыл и продолжил дальше сканировать. А вот то, что у вас через сервер не виснет и не выдает ошибок странно, а период обработчика ожидания какой ? 1 сек.?
38. Sergey Mosalov (dablack) 17.11.14 19:42
(36) Azathtot, У меня например нет на складских КПК других приложений кроме 1С :)
39. Николай Моисеев (Azathtot) 17.11.14 19:45
(38) dablack, Ага, а стандартного Messages тоже нет? :) Вроде нашли способ, сейчас буду разбираться. День-два нужно.
40. Sergey Mosalov (dablack) 17.11.14 19:57
(39) Azathtot, точно, есть, не подумал про него. Удачи!
41. Александр Брязгин (abryazgin) 18.11.14 14:18
(28) DitriX,
1) В предполагаемом приложении должен быть предпросмотр, там можно определить, если фото сделано плохо. Но я так понял, что 1с после нажатия кнопки сфотографировать еще фокус потом настраивает сама (на моем устройстве).
2) Да не получилось получить двоичные данные, чтобы в РС внести.
Что пробовал
				
ФайлКартинки = "file:///sdcard/Download/FotoTestFrom1C.jpg";
НовВз = Новый ЗапускПриложенияМобильногоУстройства("android.media.action.IMAGE_CAPTURE");
НовВз.ДополнительныеДанные.Добавить("output",ФайлКартинки,"Uri");
Если НовВз.Запустить(Истина) <> 0 Тогда
        //ЗапуститьПриложение(ФайлКартинки); -- работает

        //помещение во временное хранилище работает
        ПутьКВРемХран = "";
        ПоместитьФайл(ПутьКВРемХран, ФайлКартинки,,ложь, УникальныйИдентификатор);

        //получить двоичные данные не получается ни напрямую из файла
	Попытка 
		Данные = Новый ДвоичныеДанные(ФайлКартинки);
	Исключение
		Сообщить(ОписаниеОшибки()); //Ошибка конструктора, недопустимое значение параметра
	КонецПопытки;	
	Попытка 
	    Данные = Новый ДвоичныеДанные(ПутьКВРемХран);
	Исключение
		Сообщить(ОписаниеОшибки()); //Файл не обнаружен "e1cib\tempstorage\..."
	КонецПопытки;	
КонецЕсли;
...Показать Скрыть
42. Дмитрий Шерстобитов (DitriX) 18.11.14 14:40
(41)
ФайлКартинки = "file:///sdcard/Download/FotoTestFrom1C.jpg";
НовВз = Новый ЗапускПриложенияМобильногоУстройства("android.media.action.IMAGE_CAPTURE");
НовВз.ДополнительныеДанные.Добавить("output",ФайлКартинки,"Uri");
Если НовВз.Запустить(Истина) <> 0 Тогда

    Данные = Новый ДвоичныеДанные(ФайлКартинки);
    Хр = Новый ХранилищеЗначение(Данные);
КонецЕсли;
...Показать Скрыть


Вместо Хр - может быть реквизит справочника с типом ХранилищеЗначений.
Ну естественно надо распределить клиент и сервер, это я так, по памяти написал.
43. Sergey Mosalov (dablack) 18.11.14 18:21
(42) DitriX, а вас не затруднит сообщить мне в приват, свои контакты, я пытаюсь отправить вам сообщение... и безрезультатно. Я бы хотел по ТСД ACode уточнить информацию.
44. Дмитрий Шерстобитов (DitriX) 18.11.14 18:42
45. Александр Брязгин (abryazgin) 19.11.14 10:59
(42) DitriX,
У меня не выполняется строка
    Данные = Новый ДвоичныеДанные(ФайлКартинки);

Говорит, что "Недопустимое значение параметра (параметр номер '1')".

Пробовал выполнять получение двоичных данных как на сервере так и на клиенте.
Платформа 8.3.5.1186.

Точно такой способ получения двоичных данных должен работать на мобильном приложении? Есть примеры на какой платформе у вас точно работает?
46. Дмитрий Шерстобитов (DitriX) 19.11.14 15:21
(45) не так
Данные = Новый ДвоичныеДанные(ФайлКартинки);

Потому что у вас:
ФайлКартинки = "file:///sdcard/Download/FotoTestFrom1C.jpg";

а это uri, а не путь к файлу. Значит в вашем случае:
Данные = Новый ДвоичныеДанные( "/sdcard/Download/FotoTestFrom1C.jpg");
poligraff; abryazgin; +2 Ответить 1
47. Константин Гейнрих (CyberCerber) 20.11.14 08:25
Спасибо за ваши публикации по мобильной платформе!
С каждым разом они становятся все интересней и полезней.

Подскажите, пожалуйста... Скачал xml файл по пути "http://acode.pro/~mu". Создал в сборщике моб приложений apk файл, закидываю его на планшет, устанавливаю, запускаю. Появляется окно запуска 1С, потом иконка загрузки, и все на этом зависает. В чем может быть проблема?
48. Дмитрий Шерстобитов (DitriX) 20.11.14 14:53
(47) ну обычно это бывает есл на arm установить образ x86
49. Николай Моисеев (Azathtot) 20.11.14 20:33
(40) dablack, Собственно, решили мы проблему. Сделал через SMS механизм. DitriX на днях думаю выложит конфигурацию
50. Александр Брязгин (abryazgin) 21.11.14 11:16
(46) DitriX, Спасибо, огромное. Так работает.

Пытаюсь понять как работать с URI.
Вот, например, у меня есть выбор файла из галереи. Оттуда получаю uri "content://media/external/images/media/19991"
Если бы это был объект, то можно было бы применить метод uri.getPath()
Но 1С возвращает строку.
Как в данном случае можно определить путь до файла, который 1С сможет понять?
51. Николай Моисеев (Azathtot) 21.11.14 11:41
"Дернуть" сервис ContentTool утилит. Передаете ему параметр Uri (строка),
получаете в Data путь.
52. Дмитрий Шерстобитов (DitriX) 21.11.14 12:24
(50) смотрите функцию выбора файлов конфигураторе этой конфигурации, там используется функция:
// Функция предназначена для получения прямого линка, на основе контента.
// Актуально для Андриод 4.4 и старше.
// Доступность: Клиент;
//
// Параметры:
//  Путь  - Строка - Путь с конткнтом
//
// Возвращаемое значение:
//   Соответствие, Неопределено   - Если ответ = Неопределено, то была ошибка.
&НаКлиенте
Функция ПолучитьUriИзContent(Путь)  Экспорт
	СтруктураСообщения = УтилитыACODEСлужебный.СформироватьСтруктуруДляПолученияUri(Путь);
	Возврат ВыполнитьИнтенты(СтруктураСообщения);
КонецФункции
...Показать Скрыть

Вот она и возвращает нормальный URI
53. Sergey Mosalov (dablack) 21.11.14 15:06
(49) Azathtot, Очень рад, что идея пригодилась. Жду с нетерпеньем заказанных у вас А401 и А420.
А проблему, что я описывал выше ( java.lang.SecurityException: Need BLUETOOTH_ADMIN permission: Neither user 10084 nor current process has android.permission.BLUETOOTH_ADMIN) не удалось пока решить в этом обновлении?
54. Дмитрий Шерстобитов (DitriX) 21.11.14 16:13
(53) обновления еще не было. Сейчас уже заканчиваю, скоро появится
55. Константин Гейнрих (CyberCerber) 25.11.14 08:32
(54) DitriX, а что ожидается в новой версии, не подскажите?
56. Дмитрий Шерстобитов (DitriX) 25.11.14 14:24
(55)
1. Работа с графиками (живыми, т.е. растягивать можно и т.д.)
2. Глобальное оповещение для 1С с сервера
3. Переделанный механизм чтения нфц и сканеров, теперь вызывается событие по факту сканирование и при этом, если после включения сканирования 1С свернуть, то после скана - окно 1с всплывает и отрабатывает событие скана
4. Та и еще там всякие плюшки.

Но это будет доступно для общественности не раньше чем через месяца два или три, сейчас люди тестируют, исправляем баги.
57. Программулькин (Программулькин) 26.11.14 05:38
Сижу на работе, читаю с большим интересом эту статью. В это время заходит работник отдела кадров. Задаёт вопрос: "Что такое интересно читаешь?"
Я отвечаю, что мол вот у 1 с появились новые возможности, что бла...блааа.. она такая вся модная, вот до мобильников добралась, может тебе WI-FI включить, сказать что за мобилка у тебя, какая ОСь стоит, и так далее, бла...блаа...(читаю некоторые выдержки из статьи, напрочь забыв, что передо мной не ITшник, а кадровик ). Она на меня смотрит своими большими круглыми глазами, хлопает несколько раз своими длинными ресницами, и выдаёт сногсшибательную фразу: "А зачем это 1с надо? Ведь у неё и так своих проблем хватает!"...под столам.
FireFox_Manager; arteast; RuzAleks; CyberCerber; sCHTASS; PolAlex2; DitriX; +7 Ответить 1
58. Дмитрий Шерстобитов (DitriX) 26.11.14 11:45
(57) у нее случаем не iPhone? А то обычно любители яблок так отвечают - если чего нет, то это не надо :)
59. Владимир Аникин (Vo-Va) 18.12.14 02:37
Можно ли как то использовать эту утилиту для организации печати на мобильный принтер?
60. Дмитрий Шерстобитов (DitriX) 18.12.14 18:10
(59) можно, но это индевидуально, под заказ.
61. Константин Гейнрих (CyberCerber) 13.01.15 09:22
Если кому нужно, вот как послать Broadcast сообщение с помощью BeanShell.

Код в 1С:

 Сервис = Новый Соответствие;
	Сервис.Вставить("Service","SendBroadcast");
	Сервис.Вставить("ActionName",ИмяДействия); // Здесь передаем имя выполняемого действия
        УтилитыACODEКлиент.ВыполнитьИнтенты(Сервис);


Создаем файл SendBroadcast.bsh, кладем в папку с плагинами, перезагружаем сервисы. В сам файл нужно вставить код:

//Внутренние пакеты модули.
import ru.acode.helper.instances.ScriptHelper;
import ru.acode.helper.ServiceDescriptor;
import ru.acode.helper.ServiceDescriptor.MethodParamType;
import ru.acode.helper.ServiceDescriptor.MethodParam;
import ru.acode.helper.Services;
import ru.acode.utils.ValueMap;
 
// Импорт из пакетов Android
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.R;
import android.content.Context;
import android.content.Intent;

ValueMap result = new ValueMap();
result.put(Services.INVOKE_RESULT, Services.E_OK);

initializer = new ScriptHelper.Initializer() {
  onInit(descriptor) {
      descriptor.setName("SendBroadcast"); //Имя сервиса. Именно по нему мы и обращаемся к этому плагину из 1С
      descriptor.params().add(new MethodParam("ActionName",MethodParamType.string,true)); // Обязательный строковый параметр
  }
};

executor = new ScriptHelper.Executor() {

  onExecute(Context context, ValueMap params) {
    actionName = params.getString("ActionName");
    Intent intent = new Intent();
    intent.setAction(actionName);
    context.sendBroadcast(intent);
    return result;
  }
};

helper = new ScriptHelper(initializer,executor);
...Показать Скрыть


Это самый простой пример, без передачи типов, доп данных. Просто мне пока больше не нужно было.
А зачем это вообще нужно? Сейчас 1С может только отправлять Интенты с передачей управления другому приложению. Броадкасты же могут запустить какие-то процессы на устройстве в фоновом режиме, не прерывая работы самой 1С. Я так сделал запись звука в фоне.
62. Дмитрий Шерстобитов (DitriX) 13.01.15 12:00
(62) в новой версии утилит - мы научили 1С ловить броэдкасты. :)
63. Константин Гейнрих (CyberCerber) 13.01.15 13:00
(62) DitriX, ловить - это тоже круто, но пока мне еще не понадобилось.

А еще такой вопрос... Не приходилось реализовывать простейшую рисовалку в мобильной 1С? Хотя бы просто на существующем рисунке тапами поставить пометки?
В HTML5 есть отличный объект Canvas, но в 1С 5-я версия не поддерживается... :-(
64. Дмитрий Шерстобитов (DitriX) 14.01.15 12:34
(63) - что значит рисовалка? Открыли фото для редактирования и рисуйте :)
Смотрите статью про интенты.
65. Никитин Д.В. (DeniNikitin) 20.01.15 16:26
Здравствуйте!

Подскажите, а можно реализовать запуск утилит при загрузке конфигурации, и остановку при выходе из конфигурации? А то в памяти висит постоянно и ресурсы есть!!!
66. Дмитрий Шерстобитов (DitriX) 20.01.15 18:40
(65) Ок, учли предложение. Реализуем в будующих версиях :)
67. Вадим Латышев (pro1c@inbox.ru) 21.01.15 13:54
надо iOS!
те кто платит на iOS сидят!

а так все нормуль. костыли конечно, но на безрыбье....
68. Дмитрий Шерстобитов (DitriX) 21.01.15 17:29
(67) Если надо, то можно и на iOS, только вот это уже не за бесплатно :)
69. AlxSch (AlxSch) 28.01.15 14:26
Спасибо автору публикации и всем из ACode за разработку и поддержку.
Может не совсем в тему, но просто эта ветка на мой взгляд одна из самых-самых по мобильной платформе.
Так вот когда стали переходить на 8.3.5 что пощупать все прелести AcodeTools, наткнулись на одной конкретной модели ТСД - при обновлении конфигурации (абсолютно любой) вылетает с ошибкой "Файл не является файлом базы данных data/data/com.e1c.mobile/files/gggggggg-gggg-gggg-ggggggggggggg/1cv8.1cd". Снимал копии через adb pull до и после - реально размер всех файлов в папке gggggggg-gggg-gggg-ggggggggggggg после обновления = 0. Убивает базу наповал.На 8.3.4 ничего подобного не было.
Как оказалось, на аппарате не стояла карточка, все было в памяти аппарата. Вылечилось установкой SD карты и переносом мобильной платформы на нее.
70. Дмитрий Шерстобитов (DitriX) 28.01.15 18:14
(69) отлично. Рад, что смог помочь.
71. Алексей Шачнев (efin) 04.02.15 16:36
DitriX, от меня тоже спасибо за такую замечательную разработку! Правда, от нее мне нужны были только вибро, DeviceID и Push.

Push победить не удалось. По инструкции с сайта GOOGLE CLOUD MESSAGING (GCM), и по примерам в вашей конфигурации, реализовали и настроили push-server, запросы к нему отправляются, но в ответ приходит что Error=InvalidRegistration (использовал наугад).

Я понимаю, что мобильное приложение должно тоже зарегистрироваться на GCM при установке (или первом запуске) и я как-то должен узнать id, которое имеет конкретный экземпляр установленного приложение и использовать его при отправке. Но я не знаю как.

Можете подсказать?
72. Дмитрий Шерстобитов (DitriX) 05.02.15 11:31
(71) стоп, вы уточните что вы вообще делаете :)
Вы используете локальные пуш сообщения через утилиты, или же используете специальный софт для пуш сообщений?
Я не понимаю при чем тут GCM? Я про него не рассказывал :) А одна причина - почему, это потому что не известно будет - дошло сообщение до адресата или нет.
Вам в таком случае не сюда, а к примеру - вот сюда http://habrahabr.ru/post/213027/.

Будет намного проще, если вы опишите задачу и ее критерии, а я вам может смогу что-то посоветовать
73. Руслан (imoby) 06.02.15 15:41
Здравствуйте.

Подскажите, пожалуйста. В настройках ACODE есть функция принимать вызовы из локальной сети и она работает. Будет ли она работать, если устройство будет иметь статический внешний IP адрес? При обращении по внешнему ip адресу и порту 8090 выходит надпись "<Array xmlns="http://v8.1c.ru/8.1/data/core" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><Value xsi:type="Map"><pair><Key xsi:type="xs:string">Result</Key><Value xsi:type="xs:decimal">2</Value></pair></Value></Array>", то есть внешний IP виден в сети, но при попытке передачи события на сервер выходит "Ошибка выполнения (утилиты) 2"
74. ZLENKO.PRO (ZLENKO) 06.02.15 15:47
(23) WKBAPKA, "используйте Eclipse или Android Studio и изучайте язык программирования Java :)"

IntelliJ IDEA вместо Eclipse или Android Studio
75. Дмитрий Шерстобитов (DitriX) 06.02.15 20:10
(73) Добрый.
Будет. //E_INVALID_PARAMS = 2;
Это ваша ошибка, как вариант - вы могли не указать ID устройства.
Проверьте через конфу, которая есть тут. Для этого пропишите на первой вкладке тестов утилит IP и ID устройства, ID можно получить в этой же конфе на вкладке Информация - Инфо, это длинное число (обычно отрицательное, но писать надо его с минусом, если оно есть)
76. Алексей Шачнев (efin) 06.02.15 20:12
(72) DitriX, когда я увидел, что acode tools позволяют добавить функционал push, я, естественно, понял, что речь идет о возможности принимать и обрабатывать стандартные push-сообщения от GCM. Мобплатформа этого не умеет, и я надеялся, что ваши утилиты могут выступать приемником push'ей от GCM и ретранслировать их в мобильную платформу.

Отправка сообщений в GCM у меня реализована из десктопной 1С обычными POST-запросами. В терминологии Гугла эта часть называется у них сервером.

Задача простая - из основной 1С оповещать сотрудников о входящей информации, вне зависимости от того где и как они подключены и запущена или нет мобильная платформа.
77. Дмитрий Шерстобитов (DitriX) 07.02.15 01:09
(76) тогда у вас два варианта - ждать 8.3.6 :) И то, проблема в GCM - нет увереннсоти что сообщение дойдет.
Или смотрите 8 урок про другой сервис, который гарантирует доставку и сообщает - успешна она или нет. И тут не надо никакой платформы 1С, но оно платное, но есть и бесплатное, вообщем смотрите видео, там все есть.
78. Руслан (imoby) 07.02.15 10:20
(75) DitriX, я написал что в локальной сети работает, ID и IP устройства указаны. Но стоит мне поменять IP на внешний, пишется такая ошибка. Хотя внешний IP виден в сети и 8090 порт прослушивается. Просто хотел узнать, может у вас какое-то ограничение стоит, чтобы только в одной локальной сети принимать данные.
79. Дмитрий Шерстобитов (DitriX) 07.02.15 10:31
(78)ну а вы этот порт пробрасывали через роутер на телефон?
у меня все работает и по внешке.
Причины не работы чаще всего две:
1. Тупые роутеры, у которых если делать коннект по вненему IP, который равен IP роутеру, они его форсят на себя и не пусают дальше, если вы находитесь в подсети роутера.
2. Люди просто забывают пробросить порт с роутера на иелефон, или же пробросили, но забыли установить фиксированный IP для телефона.
80. Руслан (imoby) 07.02.15 23:36
(79) DitriX, планшет с симкой со статическим IP-адресом без роутеров, если ввести его адрес и порт через браузер, то он виден, но сама утилита не может передать событие, пишет ошибка выполнения утилиты (2). Думал, может какое-то ограничение на подключение извне.
81. Дмитрий Шерстобитов (DitriX) 08.02.15 01:06
(80) на симке - не проверял, может быть, всетаки это другой тип подключения.
Но если по вайфаю - то все ок. Мы подумаем над тем, можно ли эту проблему решить, если она есть, или не можем :)
82. ilyar mansurov (ilyar) 08.02.15 17:58
Acode - суперская вещь, спасибо вам за это.
Я так понял что работа с FTP заключается в получении и отправки файлов. Это уже хорошо но если вот добавить возможность удалять/переименовывать/перемещать файлы ты будет супер. Если не сложно реализуйте пожалуйста в следующей версии.
Вопрос: Можно ли средствами BeanShell докрутить возможность удалять/переименовывать/перемещать файлы по FTP?
83. Дмитрий Шерстобитов (DitriX) 08.02.15 19:08
(82) а чего бы и нет?
Создавайте свой сервис и описание его, и работайте с ним :)
Мы эо делаьть не будем, во всяком случае до выхода 8.3.6 - точно, ибо там это все может появится.
84. Сергей Апухтин (Zasranec0) 24.02.15 15:07
Не плохая разработка. Как узнать при открытии формы ориентацию экрана?
85. Дмитрий Шерстобитов (DitriX) 24.02.15 16:14
(84) хороший вопрос :)
Для этого надо где то в константе его хранить. Первую ориентацю можно вычислить пр помощи особенностей устройств с программными кнопками управления (домой, назад, меню) ну а потом внести текущее положение в константу, а дельше, при первом повороте - просто писать в константу.
86. Сергей Апухтин (Zasranec0) 25.02.15 12:03
(85) DitriX, А через утилиту, можно же как то состояние это у андройда узнать? Не вижу сложностей реализации этого. Или это надо самому допиливать ?
К примеру
 УтилитыACODEКлиент.ПолучитьДанныеОбУстройстве("state.wifi");


Как то можно там прописать ориентацию экрана что бы возвращало? Могу ли я допилить такую функцию? Если да, то был бы очень благодарен, если бы мне чуть-чуть подсказали где этот код редактируется.

Вот у меня запускается 1с, в этот момент открывается форма, в ней уже не понятно как расположить элементы. При первом повороте конечно же можно записать это делать в константу, но интересует именно при запуске командой узнать.
87. Дмитрий Шерстобитов (DitriX) 25.02.15 13:45
(86) на днях ждем выхода 8.3.6, там появились новые функции работы с экраном. Пока она не выйдет - делать не будем, так как если оно уже будет сделанно там, то смысл его пилить тут.
А сделать вы это можете - для этого есть скрипты, пишите свой скрипт и получайте чаго хотите. Мы же специально систему плагинов сделали
88. Николай Моисеев (Azathtot) 04.03.15 13:17
(82) ilyar,
Вопрос: Можно ли средствами BeanShell докрутить возможность удалять/переименовывать/перемещать файлы по FTP?

да, можно. beanShell предоставляет вам возможность доступа ко ВСЕМ классам утилиты и соответственно android API.
Для работы с FTP в утилитах используется apache.commons.net, все классы которой вам доступны.
89. Тимур Мансорунов (solarisman) 06.03.15 07:31
Добрый день!

Разрабатываем приложение для ТСД на андроид (на мобильной платформе 1С), тестируем. Возникает одно довольно большое неудобство: при открытии формы для сканирования ШК приходится "тапать" в поле ввода, что крайне неудобно в режиме ТСД.

Можно ли при помощи данных утилит вызывать, допустим, событие нажатия кнопки, чтобы курсор вставал в поле ввода?
90. Дмитрий Шерстобитов (DitriX) 06.03.15 13:17
(89) все зависит от ТСД :) Что у вас за ТСД?
91. Тимур Мансорунов (solarisman) 06.03.15 18:54
Не совсем понимаю, какая разница. Даже пусть это будет смартфон с bluetooth-сканером (в режиме клавиатуры).

Суть чтобы наборщик не выполнял лишнее действие. Представляете, надо обработать 1000 строк в день, это 1000 кликов по экрану. Пусть даже 2 секунды на действие, полчаса в день тупо на клики.

При открытии формы в 1С даже при принудительной установке текущего элемента
ТекущийЭлемент = Элементы.Штрихкод

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

Так же не помогает свойство "АктивироватьПриОткрытии", а при вызове метода "ВвестиТекст" в диалоговом окне курсор не устанавливается в поле

Может быть, в манифесте поправить/добавть свойства?
Я слишком поверхностно знаю Android, но при разработке простейшего приложения в Android Studio курсор устанавливается уже при открытии окна и кликать лишний раз не надо.
92. Николай Моисеев (Azathtot) 06.03.15 19:08
(91) solarisman,
Вообще-то при работе утилит с БТ сканнером происходит 2 вещи, при сканировании
- расылка "СМС" с номера 04 c сосканированным кодом
- рассылка интента c action "ru.acode.control" и следующими параметрам Action - 2 (SCAN), Status - 0 (OK), Scanner - 4 (БТ сканнер), Data - баркод.
Вы можете принимать эти сообщения не используя никаких активных полей ввода
93. Тимур Мансорунов (solarisman) 06.03.15 19:14
Если хорошо покопаться в платформе, то можно найти Layout с аким поисанием:

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout 
	xmlns:android="http://schemas.android.com/apk/res/android"
	android:id="@+id/formBaseLayout"
	android:layout_width="fill_parent"
 	android:layout_height="fill_parent"
  	android:padding="0dip">
  	<LinearLayout 
		android:id="@+id/formButtonBar"
    
		android:layout_width="match_parent"
    
		android:layout_height="wrap_content"
    
		android:layout_alignParentBottom="true"
    
		android:orientation="vertical">


    
  		<LinearLayout 
      
			android:layout_width="match_parent"
      
			android:layout_height="wrap_content"
      
			android:orientation="horizontal"
      
			android:background="@android:drawable/bottom_bar"
      
			android:paddingTop="5dip"
      
			android:paddingLeft="3dip"
      
			android:paddingRight="2dip"
      	
			android:paddingBottom="0dip">


      
			<LinearLayout android:id="@+id/formLeftBarSpacer"
        
				android:layout_width="0dip"
        
				android:layout_height="wrap_content"
        
				android:layout_weight="0.25"
        
				android:layout_gravity="left"
        
				android:orientation="horizontal"
        
				android:visibility="gone"
			/>

 
      
			<Button
        
				android:id="@+id/formNegativeButton"
        
				android:layout_width="wrap_content"
        
				android:layout_height="wrap_content"
        	
				android:layout_weight="0.5"
        
				android:layout_gravity="fill_horizontal"
        	
				android:textSize="18sp"
        
				android:visibility="gone" 
			/>

	
			<Button
			        android:id="@+id/formPositiveButton"
			        android:layout_width="wrap_content"
			        android:layout_height="wrap_content"
			        android:layout_weight="0.5"
			        android:layout_gravity="fill_horizontal"
			        android:textSize="18sp"
			        android:visibility="gone"
			/> 
     
      
			<LinearLayout 
				android:id="@+id/formRightBarSpacer"
        
				android:layout_width="0dip"
        
				android:layout_height="wrap_content"
        
				android:layout_weight="0.25"
       
				android:layout_gravity="right"
        
				android:orientation="horizontal"
        
				android:visibility="gone" 
			/>

  

		</LinearLayout>
  
	</LinearLayout>


</RelativeLayout>
...Показать Скрыть


Я полагаю, что это и есть оконная форма, в которую динамически (в зависимости от конфигурации) добавляются элементы

Вот только как заставить платформу курсор туда поставить?
94. Тимур Мансорунов (solarisman) 06.03.15 19:19
Это понятно с БТ сканнером, статью я прочитал и с конифгурацией ознакомился. Но хотелось бы, чтобы приложение "взлетело" на любом устройстве с режимом ввода с клавиатуры. А вообще заказали вот такой аппарат для тестирования, ждем посылку. Он работает в режиме ввода с клавиатуры
95. Тимур Мансорунов (solarisman) 06.03.15 19:23
Тут ведь есть еще один момент - подтверждение пользователем.

То есть, отсканировали - пользователь посмотрел - нажал "ОК" или скорректировал и потом нажал "ОК".
Например, если количество считывается из ШК. Чтобы скорректировать, ему опять придется сделать "тык" по экрану в форме и уже потом корректировать количество.
96. Тимур Мансорунов (solarisman) 06.03.15 19:30
Есть еще вот такая штука, похожая на описание поля ввода, файл называется "uiedit.xml"

<?xml version="1.0" encoding="utf-8"?>

<com.e1c.mobile.UIEdit
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:scrollbars="vertical"
  android:gravity="left|top"
  android:inputType="textLongMessage|text|textNoSuggestions|textVisiblePassword"
  android:imeOptions="flagNoExtractUi|flagNoFullscreen"
  android:singleLine="true"
  >
</com.e1c.mobile.UIEdit>
...Показать Скрыть
97. Дмитрий Шерстобитов (DitriX) 06.03.15 21:33
(96) Давайте еще раз - сканирование в активное поле - это полный бред, который не подходит для решения реальных задач, пример - человек клацнул на ввод даты, или на таблицу, что вы будете дальше делать? Вешать везде обработчики событий и переводить активность? Ну реально :) Честно, мы так пробовали и если хотите сами попробовать - установите 8.3.4.17 и потестируйте, сами поймете бессмысленость этой затеи.
Это раз, а два - вы смотрели 8.3.6 и то, как там все сделано? Там вообще активность поля совсем не в тему. Поэтому - мы на эту тему не переживаем.
А три - без исходников 1С, я сомневаюсь что у вас что-то получится, а исходники - никто не даст. Можете написать еще одну заявку в 1С, будет уже 100500 заявка на эту тему :)

Но с другой стороны - у вас нет другого выхода, кроме как повторять все то, что ACODE разрабатывали на протяжении года (виртуальная клавиатура вам сможет помочь и т.д.)
А то что вы тут приводите - это xml описания стационарных форм, к примеру - форма создания и подключения базы, изменив тут что то, вы получите активность в той форме, а что дальше?
98. Тимур Мансорунов (solarisman) 06.03.15 23:37
Не понял:
сканирование в активное поле - это полный бред, который не подходит для решения реальных задач

Вы приложение для "1C: WMS4" видели для Win CE? что значит бред? Вообще как бы не вижу смысл тут полемику разводить и разъяснять, что мы о разных вещах говорим, бизнес-задачи у всех разные.

Суть задачи не меняется - необходимо, чтобы при открытии формы 1С открывался диалог редактирования первого поля ввода.
Вопрос: можно ли это реализовать при помощи ACODE Tools?

Понятно, что .apk декомпилировать и обратно собрать не позволит время. Вопрос был постольку, поскольку я считаю Вас специалистами и предполагаю, что Вы попробовали разные варианты работы и т.д.

Пробовал добавить "requestfocus" в описание поля ввода, не помогает. Видимо, что-то случилось :(
99. Дмитрий Шерстобитов (DitriX) 06.03.15 23:41
(98) то что было раньше - это не значит, что так правильно, просто тогда не было возможности сделать по другому. Именно поэтому, я, как "специалист", а если точнее - человек который запускал такую модель на реальном предприятии - говорю, что это НЕ работает. Увы.
Вы сами можете в этом удостоверится. Установите 8.3.4.17 и попробуйте там сделать то, что вы хотите, вы сразу увидите - что работать оно не будет.

Те задачи, которые описали вы - решаются по другому, как именно - я рассказал выше.

Активность поля может починить ТОЛЬКО 1С :) И все.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа