User Commander for v.7




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

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 не будет опубликован. Обязательные поля помечены *