User Commander for v.7




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

39 Comments

  1. mdzen

    +1 Класс!

    Еще бы такую вещь, чтоб права пользователей редактировать

    Reply
  2. support

    +1

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

    Reply
  3. yu

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

    Reply
  4. Только хотел написать, а автор уже озвучил…!

    полезная фича.

    просто, без излишеств.

    +1

    ..

    а вот еще предложения (вдруг пригодятся)

    1. а типа удалять из реестра ссылки на несуществующие базы?

    2. импорт-экспорт списка баз (возможно с подменой части пути — типа вместо диска Д поставить диск Е

    3. импорт-экспорт списка юзеров.

    ???

    Reply
  5. CheBurator

    Как это я умудрился под анонимусом…?

    Reply
  6. antonrost

    При запуске выскакивает окошко с надписью «EAccessViolation» и на этом всё заканчивается.

    Reply
  7. yu

    Возможно имели место длинные пути к информационным базам. Увеличил буферы, обновил.

    Reply
  8. antonrost

    Не помогло. Самый длинный путь — 44 символа.

    Reply
  9. antonrost

    Попробовал зайти с правами Админа — пишет: «Invalid Index.

    Reply
  10. yu

    Invalid Index поправил. Возникал когда баз нет. Обновил.

    Reply
  11. antonrost

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

    Если базы есть, то по прежнему «EAccessViolation». Что я делаю не так ?

    ===========

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

    Reply
  12. CheBurator

    Только что скачал — у меня все ОК.

    Reply
  13. antonrost

    А у меня так и не работает 🙁

    Reply
  14. yu

    Напиши мне на почту myhasp@mail.ru, пришлю отладочную версию

    Reply
  15. antonrost

    Написал. Если не прийдет — пож. стукнись в аську 200709902

    Reply
  16. yu

    Обновил. Добавлен функционал монитора пользователей.

    Reply
  17. Офигенна то что я полдня искал =)

    Обнаруженный баг: если в базе кривой userdef то она по английски вываливается, хоть бы написала чего =\r

    Однако СПАСИБО!!!

    Reply
  18. yu

    Если не затруднит, пришлите users.usr на котором программа падает на myhasp@mail.ru

    Reply
  19. antonrost

    Небольшой прогресс:

    Теперь пишет вот такое:

    http://infostart.ru/file.php?0,file=44

    Reply
  20. sheltem

    Отлично!!!!! особенно со сменой пароля…. иногда тяжко лезть в конфу чтобы поменять пароль.

    Если бы добавить сюда еще и смену имени пользователя, то было бы савсем хорошо.

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

    Reply
  21. magvay_k

    Это прога убивает все настройки SQL base, при смене пароля пользователю

    Reply
  22. yu

    Обновил файл.

    Текущая версия v.0.928. Исправлены 2 ошибки:

    1)теперь для SQL баз настройки подключения не убиваются

    2) Нашел вариант когда программа падала при чтении параметров users.usr (Вероятно этот вариант и был у AntonRost)

    Reply
  23. vasilykushnir

    +1

    Слов нет — одни выражения (в смысле хорошие, не моя вина, что у нас и хорошее и плохое привыкли выражать одними и теми же словами…).

    Будем ждать расширения функционала.

    Reply
  24. antonrost

    Не-а. Так по-прежнему и выскакивает «EAccessViolation.»

    :(((

    Чем я прогневился :))) ???

    Reply
  25. yu

    Пришли users.usr от базы на которой падает на myhasp@mail.ru, поймать-то надо

    Reply
  26. yu

    AntonRost — понял в чем дело после того как посмотрел твой users.usr 😉

    Обновил usrcomm.rar, больше у тебя падать не должна

    Reply
  27. antonrost

    Спасибо. Теперь со спокойной душой +1

    Reply
  28. antonrost

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

    Reply
  29. yu

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

    Reply
  30. ytrewqwerty

    КРУТО! Рейтинг поставил.

    Вот бы еще бы приделать действие типа «выгнать пользователя из базы».

    Но это скорее невозможно.

    Но!

    Полагаю нетрудно было бы В списке монитора пользователей бы добавить действие к конкретному пользователю:

    net send «_Имя компьютера» «_Сообщение»

    или

    net send «_Имя компьютера» «СРОЧНО ВЫЙДИ ИЗ БАЗЫ! ИЗ_ЗА ТЕБЯ СТОИМ!»

    Ну и на основе этого, также сообщение для всей базы:

    net send «_Имя компьютера» «Просьба покинуть базу _Название Базы»

    Чтобы не кидать по сетке сообщение для всех (net send *), а только тем кому надо!

    Это былобы Ваще круто!

    Reply
  31. Можно сделать так чтобы Рядом с именем пользователя показывалось имя компа с которого он сидит (напр. ИвановИИ-bux1) и поменять цветовую гамму (выделять активных пользователей более ярко например красным цветом, а то сейчас иконки активных неактивных пользователей близки по цвету)

    Reply
  32. ReactoR

    Респект…

    Reply
  33. KvazaR

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

    Reply
  34. q_xpress

    Супер! YU, спасибо! Тебе большой РЕСПЕКТ!

    yu, tсли не сложно, сделай пожалуйста, чтобы можно было еще изменять каталог пользователя. У нас каталоги пользователя принято называть Фамилия_ИО. Поэтому когда один чел. уходит, а приходит другой, то надо не только имя и пароль менять, но и каталог.

    Reply
  35. Voldemar

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

    Reply
  36. orsk20390

    функционал слобоват

    Reply
  37. ampro74

    (35)Было бы очень интересно!! Выкладывай!

    Reply
  38. merlin1975

    Прошло 11 лет, а для меня актуально!

    Благодарю.

    Можно ли прикрутить фичу для показа имени компьютера залогиневшегося пользователя для терминального доступа? А то для файлового варианта прекрасно, а для терминальных пользователей — не айс…

    Reply
  39. Gkmy
    Скрытый текст
    Reply

Leave a Comment

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