2 монитора для администратора нескольких баз 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='\

30 Comments

  1. Ёпрст

    *.lck никак не может достоверно указать на наличие юзверя в базе..

    це же аксиома.

    Reply
  2. mark_iz

    (1) Год работает. Ошибок не было.

    Reply
  3. Ёпрст

    (2) Брехня.. При аварийном завершении 1с-ины файлик остается — а вот юзверя в базе ужо нет.

    Reply
  4. mark_iz

    А ты программку читал? Почитай. Узнаешь, почему не было ошибок.

    PS. Брешут собаки.

    Reply
  5. Ёпрст

    (4) программу не смотрел, просто вижу чего написано в аннотации.

    Reply
  6. Ёпрст

    +5 посмотрел, так еще можно, а вот топик тогда поправь.

    Reply
  7. Ёпрст

    последнийСимв = глНайтиПоследнийСимвол<<?>>(стрКат, «»);

    {КТО.ERT(192)}: Функция не обнаружена (глНайтиПоследнийСимвол)

    Reply
  8. Ёпрст

    тБазы.Префикс = спрФирмы.ПрефиксНомера;

    {КТО.ERT(215)}: Поле агрегатного объекта не обнаружено (ПрефиксНомера)

    Reply
  9. Altair777

    последнийСимв = глНайтиПоследнийСимвол<<?>>(стрКат, «»);

    {D:DOWNLOADS1СKTO RABOTAET.ERT(192)}: Функция не обнаружена (глНайтиПоследнийСимвол)

    Reply
  10. mark_iz

    (6) В топике написал чё делает программа.

    (7, 9) Исправил. Забыл, что эта процедурка у меня в глобальнике. Пардон.

    (8) ПрефиксНомера — стандартный реквизит справочника Фирмы, его необходимо заполнять если используется разделитель учета. (на всякий случай: у меня это строка 2 смв.)

    Reply
  11. mark_iz

    В (10) смайлик заменил цифру 8.

    Reply
  12. Altair777

    +(9) упс… я не сразу увидел (7) коммент.

    Закладка была открыта еще раньше.

    Reply
  13. wing

    Файл *.lck не создается, если у пользователей не прописана рабочая папка — тогда пользователь может входить в 1С несколько раз, а настройки используются глобальные. Понимаю, что это не совсем корректно, но сталкивался с таким не раз …

    Reply
  14. try2007

    (3) — навеяло:

    — Доктор, куда лучше морфий колоть?!!

    — А что случилось?!

    — Ну у нас тут одному голову оторвало…

    Reply
  15. mark_iz

    (13) Когда писалась программа, в рабочей конфигурации у всех пользователей была своя папка, и эта папка находилась (и находится) в подпапке Users каталога ИО. Так что приведенный Вами случай для меня был не актуален. Программу писал для себя, а не как что-то универсальное.

    Reply
  16. wing

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

    Reply
  17. Altair777

    (15) А сделать универсальную слабо? Не заточенную под конкретную ситуацию. С возможность выбора перметров.

    А то код очень сильно переписывать надо.

    Reply
  18. mark_iz

    (17) Кто будет оплачивать? 😀

    Reply
  19. Altair777

    (18) А чувство гордости за хорошо выполненную работу ничего не стоит?

    Reply
  20. mark_iz

    (19) Мне есть чем гордиться и без ненужных трудозатрат.

    Reply
  21. Altair777

    (20) Ну, теперь моя душа точно спокойна 🙂

    Reply
  22. try2007

    (13) насчет не совсем корректно без рабочих каталогов работать, если бы это было не корректно 1С, думаю убрала такую возможность, но… приведу один пример из жизни, зачем необходимо заходить несколько раз под одним пользователем: Челу поставили непральный оклад с января по август считалась завышенная зарплата, расчетчица чего то там нахимичила с ручными исправлениями и пришлось анализировать расчетки за период — у меня есть такая обработка — на экране множество последовательностей расчеток (в различных положениях шаловливых ручек), так вот просто удобно и красиво (потому что быстро и вовремя хотя успело таки завонять) получилось без рабочих каталогов (мораль тогда была правильно использовать документ исправление а не пользоваться внешними штучками пытаясь подставить программиста). И если бы я знал что можно высосать из пальца то привел бы еще несколько таких примеров (камень в огород Altaira777 — http://www.infostart.ru/public/22098/ (15)). 😀

    Reply
  23. Altair777

    (22) А в твой огород не только я камень кидал 🙂

    И комменты и оценка той обработки очень интересны

    Например, 12 или 27 коммент

    Цитирую:

    27. Ёпрст 03.09.2009 17:22:06

    Мда… А если еще и сервис-Параметры поглядеть, так вообще страшные тайны автору откроются..


    😉

    Слушай Ёпрста! © Че

    Reply
  24. try2007

    Я занимался боксом и знаю что такое брэк… Очень прошу вас лично ко мне не обращаться и тем более на ты ❗

    Reply
  25. Altair777

    (24) Извиняюсь за «ты». Сгоряча написал.

    И, в свою очередь, я попрошу Вас не кидать камни в мой огород.

    Reply
  26. try2007

    Не стану более если вы мну научите как с рабочим каталогом несколько раз зайти под одним пользователем, это к сабжу в части (13) относится.

    Reply
  27. Altair777

    (26) Условия ставите? 😀

    вы же говорили, что знаете что такое «брек»

    вам же Арчибальд уже сказал. Да и мне тоже, если честно 🙂

    Но я вас не трогал.

    P.S. То, что слова «Вы», «Вам», «Вас» нужно писать с большой буквы я знаю.

    Умышленно написал их с маленькой, что бы не смутить try2007.

    Reply
  28. mark_iz

    (23 — 27) Надеюсь, булыжники уже закончились.

    Reply
  29. Altair777

    (28) сорри за офф-топы и флейм

    Но Вы напрасно написали не (22 — 27). Ведь булыжник был взят именно в 22 комменте. Причем, в прямом смысле 🙂

    > камень в огород Altaira777

    В качестве моральной компенсации сниму-ка я свой минус…

    Reply
  30. mark_iz

    (29) Да пожалуйста! Мне всегда было интересно послушать диалог двух умных людей (ни капли иронии!).

    Да и за «плюсик» от Советника Администрации все-таки надо сказать СПАИСБО.

    Reply

Leave a Comment

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