Вычисление выражений




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

16 Comments

  1. MaxDavid

    Почему в заголовке формы указан Life1C.ru? Это ваш ресурс?

    Reply
  2. MaxDavid

    Почему вы выложили публикацию только сейчас? Это ваша работа? Вы точно ее писали?

    Reply
  3. BigB

    Для чего нужна вкладка параметры — если КодНГ=»100199″; можно указать во вкладке «Код»?

    Reply
  4. MaxDavid

    Значит, так. Сдается мне, что вы, батенька, выложили чужую обработку без указания авторства. Минусую. Чего и всем советую.

    Reply
  5. BigB

    (4) У другой публикации автора тоже в заголовке указано Life1C.ru, так что вполне может быть, что ваши подозрения напрасны.

    Reply
  6. MaxDavid

    (5) BigB,

    У другой публикации автора тоже в заголовке указано Life1C.ru, так что вполне может быть, что ваши подозрения напрасны.

    Я готов извиниться, если неправ. Меня смущают следующие моменты.

    1) Автор топика зарегистрировался недавно. Не думаю, что хозяин сайта Life1C.ru столько времени занимался бы 1С, а решение о регистрации на Инфостарте принял бы лишь месяц назад.

    2) В профиле автора ничто не указывает на лайф1с.ру, хотя стандартная практика инфостартовцев, имеющих сайт, тем более профильный — указать его.

    3) Текст — прямая копипаста. Обычно, если перепечатку делает автор, он что-то добавляет, изменяет etc., тем более спустя полгода после первоначальной версии. В данном случае я этого не вижу.

    То, что и в другой публикации в заголовке указан тот же ресурс, не является доказательством того, что автор топика — это и есть автор разработок.

    Reply
  7. Yashazz

    Где-то я уже это видел…

    Полюбому, баян страшенный, такое мы все ещё лет 5-7 назад делали…

    Вот если автор готов сделать с такой же цветовой разметкой текста кода, но на УФ, или если сделает, чтоб это работало под веб-клиентом — тогда будет что обсуждать.

    Reply
  8. thelans

    Не думал, что моя обработка вызовет такую дискуссию, причём не по самой обработке, а по выяснению авторства. Готов развеять ваши сомнения.

    Данную обработку я написал сам «с нуля», т.к. самому надо было средство для тестирования кода в пользовательском режиме без применения отладчика.

    В заголовке обработки я поставил своё авторство Life1C.Ru, т.к. являюсь автором одноимённого сайта, где в разделе «Полезное» размещена эта же обработка для скачивания.

    Сайт я создал давно и давно начал заполнять его, но на Инфостарте зарегистрировался действительно недавно, т.к. до этого не было такой необходимости.

    Reply
  9. thelans

    (3) BigB,

    Для чего нужна вкладка параметры — если КодНГ=»100199″; можно указать во вкладке «Код»?

    Этот параметр КодНГ=»100199″ как пример. На вкладку «Параметры» можно добавлять, к примеру, параметры-ссылки на справочники или документы.

    Reply
  10. thelans

    (7) Yashazz,

    Полюбому, баян страшенный, такое мы все ещё лет 5-7 назад делали…

    Обработку писал для себя, не смотрел что есть у других, поэтому конечно это как ещё один вариант реализации.

    Вот если автор готов сделать с такой же цветовой разметкой текста кода, но на УФ…

    Сделать её под управляемые формы — хорошая идея, возможно следующая версия будет под УФ.

    Reply
  11. MaxDavid

    (8) я обязан извиниться — видимо, я действительно сделал слишком поспешные выводы. Если все обстоит так, как вы написали — то я ошибался в вашей оценке. Минус снимаю и еще раз приношу свои извинения.

    Reply
  12. Yashazz

    (10) Я делал двумя путями: одну как «табло», даже внешне один к одному (кажись, это не выкладывал); и другую — как подсистему, где есть справочник «Алгоритмы», поименованные куски кода, чем-то похоже (эта вроде лежит на ИС). Ну и в разных других модулях всегда делаю закладку для исполнения произвольного кода.

    Если сделаете под веб-клиент чисто средствами 1С — с меня магарыч)))

    Reply
  13. vec435

    посмотри еще http://infostart.ru/public/119661/ и комментарии, может будет полезно

    Reply
  14. thelans

    (13) vec435, Да, действительно полезно при отладке, но мне пока не пригодится.

    Reply
  15. alexey_kurdyukov

    Мобильные Инструменты Разработчика? Запросник?

    Reply
  16. thelans

    (15) alexnecro, Запросник, описанный в статье http://infostart.ru/public/72969/ и его выполнение алгоритмов используется ведь только для тестирования запросов.

    Reply

Leave a Comment

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