GetConfMessages — другая реализация идеи А. Кузнецова ConfStat




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

65 Comments

  1. Abadonna

    поправил небольшой глючок

    Reply
  2. Abadonna

    -исправил глюк, связанный с некорректным именем лог-файла при полностью открытом окне внешнего отчета

    (в заголовке появляется полное имя этого отчета);

    — добавил меню «Удалить лог после закрытия»

    Reply
  3. Abadonna

    добавил :

    — просмотр лога из программы

    — железное «убиение» Конфигуратора при необходимости

    — отмену ведения лог-файла при запуске с ключом -nolog

    Reply
  4. VV

    Млодца, ничего не скажешь! А с убийством окон — никак?

    Reply
  5. Abadonna

    >А с убийством окон — никак?

    Дурная черта моего характера — не люблю возвращаться к прошедшему 🙁

    Как-нибудь соберусь и сделаю контроль модальных окон 1С на новом принципе

    Reply
  6. VV

    Ага, я так и понял: сделал — потерял интерес. Но ты уж займись, плз, больно штука нужная.

    Reply
  7. CheBurator

    при старте проги дает I/О error 123? жмешь ок — мессага закрывается,

    зелененькое окошко висит, при ТиИ ничего в нем не отображается…

    ???

    Reply
  8. Abadonna

    >старте проги дает I/О error 123

    Такое было, когда при старте был во весь экран развернут внешний отчет и в заголовок Конфигуратора помещался его полный путь, но я поправил. Правда, наверное, забыл, если открыт, например, текстовый файл. Запускай, когда открытые файлы не во весь экран. И кинь мне картинку, когда у тебя это произошло

    Reply
  9. Abadonna

    Внимание! В случае с Че у него в идентификаторе конфигурации (т.е. и в заголовке окна Конфигуратора)

    имелось аж такое: Конфигуратор — <ляля 2005-12.06.07> Торговля +Склад, … и т.п.

    Винда не захотела принять такое имя файла. Пока рекомендую в таких случаях запускать с ключом -nolog,

    а я подумаю, как этого избежать

    Reply
  10. CheBurator

    1. аффтару расказан метод как избежать бяк в имени файла, а не гнать на правильные идентификаторы конфигураций.

    2. предложено в лог писать не только сообщения, но и их время (или время их перехвата)

    ..вот

    Reply
  11. Abadonna

    Чебур, не борзей! Не гнал я идентификаторы, просто не предполагал, что ТАКИЕ можно зафигачить.

    Время у меня было, потом убрал, но раз хочется- поставлю

    Reply
  12. Abadonna

    Сделал замену ВСЕХ знаков препинания из заголовка Конфигуратора на пробелы при формировании имени лог-файла. Теперь, по идее, имя лог-файла всегда должно быть корректным

    Reply
  13. VV

    Аффтар 🙂 — у тов. Че хорошая мысля: предложено в лог писать не только сообщения, но и их время (или время их перехвата)

    Как насчет?

    Reply
  14. Abadonna

    >сообщения, но и их время (или время их перехвата)

    >Как насчет?

    Вообще-то оно уже пишется, только дата-время стоит не в начале строчки, а конце, а то меня в глазах рябит, если оно в начале 😉

    Reply
  15. vasilykushnir

    +1

    Гламурненько, ничего не скажешь…

    Reply
  16. CheBurator

    По хорошему вместо пробелов в имени файла надо поставить «_» — неудобно потом это имя юзать в качестве аргумента командной строки.

    И раз уж для народа весчь сделана — ну поставьте время в начало строки!

    Reply
  17. Abadonna

    Подумал — а чего мелочиться! Статус окно 1С точно такое же, как и окно Конфигуратора.

    Добавил файл ICStatusLine.exe, который работает и с окном Конфигуратора, и с окном 1С

    Всё то же самое, единственное отличие — программа закрывается если нет ни одного окна для контроля. Возможное применение: при работе сложного отчета можно не заботиться о его лог-файле, а выводить через Состояние(). А лог программа сделает

    Reply
  18. CheBurator

    > Возможное применение: при работе сложного отчета можно не заботиться о его лог-файле, а выводить через Состояние(). А лог программа сделает

    ..

    тоже нормально…

    а еще бы тупо грабила окно сообщений (см. 1spy.dll) — ваще хорошо было бы..

    ниче програмить дополнительно не надо! по шедулеру запустилось ноччу восстановление ГП — а утром в лог посмотрел и все видно…

    !!!

    кстати! имена файлов логов надо «делить» по времени?

    т.е. если 3 раза запускал конфигуратор — для каждого запуска свой файл лога (с временем-датой в префиксе файла) или общий? или перезапись?

    Reply
  19. Abadonna

    Обнаружился глючок в ICStatusLine.exe (странно, но вчера вроде проверял…) — если нет окна для контроля пытается писать в несуществующий файл и выдает I/O error.

    Запускайте пока только после открытия окна 1С или Конфигуратора. Сейчас поправить не могу, код на работу не взял

    Reply
  20. Abadonna

    >а еще бы тупо грабила окно сообщений (см. 1spy.dll) — ващ

    Грабить окно сообщений через хук не получится, 1С туда кладет сообщения своим методом через BkEnd.dll. А. Кузнецов сделать обещал.

    Может мы с ним потом как-нибудь объединим в один флакон.

    А, по большому счету, если не использовать ЗавершитьРаботуСистемы(), то и грабить незачем, сообщения-то в этом окне никуда не деваются, в отличие от статус строки

    Reply
  21. VV

    >>о и грабить незачем

    Так не скажи, к примеру, запускаю я удаленно или вечером что-то, что и в окно сообщений выводит. К примеру — ТИ, без И 🙂 А в 6 утра твоей же убивалкой сношу все процессы, чтобы пришедшие люди приступили к работе вовремя. Вот тут лог сообщений сильно помог бы.

    Reply
  22. Abadonna

    >Так не скажи, к примеру,

    Я ж написал если не использовать ЗавершитьРаботуСистемы()

    А в BkEnd.dll иеня лучше не пущать, я ж туда по хакерски полезу, не перехватывать функции начну, а подменять 😉

    ———————————————————————————

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

    Обновление будет через пару минут после этого комментария

    Reply
  23. VV

    Да ты пиши хоть как 🙂 , но в Конфигураторе при ТИИ и последующем срубании процесса ЗавершитьРаботуСистемы() не используется :)))

    А как ты выведешь сообщения — мне по барабану, хоть хук, хоть хак — лишь бы було. Не всегда нужно, то, что сделано — уже класс! но всегда хочется большего. А то опять бросишь прогу и все…. 🙁

    Reply
  24. Abadonna

    >А то опять бросишь прогу и все…. 🙁

    А я уж наигрался 🙂

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

    Reply
  25. VV

    Лень-то лень, но когда пофигуратор начинает пересчет спр.Номенклатура с 30 000 элементов — в аут уходит надолго. И хочется знать — живой он вообще или как? Не говоря про ТИИ 3,5Г базы дбф….

    Reply
  26. Abadonna

    >но когда пофигуратор начинает пересчет спр.Номенклатура с 30 000 эл

    Тут все от изначального порядка происходит. У меня на заводе и полмиллиона справочники были (детальки)

    Запускаешь себе на терминале, и делай на своем компе, что хошь. А а дбф на 3 Гига — ужасть!

    Я даже отладку на сиквеле делаю

    Reply
  27. VV

    Ну, молодца! Я тож в терминале запускаю, но при подлключении к сеансу фокус уже ушел и конфигуратор в дауне.

    Кстати, проверил прогу в боевых условиях: I/O error 123. Сначала все сделал в конфигураторе, сохранить — запуск проги — глюк. А Кузнецовская — работает, хоть и не такая кпасивая и без лога 🙁 Есть над чем поработать.

    Reply
  28. CheBurator

    Афтар! исправь уже I/O error 123!!!

    а то на ламера похож.. 😉

    Reply
  29. Abadonna

    Чебур, ты смеешься? Поправил глюк — нет его!

    Или вчера не обновилось на сайте?

    Reply
  30. Abadonna

    Ну не знаю. Обновил еще раз, скачал с сайта — нет глюка

    Reply
  31. Abadonna

    Народ, прощу прощения. Случилось то, что бывает, когда сразу несколько файлов правишь.

    Положил в архив исправленную на предмет некорректного имени файла лога ICStatusLine.exe и старую версию GetConfMessages.exe (в некоторых случаях появляется I/O error). Учитывая, что ICStatusLine.exe более универсальна, GetConfMessages.exe вообще истребляю из архива

    Reply
  32. Abadonna

    Обнаружил не предусмотренный мной баг: если после начала контроля менялся заголовок окна (например в Конфигураторе открыли документ) — хук-библиотека теряла окно, в которое надо возвращать статус-строку.

    Поправил.

    Не любят нас 1С-ники: мало того, что классы окон «плавают», так еще и заголовки 😉

    Reply
  33. VV

    Аффтар, тибе зачот! На выходных испытаю!

    Reply
  34. CheBurator

    блина, вы меня удивляете…

    > так еще и заголовки 😉

    я не спец, поэтому может бред несу…

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

    ???

    Reply
  35. Abadonna

    2Сhe Burashka.

    Ну как бы попроще объяснить? Вначале была тьма, потом Бог отделил свет от тьмы, потом появились компьютеры… 😉

    Разговор шел не о том, что терялось контролируемое окно, а о том, что хук терял свое «родное» окно, продолжая при этом контроль, как положено.

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

    А по слову Конфигуратор ловить контролируемое окно бессмысленно, т.к. я ловлю и окна самой 1С, где такого слова и близко нет

    Reply
  36. vasilykushnir

    А все-таки вещица весьма пользительная. Вчера запустил загрузку базы (подозрение, что ей потихоньку чернобурка приснилась). 1С почти сразу потухла — а эта штуковина исправно выдает строку состояния.

    Огромное спасибо и Кузнецову, и Абадонне.

    Reply
  37. Abadonna

    Забавно получается: пишешь для других, а потом и самому надо 😉

    Запустил тестирование и исправление старой заводской базы (размер офигенный), Конфигуратор белий-белий (только, что не горячий), а приблуда справно кажет, что он там творит 🙂

    Reply
  38. CheBurator

    в свойствах запуска 1С поставить режим совместимости с w2k — будет и без до.приблуд все видно…

    Reply
  39. Abadonna

    А лог?

    Reply
  40. Abadonna

    (38) Не знаю, Серега, щас грузу скуль — ваще никакие окна не обновляются, это вот с большим трудом открыл.

    Сомневаюсь, что совместимость поможет. Идет пересчет бух итогов — комп стоит колом

    Reply
  41. vip

    (38) Кстати, не все йогурты одинаково полезны. Недавно долго искал, почему криво работает драйвер терминала сбора данных. Оказалось дело было именно в поставленном режиме совместимости с W2k.

    Тайная жизнь микросхем…

    Reply
  42. support

    А можно сделать так, чтобы при сворачивании 1С, окно статуса этой программы оставалось раскрытым?

    Reply
  43. Abadonna

    Так оно и не сворачивается, оно не дочка — вполне самостоятельное окно.

    Перевод окна Конфигуратора «вверх» предназначен только для случая, когда надо контролировать несколько Конфигураторов одновременно, если запущен только один, она его «схватит» в независимости, на первом он плане или нет, свернут или развернут…

    Другое дело: может быть добавить ждущий режим? Сейчас при отсутствии какого-либо Конфигуратора программа закрывается

    Reply
  44. O-Planet

    Вот кто глюк 1С-ный такой замечал? Если долго 1С думает над пересчетом регистров (от 1-2 часов), и если в какой-то момент мышь убрать с окна 1С даже на кнопку Пуск — процесс думания мгновенно подвисает. Я натыкался на это в нескольких разных местах, и под 90, и под ХП, и под 2000.

    Reply
  45. poppy

    (44)

    >процесс думания мгновенно подвисает

    Ты уверен, Планет, что именно процесс думания подвисает?

    Чебур тоже похожую лажу пропагандировал, но его бысто обламали.

    Reply
  46. Abadonna

    (44) процесс «думания» не подвисает, просто у винды не хватает ресурсов для штатного обновления окон. Если окну программно не задано принудительное обновление того же статус-бара (что в 7-ке так и не удосужились сделать: копеечное изменение ваще-то), то и создается впечатление «зависания думания».

    Reply
  47. support

    43) Так если свернуть 1С, то сворачивается и программа, а если развернуть программу, то разворачивается и 1С. А хотелось бы, чтобы они друг от друга не зависели.

    Reply
  48. Abadonna

    (47) Доржи! Да не сворачивается она!!! Она ваще StayOnTop — торчит всегда вверху.

    Слушай, мне уже интересно стало: как ты ее свернуть умудряешься?

    Reply
  49. Abadonna

    +(47) Ты может сворачиваешь терминальное окошко 1С? Тогда конечно свернется, но свернется ВСЁ терминальное окошко вместе со всем содержимым…

    Reply
  50. Dolly_EV

    Я не понял?!?! а где сабж для скачивания?!?! :-(((

    Reply
  51. script

    А можно описать зачем эта программа вообще нужна ?

    Reply
  52. Abadonna

    >А можно описать зачем эта программа вообще нужна ?

    При потере фокуса статус строка конфигуратора и 1С перестает отображаться. Призодиттся гадать, что оно там делает 😉

    Reply
  53. Alav

    Не работает в терминале на 2к3 сервер . Тупо создает кучу файликов с заголовком системы и все. Статусную строку нигде не пишет и не отображает. Хотя http://infostart.ru/public/14645/ работает без проблем

    Reply
  54. wing

    Статусная строка дает недостаточно информации — вот если бы туда же (или в соседний лог) попадали и сообщения из окна сообщений — программа стала бы полноценной.

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

    Reply
  55. avgreen

    (53) Alav, Абсолютно аналогичная ситуация на Win2008R2. Тоже куча файликов с заголовком и ничего более. И тоже под терминалом. На консоли пока не пробовал. Похоже проблема именно в терминальном режиме. У кого еще подобное наблюдается?

    Reply
  56. Abadonna

    (55) avgreen,

    Хоть мне эта 7.7 глубоко фиолетова уже, не поленился проверить.

    Именно терминал (причем, даже не во внутренней сети), именно Windows Server ® 2008 Standard Service Pack 2.

    Смотри картинку.

    Reply
  57. avgreen

    (56) Странно! Может проблема в том что я запускал программу когда выгрузка уже активно работала? У меня выгрузка запускается планировщиком в пакетном режиме.

    А вот кстати в режиме «Предприятия» все нормально отработало. Как раз перед выгрузкой у меня «Предприятие» обменом данных занимается и всё это в одном пакете пускается. Т.е. «Предприятие» отработало и закрылось. Вместе с ним закрылся GetConfMessage (я этот момент пропустил — отвлекся) и сразу-же запустилась выгрузка базы. Я заметил это минут через 10 и пустил новую копию GetConfMessage. Вот она и «зависла» с созданием некоторого количества «пустых» логов.

    Reply
  58. Abadonna

    (57) avgreen,

    Может проблема в том что я запускал программу когда выгрузка уже активно работала?

    Не может, а ИМЕННО поэтому.

    Reply
  59. frlancer

    Отличная штука. Только вот под win8 не запускается. Даже в режиме совместимости. Не подскажите как поюзать это чудо под «плиточной» ОС?

    Уточню: Запускается, но не отображает сообщения строки состояния конфигуратора.

    Reply
  60. Abadonna

    (59) day_light, извини, но однозначно не подскажу. Когда ставил семерку (Windows) даже все исходники к семерке (1С) снёс. Потому что без содрогания об 1С 7.7 даже вспомнить не могу 😉 8.3 — это наш размерчик :)))

    Reply
  61. frlancer

    (60) Спасибо. Уже заработало :). Надо было, поставить режим совместимости, запуск от имени администратора и перезапустить терминальную сессию.

    Reply
  62. Abadonna

    (61) day_light, я рад :))

    Reply
  63. alyuev

    Как пожелание к улучшению:

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

    2) в имя лога добавить бы имя виндового пользователя.

    Reply
  64. vip

    Не улучшит он больше ничего…

    http://forum.infostart.ru/forum1/topic116823/message1500206/#message1500206

    Reply
  65. alyuev

    Вот это да… Прошло мимо меня это событие…. Жаль терять таланты…

    Reply

Leave a Comment

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