Внешняя компонента для мобильного приложения
Внешняя компонента для дополнения мобильной платформы некоторыми функциями.
- Описание
- Подробнее
Описание
ВК имеет следующие функции:
1. Перехват широковещательных сообщений ОС андроид по заданному фильтру и ключу данных (extras).
2. Получать ИД устройства (с 10 версии ОС это не аппаратный ИД — https://developer.android.com/training/articles/user-data-ids).
3. Получать архитектуру процессора устройства (ABI — в терминологии ОС Android).
4. Сжимать (и разжимать обратно:)) двоичные данные (Deflate).
5. Сжимать файлы (Deflate).
6. Распознавать штрихкод с картинки (zxing).
7. Изменять разрешение и качество картинки.
8. Работать с файловой системой средствами ядра linux.
8.1. Возвращать массив объектов в заданной директории
8.2. Проверять, директория-ли объект файловой системы
8.3. Удалять объект файловой системы
8.4. Создавать файл
8.5. Создавать директорию
8.6. Писать двоичные данные в файл
8.7. Читать двоичные данные из файла
8.8. Переименовывать объект файловой системы
8.9. Проверять на существование объекта файловой системы
9. HTTP — сервер. (Прием входящих POST и PUT запросов и обработка запросов на стороне 1с (через внешнее событие). Ответ на запрос формируется в коде 1с).
10. Отображать производителя и модель устройства.
Функции из п.п. 1-6, 7-8 используются в бою длительное время, т.е. протестированы основательно. Другие — просто протестированы.
Тестирование производилось на платформах 8.3.19.51 и 8.3.18.60.
Работа компоненты на версиях OS и архитектурах:
ARM | 5.1 |
x86 | 5.1 |
ARM64 | 8 |
x86_64 | 8 |
Описание функций.
//--------Установка компоненты--------//
УстановитьВнешнююКомпоненту("ОбщийМакет.TestPro");
ПодключитьВнешнююКомпоненту("ОбщийМакет.TestPro", "Component", ТипВнешнейКомпоненты.Native);
ВК = Новый("AddIn.Component.Hermes");
//---------------------------------------------------------------------------//
//ЗапуститьПерехватБроадкастов//
//Может перехватывать любой броадкаст с известным фильтром и ключом данных //
//---------------------------------------------------------------------------//
Процедура Запустить()
м = новый массив;
М.Добавить(новый структура("filter, extra",
"com.xcheng.scanner.action.BARCODE_DECODING_BROADCAST",
"EXTRA_BARCODE_DECODING_DATA"));
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, М);
Джейсон = ЗаписьJSON.Закрыть();
Рез = ВК.ЗапуститьПерехватБроадкастов(Джейсон);
Если Рез = "ok_en" тогда
Предупреждение("Перехват установлен")
иначе
Предупреждение(Рез);
КонецЕсли;
КонецПроцедуры
Процедура ОбработкаВнешнегоСобытия(Источник, Событие, Данные)
Если стрСравнить(СокрЛП(Источник),"Hermes") = 0 тогда
Если стрСравнить(СокрЛП(Событие),"BroadcastCatched") = 0 тогда
Попытка
локДанные = РазобратьJSON(Данные);
action = Неопределено;
_key = Неопределено;
Data = Неопределено;
локДанные.Свойство("action",action);
локДанные.Свойство("key",_key);
локДанные.Свойство("Data",Data);
Если стрСравнить(сокрлп(action),"com.xcheng.scanner.action.BARCODE_DECODING_BROADCAST") = 0 тогда
Если стрСравнить(сокрлп(_key),"EXTRA_BARCODE_DECODING_DATA") = 0 тогда
Оповестить(Событие, новый структура("Данные, Тип", СокрЛП(Data), "hell_sighn"), Источник);
КонецЕсли;
КонецЕсли;
исключение
ОШ = ОписаниеОшибки();
Предупреждение(ОШ);
КонецПопытки;
иначеЕсли СтрСравнить(СокрЛП(Событие), "http_request") = 0 тогда
J = РазобратьJSON(СокрЛП(Данные));
J.data = "qwerqwerqwerqwer";
ВК.HTTPСервер_Ответить(СформироватьJSON_(J));
КонецЕсли;
Возврат;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Данные, Источник)
Если стрСравнить(Источник,"TestPro")=0 тогда
Если стрСравнить(ИмяСобытия,"BroadcastCatched")=0 Тогда
Если СтрСравнить(Данные.тип,"hell_sighn")=0 тогда
штрихкод = Данные.Данные;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
//---------------------------------------------------------------------------//
//---------------------------------------------------------------------------//
//ОстановитьПерехватБроадкастов//
//---------------------------------------------------------------------------//
Рез = ВК.ОстановитьПерехватБроадкастов();
Если Рез = "ok_en" тогда
Предупреждение("Перехват снят")
иначе
Предупреждение(Рез);
КонецЕсли;
//---------------------------------------------------------------------------//
//---------------------------------------------------------------------------//
//=============================ИДУстройства==================================//
//Это не настоящий DeviceID, а некий синтетический идентификатор, выдаваемый //
//ОС вызывающему приложению при вызове метода //
//Settings.Secure.getString(m_Activity.getContentResolver(), //
//Settings.Secure.ANDROID_ID), //
//преобразованный к формату GUID //
//(Начиная с 10 Андроида доступ "обычных" приложений к аппаратным //
//идентификаторам устройства ограничен.) //
//---------------------------------------------------------------------------//
ИД = ВК.ИДУстройства();
//---------------------------------------------------------------------------//
//---------------------------------------------------------------------------//
//АндроидИД//
//То-же самое, что и ИДУстройства, только передаваемый в 1с "как есть", //
//т.е. без приведения к виду GUID //
//---------------------------------------------------------------------------//
ИД = ВК.АндроидИД();
//---------------------------------------------------------------------------//
//---------------------------------------------------------------------------//
//Архитектура//
//Возвращает архитектуру процессора устройства (ABI - в терминологии Андроид)//
//---------------------------------------------------------------------------//
Арх = ВК.Архитектура();
//---------------------------------------------------------------------------//
//---------------------------------------------------------------------------//
//HTTPСервер_Запустить//
//---------------------------------------------------------------------------//
//Запускает локальный http-сервер на базе Nano, который принимает входящие //
//POST/PUT-запросы. Каждый запрос обрабатывается в своем потоке и ему //
//(запросу)присваевается ThreadID. После этого поток синхронно отправляет //
//данные запроса в 1с - как внешнее событие. 1с должна в течение 60 секунд //
//обработать запрос и вернуть ответ в компоненту. //
//Если ответ 1с'ом не возвращен, то клиент получит 500 ответ с описанием //
//ошибки = "SERVER INTERNAL ERROR: превышено ожидаемое время обработки //
//запроса на стороне 1с." //
//Есть нюанс работы: если сервер долго не принимает запросов, а приложение, в//
//контексте которого он запущен, свернуто, то ОС через некоторое время //
//останавливает поток сервера и его приходится перезапускать //
//---------------------------------------------------------------------------//
Порт = 8086;
Ответ = ВК.HTTPСервер_Запустить(Порт);
Если СтрСравнить(сокрЛП(Ответ),"ok_en") = 0 тогда
Предупреждение("HTTP сервер запущен на порту: " + Строка(Порт));
иначе
Предупреждение("Ошибка: " + ответ);
КонецЕсли;
//---------------------------------------------------------------------------//
//---------------------------------------------------------------------------//
//HTTPСервер_Остановить//
//---------------------------------------------------------------------------//
//Останавливает локальный http-сервер //
//---------------------------------------------------------------------------//
Ответ = ВК.HTTPСервер_Остановить();
Если СтрСравнить(сокрЛП(Ответ),"ok_en") <> 0 тогда
Предупреждение(Ответ);
иначе
Предупреждение("HTTP сервер остановлен");
КонецЕсли;
//---------------------------------------------------------------------------//
//---------------------------------------------------------------------------//
//HTTPСервер_Ответить//
//---------------------------------------------------------------------------//
//Выполняется в контексте обработчика внешнего события глобального модуля. //
//Возвращает в http-сервер ответ, котрый будет переправлен клиенту. //
//---------------------------------------------------------------------------//
Процедура ОбработкаВнешнегоСобытия(Источник, Событие, Данные)
Если стрСравнить(СокрЛП(Источник),"Hermes") = 0 тогда
Если стрСравнить(СокрЛП(Событие),"BroadcastCatched") = 0 тогда
Попытка
локДанные = РазобратьJSON(Данные);
action = Неопределено;
_key = Неопределено;
Data = Неопределено;
локДанные.Свойство("action",action);
локДанные.Свойство("key",_key);
локДанные.Свойство("Data",Data);
Если стрСравнить(сокрлп(action),"com.xcheng.scanner.action.BARCODE_DECODING_BROADCAST") = 0 тогда
Если стрСравнить(сокрлп(_key),"EXTRA_BARCODE_DECODING_DATA") = 0 тогда
Оповестить(Событие, новый структура("Данные, Тип", СокрЛП(Data), "hell_sighn"), Источник);
КонецЕсли;
КонецЕсли;
исключение
ОШ = ОписаниеОшибки();
Предупреждение(ОШ);
КонецПопытки;
иначеЕсли СтрСравнить(СокрЛП(Событие), "http_request") = 0 тогда
J = РазобратьJSON(СокрЛП(Данные));
J.data = "qwerqwerqwerqwer";
ВК.HTTPСервер_Ответить(СформироватьJSON_(J));
КонецЕсли;
Возврат;
КонецЕсли;
КонецПроцедуры
//---------------------------------------------------------------------------//
//---------------------------------------------------------------------------//
//ZLIB_Архивировать//
//Архивирует двоичные данные алгоритмом Deflate
//---------------------------------------------------------------------------//
масМарки = новый массив;
джМарки = JSON.СформироватьJSON(масМарки);
ДД = ПолучитьДвоичныеДанныеИзСтроки(джМарки);
ДДАрх = ВК.ZLIB_Архивировать(ДД);
Если ТипЗнч(ДДАрх) = Тип("ДвоичныеДанные") тогда
ДДРазарх = ВК.ZLIB_Разархивировать(ДДАрх, ДД.Размер());
КонецЕсли;
//---------------------------------------------------------------------------//
//---------------------------------------------------------------------------//
//ZLIB_Разархивировать//
//Разархивирует двоичные данные, заархивированные алгоритмом Deflate
//---------------------------------------------------------------------------//
масМарки = новый массив;
джМарки = JSON.СформироватьJSON(масМарки);
ДД = ПолучитьДвоичныеДанныеИзСтроки(джМарки);
ДДАрх = ВК.ZLIB_Архивировать(ДД);
Если ТипЗнч(ДДАрх) = Тип("ДвоичныеДанные") тогда
ДДРазарх = ВК.ZLIB_Разархивировать(ДДАрх, ДД.Размер());
КонецЕсли;
//---------------------------------------------------------------------------//
//---------------------------------------------------------------------------//
//ZLIB_АрхивироватьФайл//
//Архивирует файл алгоритмом Deflate
//---------------------------------------------------------------------------//
ДДист = ПолучитьДвоичныеДанныеИзСтроки("Какие-нибудь данные");
ИВФИст = ПолучитьИмяВременногоФайла("dat");
ИВФНазн = ПолучитьИмяВременногоФайла("dat");
ДДист.Записать(ИВФИст);
Р = ВК.ZLIB_АрхивироватьФайл(ИВФИст, ИВФНазн);
ДДАрх = новый ДвоичныеДанные(ИВФНазн);
УдалитьФайлы(ИВФИст);
Р1 = ВК.ZLIB_РазархивироватьФайл(ИВФНазн, ИВФИст);
ДД1 = новый ДвоичныеДанные(ИВФИст);
УдалитьФайлы(ИВФИст);
УдалитьФайлы(ИВФНазн);
//---------------------------------------------------------------------------//
//---------------------------------------------------------------------------//
//ZLIB_РазархивироватьФайл//
//Разархивирует файл, сжатый алгоритмом Deflate
//---------------------------------------------------------------------------//
ДДист = ПолучитьДвоичныеДанныеИзСтроки("Какие-нибудь данные");
ИВФИст = ПолучитьИмяВременногоФайла("dat");
ИВФНазн = ПолучитьИмяВременногоФайла("dat");
ДДист.Записать(ИВФИст);
Р = ВК.ZLIB_АрхивироватьФайл(ИВФИст, ИВФНазн);
ДДАрх = новый ДвоичныеДанные(ИВФНазн);
УдалитьФайлы(ИВФИст);
Р1 = ВК.ZLIB_РазархивироватьФайл(ИВФНазн, ИВФИст);
ДД1 = новый ДвоичныеДанные(ИВФИст);
УдалитьФайлы(ИВФИст);
УдалитьФайлы(ИВФНазн);
//---------------------------------------------------------------------------//
//---------------------------------------------------------------------------//
//PHOTO_ИзменитьКартинку//
//Изменяет разрешение и качество картинки. Под качеством подразумевается //
//величина, обратная степени сжатия картинки алгоритмом JPEG //
//---------------------------------------------------------------------------//
ФайлКартинки = КаталогДокументов()+"MobileFoto.jpg";
ФайлКартинки = СтрЗаменить(ФайлКартинки,"\","/");
ФайлКартинки = "file://" + ФайлКартинки;
НовВз = Новый ЗапускПриложенияМобильногоУстройства(
"android.media.action.IMAGE_CAPTURE");
НовВз.ДополнительныеДанные.Добавить("output",ФайлКартинки,"Uri");
Если НовВз.Запустить(Истина) <> 0 Тогда
ИВФВых = ПолучитьИмяВременногоФайла("jpg");
Р = ВК.PHOTO_ИзменитьКартинку(ФайлКартинки,
ИВФВых,
ЭтаФорма.РазрешениеХ,
ЭтаФорма.РазрешениеУ,
ЭтаФорма.Какчество);
ДД = новый ДвоичныеДанные(ИВФВых);
ОтобразитьКартинку(ДД);
КонецЕсли;
//---------------------------------------------------------------------------//
//---------------------------------------------------------------------------//
//Версия//
//Возвращает версию компоненты
//---------------------------------------------------------------------------//
Сообщить(ВК.Версия());
//---------------------------------------------------------------------------//
//-----------------------------------------------------------------------------//
//ZXING_РаспознатьШтрихкод//
//Пытается прочитать любой 1- и 2-мерный штрихкод.
//Функция имеет 2 перегрузки: //
//1. в качестве параметра принимается строка - имя файла картинки с штрихкодом //
//2. в качестве параметра принимаются двоичные данные картинки //
//-----------------------------------------------------------------------------//
&НаКлиенте
Процедура РаспознатьQRCodeСКартинки(Команда)
//1.Вариант с чтением картинки из файла
Картинка = ЗаписатьКартинкуВФайл(КаталогДокументов());
стр = ВК.ZXING_РаспознатьШтрихкод(Картинка);
стк = JSON.РазобратьJSON(стр);
Если стк.status тогда
УдалитьФайлы(Картинка);
Предупреждение(стк.data);
иначе
Предупреждение(стк.description);
КонецЕсли;
//2.Вариант с чтением картинки из ДД
стр = ВК.ZXING_РаспознатьШтрихкод(ПолучитьДДКартинки());
стк = JSON.РазобратьJSON(стр);
Если стк.status тогда
Предупреждение(стк.data);
иначе
Предупреждение(стк.description);
КонецЕсли;
Данные = СредстваМультимедиа.СделатьФотоснимок(ТипКамерыУстройства.Задняя,
новый РазрешениеКамерыУстройства(800, 600),
100,
,
ТипПодсветкиКамеры.Выключена);
Если Данные <> неопределено тогда
стр = ВК.ZXING_РаспознатьШтрихкод(Данные.ПолучитьДвоичныеДанные());
стк = JSON.РазобратьJSON(стр);
Если стк.status тогда
Предупреждение(стк.data);
иначе
Предупреждение(стк.description);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция ЗаписатьКартинкуВФайл(КаталогДокументов)
ИВФ = КаталогДокументов + "MobileFoto.png";
ПолучитьДДКартинки().Записать(ИВФ);
ИВФ = СтрЗаменить(ИВФ,"\","/");
ИВФ = "file://" + ИВФ;
Возврат ИВФ;
КонецФункции
//---------------------------------------------------------------------------//
//---------------------------------------------------------------------------//
//ФС_ПрочитатьКаталог//
//Возвращает массив объектов каталога файловой системы - если у приложения //
//в этот каталог есть соответствующий доступ. //
//---------------------------------------------------------------------------//
&НаКлиенте
Функция УдалитьФсеФСОРекурсивно(вхКаталог, ВК)
Если РазобратьJSON(ВК.ФС_ОбъектФССуществует(вхКаталог)).Status тогда
сткРез = РазобратьJSON(ВК.ФС_ПрочитатьКаталог(вхКаталог));
Если сткРез.Status тогда
сткРез0 = РазобратьJSON(сткРез.Data);
Для каждого эстк из сткРез0 Цикл
Если эстк.Значение = ".." или эстк.Значение = "." тогда
продолжить
КонецЕсли;
П = вхКаталог + ?(прав(вхКаталог,1)="/","","/") +
эстк.Значение;
сткЭтоДиректорияСтатус =
РазобратьJSON(ВК.ФС_ЭтоДиректория(П));
Если сткЭтоДиректорияСтатус.Status тогда
Если РазобратьJSON(сткЭтоДиректорияСтатус.Data).
IsDirectory тогда
УдалитьФсеФСОРекурсивно(П, ВК);
КонецЕсли;
КонецЕсли;
ВК.ФС_УдалитьФайлИлиКаталог(П);
КонецЦикла;
КонецЕсли;
КонецЕсли;
ВК.ФС_УдалитьФайлИлиКаталог(?(прав(вхКаталог,1)="/",
Лев(вхКаталог,стрДлина(вхКаталог)-1), вхКаталог));
КонецФункции
//---------------------------------------------------------------------------//
//---------------------------------------------------------------------------//
//ФС_ЭтоДиректория//
//Проверяет: объект файловой системы - директория или файл.
//---------------------------------------------------------------------------//
сткЭтоДиректорияСтатус = РазобратьJSON(ВК.ФС_ЭтоДиректория(П));
Если сткЭтоДиректорияСтатус.Status тогда
Если РазобратьJSON(сткЭтоДиректорияСтатус.Data).IsDirectory тогда
УдалитьФсеФСОРекурсивно(П, ВК);
КонецЕсли;
КонецЕсли;
//---------------------------------------------------------------------------//
//---------------------------------------------------------------------------//
//ФС_УдалитьФайлИлиКаталог//
//Удаляет объект файловой системы.
//---------------------------------------------------------------------------//
Ответ = ВК.ФС_УдалитьФайлИлиКаталог(
"/data/data/com.e1c.mobile/files/1C/1cem/test/test.txt");
стк = РазобратьJSON(Ответ);
//---------------------------------------------------------------------------//
//---------------------------------------------------------------------------//
//ФС_СоздатьФайл//
//Создает файл
//---------------------------------------------------------------------------//
Ответ = ВК.ФС_СоздатьФайл(
"/data/data/com.e1c.mobile/files/1C/1cem/test/test.txt");
стк = РазобратьJSON(Ответ);
//---------------------------------------------------------------------------//
//---------------------------------------------------------------------------//
//ФС_СоздатьКаталог//
//Создает каталог
//---------------------------------------------------------------------------//
Ответ = ВК.ФС_СоздатьКаталог(
"/data/data/com.e1c.mobile/files/1C/1cem/test", 511);
стк = РазобратьJSON(Ответ);
//---------------------------------------------------------------------------//
//---------------------------------------------------------------------------//
//ФС_ПереименоватьФайлИлиКаталог//
//переименовывает файл или каталог
//---------------------------------------------------------------------------//
Ответ = ВК.ФС_ПереименоватьФайлИлиКаталог(
"/data/data/com.e1c.mobile/files/1C/1cem/test/test.txt",
"/data/data/com.e1c.mobile/files/1C/1cem/test/test1.txt");
стк = РазобратьJSON(Ответ);
Если стк.Status тогда
//---------------------------------------------------------------------------//
//---------------------------------------------------------------------------//
//ФС_ЗаписатьДанныеВФайл//
//Пишет двоичные данные в файл //
//---------------------------------------------------------------------------//
Ответ = ВК.ФС_ЗаписатьДанныеВФайл(
"/data/data/com.e1c.mobile/files/1C/1cem/test/test.txt",
ПолучитьДвоичныеДанныеИзСтроки("СтрокаДляДД"));
стк = РазобратьJSON(Ответ);
Если стк.Status тогда
Ответ = ВК.ФС_ПрочитатьДанныеИзФайла(
"/data/data/com.e1c.mobile/files/1C/1cem/test/test.txt");
Если ТипЗнч(Ответ) = тип("ДвоичныеДанные") тогда
стр = ПолучитьСтрокуИзДвоичныхДанных(Ответ);
КонецЕсли;
КонецЕсли;
//---------------------------------------------------------------------------//
//---------------------------------------------------------------------------//
//ФС_ПрочитатьДанныеИзФайл//
//---------------------------------------------------------------------------//
Ответ = ВК.ФС_ЗаписатьДанныеВФайл(
"/data/data/com.e1c.mobile/files/1C/1cem/test/test.txt",
ПолучитьДвоичныеДанныеИзСтроки("СтрокаДляДД"));
стк = РазобратьJSON(Ответ);
Если стк.Status тогда
Ответ = ВК.ФС_ПрочитатьДанныеИзФайла(
"/data/data/com.e1c.mobile/files/1C/1cem/test/test.txt");
Если ТипЗнч(Ответ) = тип("ДвоичныеДанные") тогда
стр = ПолучитьСтрокуИзДвоичныхДанных(Ответ);
КонецЕсли;
КонецЕсли;
//---------------------------------------------------------------------------//
//---------------------------------------------------------------------------//
//ФС_ОбъектФССуществует//
//Проверяет: существует-ли каталог или файл //
//---------------------------------------------------------------------------//
Ответ = ВК.ФС_ОбъектФССуществует(
"/data/data/com.e1c.mobile/files/1C/1cem/test");
стк = РазобратьJSON(Ответ);
КаталогСуществует = ложь;
Если стк.Status тогда
КаталогСуществует = истина;
КонецЕсли;
//---------------------------------------------------------------------------//
//---------------------------------------------------------------------------//
//Общий пример для работы с файловой системой: удаляет все файлы внешних //
//компонент из каталога ExtCompT мобильной платформы. //
//---------------------------------------------------------------------------//
&НаКлиенте
Процедура СканироватьФайловуюСистему(Команда)
//stat.h
//#define S_IRWXU 00700
//#define S_IRUSR 00400
//#define S_IWUSR 00200
//#define S_IXUSR 00100
//#define S_IRWXG 00070
//#define S_IRGRP 00040
//#define S_IWGRP 00020
//#define S_IXGRP 00010
//#define S_IRWXO 00007
//#define S_IROTH 00004
//#define S_IWOTH 00002
//#define S_IXOTH 00001
БазовыйКаталог = "";
Ответ = ВК.ФС_ОбъектФССуществует(
"/data/data/com.yourapp.tsd/files/1C/1cem");
стк = РазобратьJSON(Ответ);
Если стк.Status тогда
БазовыйКаталог = "/data/data/com.yourapp.tsd/files/1C/1cem";
иначе
Ответ = ВК.ФС_ОбъектФССуществует(
"/data/data/com.e1c.mobile/files/1C/1cem");
стк = РазобратьJSON(Ответ);
Если стк.Status тогда
БазовыйКаталог = "/data/data/com.e1c.mobile/files/1C/1cem";
КонецЕсли;
КонецЕсли;
Если БазовыйКаталог <> "" тогда
Ответ = ВК.ФС_ПрочитатьДанныеИзФайла(БазовыйКаталог +
"/ibases.v8i");
Если ТипЗнч(Ответ) = тип("ДвоичныеДанные") тогда
стр = ПолучитьСтрокуИзДвоичныхДанных(Ответ);
Попытка
ИВФ = ПолучитьИмяВременногоФайла("txt");
ЗаписьТекста = новый ЗаписьТекста(ИВФ);
ЗаписьТекста.ЗаписатьСтроку(стр);
ЗаписьТекста.Закрыть();
ЧтениеТекста = новый ЧтениеТекста(ИВФ);
стр = "";
Пока стр<>Неопределено Цикл
стр = ЧтениеТекста.ПрочитатьСтроку();
Если СтрНачинаетсяС(стр,"[Tsd test]") тогда
стр = "";
Пока стр<>Неопределено Цикл
стр = ЧтениеТекста.ПрочитатьСтроку();
Если стрСравнить(Лев(стр,стрДлина("Connect=File=")),"Connect=File=")=0 тогда
масСтр = СтрРазделить(стр,"/1cem/");
Если масСтр.Количество()>1 тогда
сткРез0 = РазобратьJSON(ВК.ФС_ПрочитатьКаталог(БазовыйКаталог + масСтр[1]));
Если сткРез0.Status тогда
сткРез1 = РазобратьJSON(сткРез0.Data);
Для каждого эстк из сткРез1 Цикл
Если эстк.Значение = ".." или эстк.Значение = "." тогда продолжить КонецЕсли;
П = БазовыйКаталог + масСтр[1] + ?(прав(БазовыйКаталог + масСтр[1],1)="/","","/")+эстк.Значение;
сткЭтоДиректорияСтатус = РазобратьJSON(ВК.ФС_ЭтоДиректория(П));
Если сткЭтоДиректорияСтатус.Status тогда
Если РазобратьJSON(сткЭтоДиректорияСтатус.Data).IsDirectory тогда
Р = УдалитьФсеФСОРекурсивно(П + "/ExtCompT",ВК);
Если ЗначениеЗаполнено(Р) тогда
Попытка
ВызватьИсключение "Не удалось зачистить кэш: "+Р;
исключение
Ош = ОписаниеОшибки();
//ДИАГНОСТИКА
КонецПопытки;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЕсли;
Прервать;
КонецЕсли;
КонецЦикла;
прервать;
КонецЕсли;
КонецЦикла;
исключение
Ош = ОписаниеОшибки();
//ДИАГНОСТИКА -
КонецПопытки;
Попытка
УдалитьФайлы(ИВФ);
исключение
Ош = ОписаниеОшибки();
//ДИАГНОСТИКА - ошибка удаления ВФ
КонецПопытки;
КонецЕсли;
иначе
Попытка
ВызватьИсключение стк.Description;
исключение
Ош = ОписаниеОшибки();
//ДИАГНОСТИКА
КонецПопытки;
КонецЕсли;
//Ответ = ВК.ФС_ОбъектФССуществует("/data/data/com.e1c.mobile/files/1C/1cem/test");
//стк = РазобратьJSON(Ответ);
//КаталогСуществует = ложь;
//Если стк.Status тогда
// КаталогСуществует = истина;
//иначе
// Ответ = ВК.ФС_СоздатьКаталог("/data/data/com.e1c.mobile/files/1C/1cem/test", 511);
// стк = РазобратьJSON(Ответ);
// Если стк.Status тогда
// КаталогСуществует = истина;
// КонецЕсли;
//КонецЕсли;
//
//Если КаталогСуществует тогда
// Ответ = ВК.ФС_СоздатьФайл("/data/data/com.e1c.mobile/files/1C/1cem/test/test.txt");
// стк = РазобратьJSON(Ответ);
// Если стк.Status тогда
// Ответ = ВК.ФС_ЗаписатьДанныеВФайл("/data/data/com.e1c.mobile/files/1C/1cem/test/test.txt", ПолучитьДвоичныеДанныеИзСтроки("СтрокаДляДД"));
// стк = РазобратьJSON(Ответ);
// Если стк.Status тогда
// Ответ = ВК.ФС_ПрочитатьДанныеИзФайла("/data/data/com.e1c.mobile/files/1C/1cem/test/test.txt");
// Если ТипЗнч(Ответ) = тип("ДвоичныеДанные") тогда
// стр = ПолучитьСтрокуИзДвоичныхДанных(Ответ);
// КонецЕсли;
// КонецЕсли;
//
// Ответ = ВК.ФС_ПереименоватьФайлИлиКаталог("/data/data/com.e1c.mobile/files/1C/1cem/test/test.txt","/data/data/com.e1c.mobile/files/1C/1cem/test/test1.txt");
// стк = РазобратьJSON(Ответ);
// Если стк.Status тогда
// Ответ = ВК.ФС_УдалитьФайлИлиКаталог("/data/data/com.e1c.mobile/files/1C/1cem/test/test1.txt");
// стк = РазобратьJSON(Ответ);
// иначе
// Ответ = ВК.ФС_УдалитьФайлИлиКаталог("/data/data/com.e1c.mobile/files/1C/1cem/test/test.txt");
// стк = РазобратьJSON(Ответ);
// КонецЕсли;
// КонецЕсли;
//
// Ответ = ВК.ФС_УдалитьФайлИлиКаталог("/data/data/com.e1c.mobile/files/1C/1cem/test");
// стк = РазобратьJSON(Ответ);
//КонецЕсли;
//
//
////Для а = 0 по 10000 цикл
//
////Ответ = ВК.ФС_ЭтоДиректория("/data/data/com.e1c.mobile/files/1C/1cem");
////стк = РазобратьJSON(Ответ);
////Если стк.Status тогда
//// стк0 = РазобратьJSON(стк.Data);
//// //Для каждого эстк из стк0 цикл
//// //
//// //КонеЦЦикла;
////КонецЕсли;
////КонеЦЦИкла;
КонецПроцедуры
&НаКлиенте
Функция УдалитьФсеФСОРекурсивно(вхКаталог, ВК)
Если РазобратьJSON(ВК.ФС_ОбъектФССуществует(вхКаталог)).Status тогда
сткРез = РазобратьJSON(ВК.ФС_ПрочитатьКаталог(вхКаталог));
Если сткРез.Status тогда
сткРез0 = РазобратьJSON(сткРез.Data);
Для каждого эстк из сткРез0 Цикл
Если эстк.Значение = ".." или эстк.Значение = "." тогда продолжить КонецЕсли;
П = вхКаталог + ?(прав(вхКаталог,1)="/","","/")+эстк.Значение;
сткЭтоДиректорияСтатус = РазобратьJSON(ВК.ФС_ЭтоДиректория(П));
Если сткЭтоДиректорияСтатус.Status тогда
Если РазобратьJSON(сткЭтоДиректорияСтатус.Data).IsDirectory тогда
УдалитьФсеФСОРекурсивно(П, ВК);
КонецЕсли;
КонецЕсли;
ВК.ФС_УдалитьФайлИлиКаталог(П);
КонецЦикла;
КонецЕсли;
КонецЕсли;
ВК.ФС_УдалитьФайлИлиКаталог(?(прав(вхКаталог,1)="/", Лев(вхКаталог,стрДлина(вхКаталог)-1), вхКаталог));
КонецФункции
//---------------------------------------------------------------------------//
//---------------------------------------------------------------------------//
//ОписаниеУстройства//
//Свойство компоненты - показывает производителя и модель устройства //
//---------------------------------------------------------------------------//
стрПроизводительИМодель = ВК.ОписаниеУстройства;
//---------------------------------------------------------------------------//
Исходники:
https://github.com/KotVezdehod/Hermes
https://github.com/KotVezdehod/dreamcatcher_gith
Частично использован код из //sale.itcity.ru/1c/articles/987286/