Каталог решений - Внешняя компонента для мобильного приложения

Внешняя компонента для мобильного приложения

Внешняя компонента для мобильного приложения

В наличии

Внешняя компонента для дополнения мобильной платформы некоторыми функциями.

Категория:

Описание

ВК имеет следующие функции:
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 и архитектурах:

ARM5.1
x865.1
ARM648
x86_648

 

Описание функций.

//--------Установка компоненты--------//
УстановитьВнешнююКомпоненту("ОбщийМакет.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/

has been added to your cart:
Оформление заказа