Вы ещё крыжите? Вывести список и Сравнение файлов в помощь обыкновенному пользователю.




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

41 Comments

  1. cool.vlad4

    😀 ты крут, нечего сказать

    Reply
  2. cool.vlad4

    а вообще кто не знает, пусть читает…пригодится

    Reply
  3. fishca

    Грустно видеть необходимость такой публикации на инфостарте.

    Reply
  4. fishca

    (0) убрал бы принадлежность к конкретным конфигурациям в публикации, разве не достаточно «документации по 8.х»?

    Reply
  5. Alraune

    (3) Почему? Инфостарт для всех, а не только для специалистов, которые и так все знают.

    Чем больше нужной информации, тем лучше.

    Только жаль, что нет способа как-то четко все публикации классифицировать, потому что в поисках нужного иногда успеваешь забыть, что ищешь.

    Reply
  6. fishca

    (5) потому как элементарные вещи делаются через задний проход. Хотя может и не очень элементарные для кого-то 🙂 .

    Reply
  7. Alraune

    (6)

    fishca пишет:

    Хотя может и не очень элементарные для кого-то

    Вот! Это и имею в виду 🙂

    Reply
  8. artbear

    (0) Цитата: «В результате <…> возможность сравнивания практически любых данных!»

    Подобным сравнением все равно очень неудобно пользоваться, на реальных данных ОЧЕНЬ часто бывает, что находится большое количество различий, хотя на самом деле это не так — например, сдвиг нескольких строк, значений и т.п.

    Reply
  9. anig99

    (8) всё равно удобнее, чем вручную сравнивать или заказывать обработку франчу или фрилансеру.

    Reply
  10. YAN

    А если почитать книжки из коробки, то вообще мега гуру можно стать!

    Reply
  11. anig99

    (10) угу. просто есть порой мелкие вещи с ОГРОМНЫМИ возможностями, о которых в книге есть упоминание, но совсем не раскрывается потенциал и поэтому во время чтения этот момент просто пропускается как незначительный.

    Reply
  12. Qsko

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

    Reply
  13. anig99

    (12) http://infostart.ru/public/71310/

    инструкция по «Сравнить файлы..» в следующем обновлении FAQ для чайниковбудет.

    Reply
  14. kosmo0

    Как и многие второстепенные вещи у фирмы 1С, это сравнение файлов достаточно примитивное и в ряде случаев (например затесалась лишняя строка с похожим началом, после которой остальные строки стали не совпадающими) раздражающее. Поэтому в достаточно сложных случаях рекомендую такие программы сравнивания как Compare It (платная) и KDiff3 (бесплатная).

    Reply
  15. WKBAPKA

    Я почему то раньше считал, что такая возможность, как сравнение файлов, всем известна 🙂 мне бы и в голову не пришло, писать такую статью )

    вот я вчера узнал, но не проверял еще, что оказывается, при сравнении и объединении можно указывать какие процедуры объединять 😮

    вот про это имеет смысл написать… а так, плюс не за что ставить…

    Reply
  16. anig99

    (15) я бы сам себе минус за такую статью поставил (: А вот отдельная обработка по сравнению планов счетов через OLE убила. Пришлось написать ширпотреб.

    А выборочное объединение процедур и функций в модулях — где в одной статье тут проскочило. Но до этого я тоже не использовал эту функцию, хотя вялые её поиски делал.

    Reply
  17. Bux2

    «Вы всё ещё крыжите?»

    Назовите так статью, и обыкновенных пользователей, знающих о такой возможности сравнения, станет больше 🙂 .

    Reply
  18. anig99

    (17) даааааа… Это волшебный глагол «крыжить»…. (:

    Reply
  19. best_girl_best

    Спасибо большое, никогда не задумывалась, но вот прочитала и подумала, что здорово!!!

    Reply
  20. anig99

    (17) а ещё бухи галочки БУ в документе называют «крыжики»

    Reply
  21. ZoFF

    а я уж подумал две разные таблицы по ключевым полям крыжить может )

    Reply
  22. anig99

    (21) если в таблицах оставить только ключевые поля, то может

    Reply
  23. Damian

    А можно еще Total Commander заюзать. Для сравнения текстовых файлов вполне подходит, работает быстрее, чем 1С.

    Таблицы, конечно, сравнить таким образом не удастся.

    Но, опять, таки, таблицы в 1С можно сравнить только MXL. Неудобно.

    Reply
  24. anig99

    (23) тотал командер ставить надо. Ещё БЕСПЛАТНЫЕ варианты сравнения таблиц есть?

    Reply
  25. zztalker

    (24)

    MS Excel с 2010 выпуска есть в Starter Edition — который бесплатный. Отлично сравнивает!

    Но автор молодец, этой штукой тоже можно-нужно и удобно пользоваться.

    Кстати, есть еще прекрасная команда

    FC file1.txt file2.txt

    😉

    Reply
  26. buh1c

    Полезная статья! плюсую!

    Reply
  27. ula1c

    Программисту иногда полезно, бухгалтеру гораздо реже понадобится, т.к. они обычно крыжат данные разные по структуре. Но все равно спасибо за напоминание извествной, но так редко вспоминаемой возможности.

    Reply
  28. fixin

    Рекомендую юзать эту статью вместе с моей обработкой: http://infostart.ru/public/105100/ (пока еще на модерации).

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

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

    Reply
  29. dandrontiy

    (12) Qsko, Полностью согласен. Качественные мануалы для пользователей — великая сила!!!

    Reply
  30. vitalya24

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

    Reply
  31. vitalya24

    уже не первый раз такое встречаю, копипаст и букварь похоже рулят…

    Reply
  32. anig99

    (30) Самого бесит.

    Reply
  33. n_lintek

    Спасибо, за такой ликбез ))) Очень приятно когда есть что-то, что можно использовать сразу . Если не хватит этого , то уже хотя бы будет понятно о чем беседовать с программистом заказывая обработку для себя. Плюс поставила.

    Reply
  34. catena

    Только бы еще указать, что при сравнении таблиц/отчетов они должны быть одинаково отсортированы.

    Но я своих пользователей научила использовать ВПР() в екселе, тоже очень просто, а возможностей больше.

    Reply
  35. EarlyBird

    (31) vitalya24, сделай лицо попроще, а то лопнешь от ЧСВ (чувства собственной важности).

    Прежде чем тратить драгоценное время жизни на «серьезные многочасовые разработки», сначала подумай нужно ли оно кому-нибудь.

    Возможно, проблему можно решить гораздо проще и изящнее, по-новому используя старые известные механизмы (как сделал автор статьи).

    Возможно, вместо серьёзной разработки лучше сводить подругу на прогулку, или попить пивка с друзьями.

    Жизнь очень короткая штука.

    На молодость, пиво и прогулки она даёт всего 5-10 лет.

    Reply
  36. vitalya24

    Я не коим образом не намекал на себя, на инфостарте куча разработок которые валяются никому не нужные с низким рейтингом в то время когда прописные истины которые можно прочитать и в книжке, не уходят долгое время с первой страницы. Какая мотивация будет у пользователей инфостарта (программистов) выкладывать свои разработки, если эти разработки не ценятся и не понимаются, проще тогда заниматься копипастом и радоваться высокому рейтингу, и не думать о том что количество толковых людей и их знаний уходят с инфостарта или туда где их будут ценить или вообще забьют делится чем-либо…Как такая перспектива?

    Reply
  37. vitalya24

    Думаю лучше всетаки пользователю иногда самому разобраться с существующими механизмами 1с, а не глотать разжеванное, не думая вообще. А потом мы говорим что пользователи не умеют думать…Мы их к этому и толкаем…

    Reply
  38. mari0210

    сравнение файлов вещь очень клевая…но мне не удобно , что нельзя править полученную таблицу …она закрыта от редактирования что та , что другая…..сохраняется без цветов…т.е. без нужного эффекта…а хотелось бы прямо на месте отредактировать и распечатать.. есть ли возможность создания таких таблиц с открытой возможностью редактирования? или принципиально- нет????спасибо)))

    Reply
  39. katavyjob

    Извиняюсь, конечно, но в TotalCommander этот функционал гораздо лучше реализован, там подсветка еще и отличий самих есть, а это гораздо удобнее при наличии нескольких столбцов при сравнении

    Reply
  40. anig99

    (39) кто ж спорит, что сторонние программы могут быть лучше. Но не всех пользователей можно научить чему-то кроме основной рабочей программы. Да и действий мышкой больше выходит.

    Reply
  41. sidorov8

    (38) mari0210, Если Вы имеете в виду редактировать при открытом окне сравнения, то нет…

    Статья полезна для пользователей (что кстати отражено в заголовке)

    По опыту 90-99% пользователей не знают о такой возможности

    А для программистов — неплохо бы упомянуть в статье об объекте «СравнениеФайлов», тоже не все знают об этом 🙂

    Даже написал однажды процедурку, в которую передаются 2 табличных документа, и она показывает окно сравнения — иногда удобно при доработке отчетов быстро сравнить исходный и измененный результаты отчетов

    Reply

Leave a Comment

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