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




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

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

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

<?php // Полная загрузка сервисных книжек, создан 2026-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 не будет опубликован. Обязательные поля помечены *