Работа с ftp из мобильного приложения 1С




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?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='\

22 Comments

  1. mihey

    А не умеет потому что это прошлый век, файлы гонять по ftp, сейчас модно веб-сервисы

    Reply
  2. NekoZver

    (1) mihey, Старый конь борозды не портит, а мода это понятие быстро проходящее. Не стоит забрасывать удобные интерфейсы если появились новые, к тому же ты не представляешь сколько лабуды на FTP работает, не все такие резвые как ты. Иногда есть просто суровая необходимость.

    Reply
  3. flyer

    не везде клиенты могут открыть доступ к веб сервису так что пока фтп остается актуальным

    Reply
  4. Byrabyk

    А сразу несколько файлов можно выгрузить?

    Reply
  5. NekoZver

    (4) Byrabyk, не побывал, но в описании AndFtp есть вот такой кусочек

    And define file(s) to download into a local folder:

    intent.putExtra(«remote_file1», «/remotefolder/subfolder/file1.zip»);

    intent.putExtra(«remote_file2», «/remotefolder/subfolder/file2.zip»);

    я думаю будет выглядеть вот так например

    ОбъектАндроид.ДополнительныеДанные.Добавить(«local_file1″ ,»/sdcard/Download/File1.xml»);
    ОбъектАндроид.ДополнительныеДанные.Добавить(«local_file2″ ,»/sdcard/Download/File2.xml»);
    ОбъектАндроид.ДополнительныеДанные.Добавить(«local_file3″ ,»/sdcard/Download/File3.xml»);
    Reply
  6. set5553

    Что-то не работает этот кусок кода. Все перепробовал

    Reply
  7. rhtr

    Закрыть «AndFtp» после получения/передачи файлов.

    ОбъектАндроид.ДополнительныеДанные.Добавить(«close_ui», «true»);

    Reply
  8. rhtr

    А вот как удалить файл с FTP ?

    Reply
  9. NekoZver

    (6) set5553, это который кусок?

    (8) rhtr, к великой печали моей не нашел 🙁

    Reply
  10. ALLES

    вот и доказывай заказчику, что это прошлый век, когда он хочет чтобы через ФТП и никаких веб сервисов

    Reply
  11. set5553

    (9) а код пишется в контексте? #Если МобильноеПриложениеКлиент ? Или другое?

    Reply
  12. dj_serega

    Я в свое время юзал AcodeTools. Там есть не только фытыпы.

    upd: Но за публикацию держите + 😉

    Reply
  13. NekoZver

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

    Reply
  14. spezc

    Надеюсь это мне не понадобится. Но звезду поставил, за желание делиться опытом)

    Reply
  15. rougudz

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

    Reply
  16. kail_riss

    День добрый. Где можно взять список всех команд?

    Reply
  17. NekoZver

    (16) Добрый, я все что нашел вот Здесь

    Там в нижней части сайта табличка с командами

    Reply
  18. kail_riss

    спасибо огромное)))

    Reply
  19. kail_riss

    Еще вопрос как создать директорию на ftp, что-то не могу найти в мануале как это сделать.

    Reply
  20. user592559_vitus_b

    Большое спасибо )))

    Reply
  21. 8149

    (15)

    ОбъектАндроид.Запустить(Истина);

    в оладке остановись после,

    посмотри ДополнительныеДанные через «F2″(Рассчитать).

    там все найдешь.

    Reply
  22. rougudz

    (22) Спасибо!

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *