<?php // Полная загрузка сервисных книжек, создан 2024-01-05 12:44:55
global $wpdb2;
global $failure;
global $file_hist;
///// echo '<H2><b>Старт загрузки</b></H2><br>';
$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
///// echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}
$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
///// echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}
/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
///// echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
///// echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist); ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7]; ////получаем размер файла
$m_mtime_file=$masiv_data_file[9]; ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file
///// echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
///// echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
///// echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);
if ($results)
{ foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));
////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
///// echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
///// echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}
////загружаем данные
$table='vin_history'; // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация // (путь от корня web-сервера)
$delim=';'; // Разделитель полей в CSV файле
$enclosed='"'; // Кавычки для содержимого полей
$escaped='\
ждем что то аналогичное для ios
Добрый день. А такие приёмы требуют прав суперпользователя в устройстве на андроид?
(1) очень сильно сомневаюсь 🙂
(3)Нет, это стандартный механизм.
А я говорил, что интенты добавят 🙂
А можно где-то посмотреть общий список команд которые можно выполнить?
(5) можно — для этого надо уже понимать основы программирования под андроид. И, увы, почему то далеко не все работает.
http://developer.android.com/guide/components/intents-common.html
Ну вот на офф сайте
(6) теперь ждем момента, когда 1с сможет быть сервером броэдкаста, а то посылать она оповещения то может, а вот прослушивать — нет. А как было бы круто 🙂
Присылаешь линк, как в уф, на товар или накладную — открывается 1с с этим товаром/накладной 🙂
С какого релиза все это стало возможно?
(8) allegrosoft, 8.3.5
А можно исходники приложения?))
(10) можно все 🙂 Позже обновлю статью и добавлю исходники
(11)Спасибо!
(12) добавил
В эмуляторе (VMware) метод тоже должен работать? У меня ничего не происходит и никаких ошибок не выдаётся.
(14) смотря что вы тестируете.
(15) попробовал все примеры, что здесь были. Допустим, отправку почты:
Метод «Запустить» выдает всегда Ложь (или 0, в зависимости от параметра метода)
Проект в Eclipce разработан? Что-то не пойму, как -то криво в eclipce открывается.
(16) странно, но боюсь что тут не пдскажу в чем дело, может нет ни одного приложения, которое должно откликнуться.ъ
(17) писали в IDEA
Спасибо за полезную статью по интересной теме!
Попробовал примеры из статьи. Поставил прогу для штрих-кодов, запустил команду, да, сработало.
Но не работает команда «android.intent.action.SEND». При этом установлен тот же GMail, смотрел в его манифесте, там эта команда в интентах есть. Не знаете, в чем может быть дело?
(19) CyberCerber, вы делаете вот так:
Показать
?
Что вам в ответ приходит?
(20) да, именно так и делаю. В ответ приходит 0. И больше ничего не происходит.
(21) CyberCerber, Даже не знаю что ответить. Это стандартная функция андроида.
Давайте тогда уточним все:
1. Версия андроид
2. Версия 1С
3. Название устройство
4. На скольки устройствах тестировали
5. Вы точно именно так писали? С учетом регистров и без своих каких-либо добавлений? На всякий случай скопируйте этот код и проверьте еще раз. Дабы был чистый эксперимент.
(22) по пунктам:
1. Андроид 4.0.4
2. 1С 8.3.5.1146
3. Huawei MediaPad 10 FHD
4. Пока на одном
5. Писал именно так, сто раз перепроверял, копировал из Манифеста.
Конечно, ус-во — китайщина, но разве может железо повлиять на работу этих механизмом. Тем не менее, постараюсь сегодня проверить на других девайсах.
(22) протестил на Samsung Galaxy S3 Android 4.3 — тоже самое
Но у меня получилось по-другому! Добавил строчку из примера НовВз.Тип=»message/rfc822″;
Открылся выбор Gmail и Bluetooth. Почему так, не можете подсказать? И откуда брать эту инфу о типе?
(24) интересует версия мобильной 1С, а не стационарной.
Так как там они немного переделали механизмы. Вообщем попробуйте из новых примеров в конце статьи.
(25) мобильная 8.3.5.74. Это уже старая версия?
О, спасибо за примеры. В общем, понял, что нужно изучать Манифесты приложений.
А никто не пробовал открыть из 1С картинку на редактирование, сделать там какие-то пометки и закрыть, сохранив? Не могу найти удобные редакторы/рисовалки, которые с Интентами работают.
Доброго времени суток!
Делаю фотку средствами 1С, сохраняю в базу и привязываю к нужному объекту. По сути встроенным и средствами все работает, но фотографии получаются довольно большие (мне бы хватило разрешения 800*600).
Можно ли это реализовать вашим методом?.
А можно ли сторонними программа вызывать/скрывать клавиатуру?
Я как то копал — пришел к выводу, что нельзя.
Но на всякий случай спрошу — вдруг ошибаюсь.
(27) а почему нет? Вы вызываете приложения для работы с фото (не 1С), задаете там размеры и фоткаете, в 1С приходит фото.
Если надо обрезать уже сделанное фото — тоже можно.
Пробуйте, а там увидите.
(28) теоретически можно, но такую программу надо самому писать. Врядли вы найдете готовое решение.
Коллеги подскажите пожалуйста. В основном по nfc пишут про необходимость перехвата, но 1с этого не умеет. Может встречали приложение, с помощью которого можно было бы перехватить nfc метку? На подобии как автор вызывает стороннее приложение для сканирования штрих-кодов.
А как можно запаковать в архив каталог?
Интерактивно делается так: Мои файлы — выбираем файл или каталог — меню — Заархивировать.
(31) это вы сейчас о чем?
(32)
Собственно проблемы следующие:
1. Хочу с мобильного приложения создать десяток xml-ек. Запаковать в zip. Отправить по почте.
2. Хочу подключиться к ftp, передать туда десяток файлов или если получится запаковать в архив то передать архив.
Ни первое ни второе не работает.
upd: в тонком клиенте файлы на фтп передаются (в т.ч. каталоги создаются). А вот с мобильного лажа ;(
upd2: Код следующий:
Ошибка следующая:
ftp://ipRequest must not be null.
Каталог не знайдено ‘ftp://login:pass/ip/ИмяКаталога’: Помилка роботи з інтернет:
Я уже и / и пробовал. Толку ноль. Ошибка одна и та же.
(33) dj_serega,
FTPСоединение (FTPConnection)
Описание:
Предназначен для работы с файлами и каталогами на ftp-серверах.
Доступность:
Тонкий клиент, сервер, толстый клиент, внешнее соединение.
(34) Так вот именно. Что Новый FTPСоединие не работает на мобильном.
Я подключался по пути «СоздатьКаталог(«ftp://login:pass@ip/ИмяКаталога/»);»
Думал нет объекта но подключиться можно.
А как на счет вызова программы которая запакует несколько файлов?
(35) хм, ну продолжайте копать 🙂 Авось чего интересного найдете 🙂
Не подскажите, а может ли 1С отправлять broadcast команды?
В Манифесте приложения есть секция activity с intent-filter. Вот действия оттуда срабатывают.
А вот отправляю команду, которая находится в секции receiver с intent-filter — ничего не происходит.
Если через adb shell отправляю команду «am broadcast -a <описание.команды>», то все работает.
Получается, 1С этого еще не умеет?
(37) не может, только стартануть активити может, и принимать бродкасты — тоже пока не умеет.
(38) ясно, значит, будем надеяться на новую версию платформы…
О, вижу, вы выложили разработку Acode tools! Как я понимаю, через нее можно реализовать и это.
Подскажите, пожалуйста, почему ХЗ = Новый ХранилищеЗначения(Новый ДвоичныеДанные(«file:///sdcard/Download/FotoTestFrom1C.bmp»)); вызывает ошибку недопустимое значение параметра 1?
(40) потому что:
file:///sdcard/Download/FotoTestFrom1C.bmp — это URI
/sdcard/Download/FotoTestFrom1C.bmp — а это просто путь или path.
uri — Universal resource Identifier.
Эта штука включает в себя:
— схему доступа
— путь к элементу
— идентификатор элемента
т.е. например к записи в БД ты можешь создать uri.
Типичный URI:
jdbc:mysql://localhost/niflheim?useUnicode=true&characterEncoding=utf-8
А path это путь к объекту файловой системы.
Андроид обычно работает с uri, так как он должен понимать — вы указали путь к файлу, или это путь к записи в бд.
Если привести анологию в 1С, то в 1С есть такая фишка, как ссылка на объект.
К примеру:
e1cib/data/Справочник.Пользователи?ref=8259005056c0000811e4723249a21e41 — это путь к элементу справочника, в котором указывается, что это конкретно справочник, и не просто справочник, а вполне определенный справочник, или в андроиде — это URI
С другой стороны:
8259005056c0000811e4723249a21e41 — это просто ID, или в андроиде — path.
Вы если хотите обратиться к элементу, вы не можете просто взять указать ID и получить объект, вам надо указать — что это за объект.
Вот тут тоже самое. Т.е. когда вы делаете запись фото — вы должны указать для андроида uri, тогда он поймет, что это файл и где он лежит.
С другой стороны, когда вы получаете файл из 1С, то 1С уже и сама знает, что работать вы будете только с файлом и все.
Поэтому ей достаточно указать просто путь, а вот уже сама 1С, внутри своей системы — по этому пути получит uri и будет с ним работать.
Надеюсь я понятно объяснил?
(41) все понятно. Большое спасибо!
Автору — огромное спасибо, выдает «нагора» массу полезной информации!
Кандидат в «Фабрику знаний» — вкл / выкл приемник GPS
Показать
А как скрыть экранную клавиатуру после окончания ввода текста (например в своей форме поиска).
Код есть, но как его прикрутить к 1С ?
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
(44) без исходников 1с — никак. Во всяком случае — мы не смогли этого добиться.
Еще один из вариантов — своя клавиатура. Вот у нас в ТСД своя клавиатура, и мы ее можем скрывать, открывать и вообще че хотим то и делаем 🙂
Большое спасибо за пример с «android.media.action.IMAGE_CAPTURE». Пригодилось.
Но есть проблема с размером картинки. У меня приложение «Камера», которое автоматически вызывается, позволяет установить минимальное разрешение 1 Мпикс. И файл изображения получается большой. Как его можно уменьшить?
(46) автоматически вызывается из 1с? Ну так вызовите свое приложение камеры. Я вот это люблюhttps://play.google.com/store/apps/details?id=fr.xplod.focal&hl=ru
Спасибо. Но если я установлю еще одно приложение камеры, как указать, чтобы использовалось именно оно? Ведь может быть несколько подобных приложений на моб. устройстве.
(48) смотрите вот этот кусок в этой публикации «Как сделать фото (видео) в любом качестве?»
И при запуске — у вас будет вопрос — что выбрать. Выберите камеру и скажете что бы выбиралось всегда по умолчанию.
Либо можно доп параметрами указать конкретное приложение, как это сделать — указано в статье
Понял, спасибо за разъяснение.
Всем привет! Никто не пробовал работать с «распознователем речи»? Нашел статейку на эту тему(http://stackoverflow.com/questions/6316937/how-can-i-use-speech-recognition-without-the-annoying-dialog-in-android-phones) только у меня ничего не выходит (видимо потому что в этом неразбираюсь) может кто то уже пробовал если да до выложите плиз кусочек кода))
Подскажите, как сделать таким образом, чтобы при открытии формы курсор сразу вставал на поле, чтобы сканирование выполнялось в поле ввода? Приходится «тапать» на поле, после чего выполнять сканирование.
Нельзя ли, например, поставить стороннюю клавиатуру и вызвать событие «Enter» или «Tab»?
(52) баг платформы, увы, эта опция доступно только в 8.3.4.17, во всех остальных — не работает. А вам с какой целью?
Каким образом можно мобильное приложение развернуть на весь экран? Толком так и не разобрался, нотут написано, что для API 16 и выше работает только метод
Показать
Можно ли этот код выполнить из 1С?
(54) не туда копаете, правьте манифест и там указывайте что хотите, только это нарушает лицензию 1с 🙂
(55) Было бы все так просто. Правка манифеста — не панацея. Опробовали на разных устройствах, и в зависимости от параметров экрана снизу остается полоса высотой до 100 пикселей. На смартфонах от 3,5 до 4″ работает норм. На смарте 5″ остается совсем небольшая полоса снизу, почти незаметная, а вот на ТСД — бидапичаль. Причем после закрытия окон в этой полосе отображается шапка окна (глюк?)
В приложении это видно. При правке манифеста единственное, что меняется — скрывается статусбар
(56) ну это таки глюк, на партнерке о нем вроде как говорили, а вообще отправьте в 1с инфу, зарегят и исправят.
Здравствуйте!
Ну а где сама утилита для реализации кода?
Показать
Это для простого сообщения, а вот это действие для пуша:
«com.ditrix.ownaction.SHOW_NOTIFICATION»
При этом вам вернется ответ в виде 3 данных разных типов.
(58) во вложении к статье 🙂
Я не много не понял скачал apk, установил, прописал Ваш код по отправке push и toast, в итоге не получил ни push ни toast сообщений, расскажите как использовать?
(60) DeniNikitin,
Извиняюсь просмотрел всё работает корректно!
А никак нельзя иконку и текст «Notification» заменить?
(62) увы, это ограничения Андроида, можно выставлять только те иконки, которые находятся в ассетах приложения, т.е. при компиляции.
(63)
Если я правильно понял скачиваю ваши исходники меняю там иконку компилирую и будет другая иконка?
(64) ну если именно заменить, то да, а если добавить еще одну, то надо код дописывать.
(63)
Подскажи в какой среде разработки написан проект? Какой IDE использовал?
(66) не помню, или идея или эклипс
Здравствуйте!
А есть пример, что сделать с этой штукой:
?
(68) DeniNikitin,
Что возвращает, как вытащить расширение и.т.д.?
Приношу извинения пример есть:
Показать
Но я понимаю он возвращает uri, а как из него получить двоичные данные? Если можно пример?
(70) URI — это путь к файлу, а как из файла вытащить двиочные данные — точно так же как и в стационарной, и читайте камменты, тут был пример с картинкой
(71)
Если URI — Путь к файлу, тогда должно работать
Но не работает пишет «Недопустимое значение параметра №1»
Попробовал:
Выдаёт Файл не обнаружен «file://content://external/images/media/10466»
В примерах посмотрел с картинкой примера нет, если только не прописывать строкой ФайлКартинки = «file:///sdcard/Download/FotoTestFrom1C.bmp»;
Подскажите куда копать?
(71) И ещё заметил такую вещь, что после выбора картинки мне возвращается строка «content://external/images/media/10466», а по факту в total commander смотрю там файл img_…..jpg? Точно путь возвращается в Данные?
(73) верн. Так вы выюираете через последние данные. Хотите так выбирать, тогда надо выпрямить ссылку. Читайте в другой статье про утилиты
(74)
А ссылку на статью можно?
Нашёл пример на яве
if(resultCode==RESULT_OK){
String FilePath = data.getData().getPath();
textFile.setText(FilePath);
}
А ни как нельзя этот getPath() в каких-нибудь свойствах ЗапускПриложенияМобильногоУстройства тоже прикрутить?
(75)http://infostart.ru/public/310565/
(76) нет. Во всяком случае — я не знаю как это сделать из 1с
Спасибо! Использовал функцию ПолучитьUriИзContent(Путь) и всё как надо!
Вопросит по фото из 1С
Чтобы он в галерее отображался? А то у меня физически есть а в галереи нету?
(79) не понял вопрос, можете уточнить?
(80)
Смысл в следующем, код работает и файл сохраняет, но при этом захожу в галерею андроида, его там нет! Через total commander — есть! Вы в андроиде больше понимаете, скорей всего есть какой-то параметр, который надо подключить, чтобы в галерее отображался!
(81) ну для начала путь укажите верный: file:///sdcard/DCIM/Camera/FotoTestFrom1C.jpg
(82) Дело не в пути, я галерею открываю и у меня там по папкам фото отображается и в том числе есть папка DCIM, и которые файлы там лежат они отображаются кроме того, что сфотал интентом!
(83) очень интересно. Может расширение файла не совпадает с его реальным типом?
Тут я затрудняюсь ответить. У меня галерея подхватывает все. Так что тут скорее всего вопросы именно в вашей галерее.
Подскажите, как можно открыть html-файл через браузер? Какой MIME-тип нужно указывать чтобы запустился браузер? Или само название приложения (к примеру «com.google.android.gm»)
(85) так вы же сами ответили.
берите за пример открытие контакта в вибере
79. А диктофон встроенный никто не пробовал запускать?
а то метод СделатьАудиозапись меня не совсем устраивает.
НП = Новый ЗапускПриложенияМобильногоУстройства(«android.provider.MediaStore.RECORD_SOUND»);
(86) помоги пожалуйста
(7)
Как я понял, запускать можно только активити с параметрами? Сервисы таким образом запускать нельзя?
(93) вы вызываете намерение, у сервисов их нет, т.е. вы и активити то не все вызвать можете, а только те, у которых есть фильтр намерений.
(94)
Т.е. для организации двухстороннего обмена с сервисом с использованием интентов нужна активити-прослойка в любом случае :/
Получается и асинхронный режим выпадает?
(95) djvu, во всяком случае — на текущий момент, да.
Но как научимся слушать бродкасты…
(96) можно конфигурацию скинуть этой статьи
(98) enot_tut, держите
у меня заработал такой вызов камеры android/ Сделано на базе примера, за что спасибо
Показать
(45) приветствую. есть какие нибудь изменения касательно скрытия клавиатуры? Если своя клавиатура, имеется в виду скачать какую нибудь клавиатуру с playmarket? напримерэту
(2) прошло почти 4 года, не в курсе для ios описания такого нет?
(7) эх, еще бы LiveDat-у подключить 🙂