1С:TrayManager




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

22 Comments

  1. coder1cv8

    На Проклабе есть подобная, но не совсем мне понравилась, поэтому решил сделать свою 🙂

    Reply
  2. Unstoppable

    Респект и уважуха! Плюсую! Но обнаружился то ли баг, то ли фича 🙂 на дочерние окна конфигуратора 8.1 не переключает.

    Reply
  3. coder1cv8

    (2) Э-э-э… TrayManager отслеживает только основные окна (TopLevelFrame).

    Reply
  4. coder1cv8

    Файл обновлен. Добавлено:

    — Отображение всех скрытых окон, при выходе из TrayManager

    — Всплывающая подсказка с количеством показаных/скрытых окон

    Reply
  5. boln

    Привет! Я — аффтар той разработки на Проклабе, что тебе не понравилась.

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

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

    Есть идея — добавлять прямо из нашей программы порядковый номер в заголовок окна, тогда у окон с одинаковым заголовком будут в заголовке номера: (1), (2) и т.д. Я свою думаю доработать на этот счет.

    С наступающим, коллега!

    Reply
  6. Yasen

    А чем 4-tray minimizer не катит?

    И еще для FAR есть плагин hideunhide

    Reply
  7. boln

    (6)

    http://www.4t-niagara.com/tray.html

    Катит, почему же не катит.

    Однако мы можем и кое-какой специфический для V8 функционал в наши разработки добавить. Как у меня, например:

    http://1c.proclub.ru/modules/mydownloads/personal.php?cid=142&lid=5200

    Reply
  8. coder1cv8

    (5) Спасибо за грамотные замечания, с первым пунктом согласен полностью, на счет второго… Трудность идентификации для пользователя окон с одинаковыми заголовками, ИМХО, неизбежное зло… Мне лично, и цифра рядом с одинаковыми заголовками особо ни о чем не говорит… )

    (6) Всем катит, мне просто было интересно сделать самому…

    Reply
  9. Abadonna

    плюс за «мне просто было интересно сделать самому…»

    Reply
  10. vasilykushnir

    Полностью солидарен ибо «просто было интересно сделать самому…» дорогого стоит.

    boln, извини — не туда плюсик впилял, но, думаю, ты не в обиде…

    Reply
  11. MohnatiyLobster

    вот бы ещё 7.7 сворачивало…

    Reply
  12. coder1cv8

    (11) Я с семеркой и не работал-то почти, к сожалению, а может быть к счастью?… ) Поэтому поддержка 7.7 в данной утилите не планируется, если кому интересно и есть желание доработать этот момент, могу дать исходный код…

    Reply
  13. ProkopyukIN

    На Висте не работает. Сворачивать то сворачивает. А разворачивать не хотит.

    Reply
  14. ProkopyukIN

    Беру свои слова обратно. Все работает если запустить TrayManager ДО 1С. Если сначала запустить 1С — то потом не развернется.

    Reply
  15. coder1cv8

    (13,14) Говорят на Висте есть проблемы с AutoIt-ом (на котором написан скрипт). Если хочешь, дам исходник, сам посмотришь в чем там дело… Мне, к сожалению, проверить не где…

    Reply
  16. ProkopyukIN

    Давай. Попробую посомтреть.

    Reply
  17. coder1cv8

    (16) почту дай…

    Reply
  18. ProkopyukIN
  19. coder1cv8

    (18) Отправил.

    Reply
  20. Yurii463070

    Хорошо бы чтобы можно было настраивать какие именно окна должны сворачиваться. а какие нет. А так… это не очень-то… Виста глючит с этим менеджером безбожно.

    Reply
  21. scream

    добавьте возможность авто скрытия всех окон

    какой либо из версий 1с

    или какой либо базы

    тоесть открывается сразу в трее

    Reply
  22. 1Сgadgets

    А можно сделать так, чтобы в трее было видно появление новой задачи или напоминания для пользователя?

    Reply

Leave a Comment

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