«Танкистам» 8.2 (ч.2)




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

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

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

<?php // Полная загрузка сервисных книжек, создан 2025-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. mdzen
    Одно не очень радует – в синтаксис-помощнике на все новые функции почти начисто отсутствуют примеры (или толковые примеры).

    Это точно.

    И еще огорчил обрезанный функционал поля HTML. В 8.1 много интересного сделано, а на 8.2 перенести пока не удалось….. 😥

    ❗ Интересно как 8.2 воспримут рядовые пользователи. У кого есть отзывы реальные?

    Reply
  2. CheBurator

    платформу — в топку.

    юзеров интересуют готовые адекватные работающие приложения.

    Reply
  3. Valerich

    За первую часть плюсанул — там ест за что. Во второй части как-то смазано получилось — ни внятных картинок, ни толкового описания. Плюсанул за попытку, но в следующий раз если схалтуришь, влеплю минус.

    Reply
  4. seermak

    (3) так все картинки в Word файле — скачать

    (2) Зря — так можно все пожечь, а приложения скоро будут

    Reply
  5. Valerich

    скачал — качество картинок никакое и в боьшинстве своем они не информативны. В общем первая часть была намного лучше. Во второй скатываешься к тому, что сам критикуешь:

    Одно не очень радует – в синтаксис-помощнике на все новые функции почти начисто отсутствуют примеры (или толковые примеры)
    Reply
  6. Valerich

    т.е. написано, что можно что-то сделать, но не написано как. Не говоря уж почему так, а не иначе.

    Reply
  7. seermak

    (6) давай мыло — вышлю заполненную конфу — она еще не готова совсем — так что тне выкладываю на обозрение

    Reply
  8. Valerich

    (7) да нет, спасибо. Я сам потренируюсь — так проще научиться и запомнить что-то. Просто раз уж взялся обучающие статьи писать, так пусть они будут обучающими, а значит толковыми — по шагам. Не надо торопиться. Пусть шажки будут маленькие, зато наглядные, чтобы даже новичок смог повторить. Я же не только за себя радею :), но и за народ.

    Вот например:

    Теперь «рисуем» форму, выдергивая из динамического списка нужные элементы. Запускаем программу открывается форму списка – красота все наглядно, и выбирает нужное при выборе.

    Далее идет картинка. Но непонятно, как я могу эту форму «нариосовать». Ведь принцип «рисования» в 8.2 в корне отличается от такого же в 7.х — 8.1.

    Не обижайся, просто тише едешь, дальше будешь (и плюсов больше получишь)

    Reply
  9. Valerich

    далее про пользовательскую видимость. Понятно только то, что система сама что-то может спрятать. Но что именно, по каким критериям, как этого добиться и т.п. в общем одни вопросы.

    Еще

    Формы стали динамическими – проще простого стало добавление в форму новых элементов и т.д. – Можно нарисовать в форме только Код и Наименование, а все остальное добавить в процессе формирования формы (как сделано в демонстрационной конфе) – плюс: удобно делать разработчику, минус: не завидую я тем, кто будет изучать, или тестировать код разработчика

    А если нет демонстрационной конфы…, тем боле что сам не завидуешь тем, кто будет разбираться. Раз уж разобрался, то донеси до народа внятно. ТОгда респект и увважуха обеспечены. 🙂

    Reply
  10. seermak

    (8) наверное ты прав. «Выдергивать из динамического списка» — это значит перетащить мышкой нужный реквизит из правого верхнего окна реквизитов в левое верхнее окно элеменов (при создании формы в конфигураторе) все эти изменения сразу становятся видимыми в нижнем окне (окно вида готовой формы — она недоступна для ручного редактирования — только готовый результат)

    Reply
  11. seermak

    (9) пользовательская видимость элемента — это свойство любого элемента при построении формы — открываешь и далее как настройка ролей пользователей — снял галку — пользователь с такими правами элемента формы не увидит, установил галку — элемент появился; устанавливается в конфигураторе. Про динамическое дополнение (расширение) формы если в двух словах — В процессе работы можно программно создавать и добавлять новые реквизиты(элементы) и команды формы, а система сама видоизменит форму с учетом новых реквизитов и элементов (это в двух словах)

    Reply
  12. DanilaDru

    (1) на 8.2 (ещё бета версии) был реализован проект по учету занятости удаленных сотрудников (вне офиса). Что сказать про отзывы — довольны, что не надо никакого ПО ставить на компы, а можно через браузер ходить.

    Reply
  13. Душелов

    (2) Я базу рабочую (центральную для синхронизации данных разных баз) перевел на 8.2. Во всю пользую ее механизмы, вебсервисы и прочее.

    Все пашет. Пользователи в шоке (приятном), 1С-ку ставить не надо, все филиалы (а их достаточно) все видят оперативно, заявочки, остатки и прочее… Вообщем, сейчас перевожу основную складскую базу на 8.2

    Reply
  14. PowerBoy

    не у всех есть Word 2007 🙁

    Reply
  15. Lubocka

    (14) поддерживаю,

    кроме книги Радченко, очень понравились статьи Масича

    http://masich.biz/categories/%CF%F0%EE%E3%F0%E0%EC%EC%E8%F0%EE%E2%E0%ED%E8­%E5/1%D18%3A-%CF%E5%F0%E2%FB%E5-%F8%E0%E3%E8/

    Reply
  16. seermak

    (14) извините, перегнал в word 97, залил

    А что никто не заценил картинку-то? (скриншот) 😉

    Reply
  17. sea-man

    (13) Вася, много переписывать пришлось в процессе перевода на 8.2?

    Reply
  18. oLo__233

    …подскажи как вставлять фото в справочники без Сервера только на Клиенте….

    Reply
  19. Душелов

    (17) Все формы 🙂

    (18) Это как так, без сервера?

    Reply
  20. oLo__233

    …имею в виду НаКлиенте…не могу разобраться…в 8.1 все легко получалось…на 8.2 проверка синтаксиса для ХранилищаЗначения пишет неоределен тип…в Синтаксисе про конструктор ХранилищаЗначения написано….Конструктор доступен только в толстом клиенте, на сервере и внешнем соединении…как же вставить фото, например, сотрудника…??

    Reply
  21. Душелов

    (20) ПоместитьВоВременноеХранилище

    ПолучитьИзВременногоХранилища

    А вообще, стоит с типовыми конфигурациями ознакомиться.

    Reply

Leave a Comment

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