7 -> 8




Принцип обмена данными из 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='\

21 Comments

  1. withoutface

    для 7.7:

    НашФайл = РасположениеФайла();

    Reply
  2. Vitek

    Мне кажется это полный здец…Вы еще с С++ стыковать начните.

    Reply
  3. Abadonna

    (2) :)))

    Вот еще:

    FullName:=ParamStr(0);

    FileName:=ExtractFileName(FullName);

    Dir:=ExtractFilePath(FullName);

    Reply
  4. BandW

    (2) (3)

    Поясните пожалуйста ваш коммент.

    Я правильно понял, что это не целесообразно и не кому не нужно?

    Reply
  5. GSoft

    поддержу (2)

    8ка — это новый язык,и тут надо не базу «стыковки» делать а учить ЕАЯ(естественный алгоритмический язык) — диаграммы и блоки. Вот через него еще можно делать стыковку, но ….. НЕ нужно. Вы должны четко себе представлять что вы хотите.

    Как пример — я как то программировал вот такой отчет — http://infostart.ru/profile/8784/projects/2754/

    Блок построения табличной части я переписывал раз пять. И не потому что не знаю язык 7.7 или описание и функционал методов и процедур, а потому что не было окончательного алгоритма построения — к которому я пришел постепенно в процессе работы.

    Так что два часа с ручкой и бумагой съэкономят Вам больше времени нежели 5 минут с «таблицей соответствия». ИМХО

    Reply
  6. GSoft

    (4) думаю я разъяснил за Lomok его ответ.

    Reply
  7. Vitek

    GSoft +1.

    8-ка не является «продолжением» семерки, это самостоятельная платформа.

    Более того, в большинстве случаев «семерочный подход» в 8ке вреден и неэффективен.

    Reply
  8. BandW

    Ваша позиция мне теперь ясна,

    но как быть когда нужно срочно что то сделать нужна подсказка.

    Вот на пример в 77 была функция

    Код
     КаталогИБ()

    Показать полностью

    ,

    а как узнать где каталог ИБ?

    Reply
  9. Душелов

    (8) А зачем оно надо?

    Reply
  10. Душелов

    +9 >Более того, в большинстве случаев «семерочный подход» в 8ке вреден и неэффективен.

    Это я к тому 😉

    Reply
  11. BandW

    Нашел, но вот времени потратил.

    А может кому то пригодился бы уже готовый вариант

    77 КаталогИБ()

    81 СтрокаСоединенияИнформационнойБазы()

    Плюс коменты профи, которые может дали бы более правильный аналог. И разъяснили тонкости.

    Reply
  12. BandW

    (9) Очень странный вопрос.

    На сколько я понимаю, в этом каталог лежит вся база (если это не SQL).

    Или вы хотите сказать что в 77 нужно было определять где лежит ИБ, а в 81 нет?

    Reply
  13. BandW

    (10) в целом это так

    Reply
  14. BandW

    Вот еще, мне нужно было отделить каталог, где лежит обработка и имя файла самой обработки

    вот, что у меня вышло:

    Код
    ИмяФайла=ИспользуемоеИмяФайла;
    КаталогФайла="";
    Пока 1=1 Цикл
       Поз=Найти(ИмяФайла,"");
       Если не(Поз) тогда прервать;
       КонецЕсли;
       КаталогФайла=КаталогФайла+Лев(ИмяФайла,Поз);
       ИмяФайла=Сред(ИмяФайла,поз+1);
    КонецЦикла;
    Сообщить(ИмяФайла);
    Сообщить(КаталогФайла);

    Показать полностью

    А может есть более правильный вариант-аналог команде 77

    Код
    РасположениеФайла(Каталог,ИмяФайла);

    Показать полностью

    ???

    Reply
  15. Душелов

    Вопрос, для каких целей нужно получить путь к базе? 🙂

    Reply
  16. BandW

    Задача поставлена клиентом.

    Нужно складывать логи выполнения обработки в папку ИБ в подкаталог 1Cv8Log.

    Reply
  17. Душелов

    (16) Для таких случаев обычно делается расшаренная папка на сервере и указывается к ней путь.

    Reply
  18. GSoft

    (11) более «правильно» будет задать конкретный вопрос на интересующую тему так как

    1. больше шансов что обрисовав точную ситуацию вы получите именно то что вам надо

    2. индексация и поиск тем: вероятно что не вам одному может понадобиться помощь в решении этого вопроса

    Reply
  19. Душелов

    (18) КаталогИБ — это как раз «семерочное» мышление, когда данные хранятся в файлах в папке с базой, когда эти самые файлы (внешние обработки, картинки) спокойно хранятся в самой базе.

    Подход не тот.

    Reply
  20. Душелов

    тьфу. имелось в виду не к (18), а просто по теме…

    Reply
  21. GSoft

    (20) а я уж испугался было)))))

    Reply

Leave a Comment

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