Полезные процедуры работы с AD




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

20 Comments

  1. coder1cv8

    Ничего нового для себя не увидел 🙂

    ЗЫ: Мой вариант получения почты 1С-ного пользователя:

    Функция ПолучитьMailПоПользователю(СсылкаПользователь)

    Адрес=»»;

    ПользовательИБ=ПользователиИнформационнойБазы.НайтиПоИмени(СокрЛП(СсылкаПользователь.Код));

    Если ПользовательИБ<>Неопределено Тогда

    Если ПользовательИБ.АутентификацияОС Тогда

    ПользовательОС=СтрЗаменить(ПользовательИБ.ПользовательОС,»»,»/»);

    Попытка

    ЮзерАД=ПолучитьCOMОбъект(«WinNT:»+ПользовательОС+»,user»);

    LDAP=ПолучитьCOMОбъект(«LDAP://CN=»+ЮзерАД.FullName+»,OU=Common Users,OU=Regular Users,DC=»+Домен+»,DC=local»);

    Адрес=LDAP.Mail;

    Исключение

    КонецПопытки;

    КонецЕсли;

    КонецЕсли;

    Возврат Адрес;

    КонецФункции

    Reply
  2. JohnyDeath

    +

    еще б «ВыполнитьКоманду» на удаленном компе.

    Reply
  3. vde69

    (1) я не претендую на гениальность, просто будет ссылка куда удобно тыкать ламеров 🙂

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

    Reply
  4. coder1cv8

    (2)+1

    Добавил бы хоть пример с Create() процесса через WMI на удаленной машине! 🙂

    (3) да, хороший сборник бы не помешал… А то одна фиксиновская библиотека была, на которую и смотреть-то страшно, ни то что использовать! ) Но я слышал 1С сподобилась наконец-то создать свою «библиотеку функций» в виде конфигурации…

    Reply
  5. JohnyDeath

    (3) Лучше, наверное, не конфу, а какой-нить chm.

    Также удаленный ребут не помешал бы, а то каждый раз ищу в торопях )

    Reply
  6. Трактор

    (4) >> слышал 1С сподобилась наконец-то создать свою «библиотеку функций» в виде конфигурации

    Называется «Библиотека стандартных подсистем и методики разработки прикладных решений » Но я её не видел.

    Reply
  7. JohnyDeath

    ПолуОФФ.

    А как вообще люди смотрят на PowerShell? С PowerGUI http://www.powergui.org/index.jspa (и набором скриптов и библиотек) вообще хорошо смотрится

    Reply
  8. vde69

    (5) в САБЖЕ есть удаленное убитие процесса, что практическое значение имеет такоеже 🙂

    (4) я сборник хочу сделать на DBF-е с внешней DLL-ой которая бы внедрялась в память конфигуратора, и вызывалась по горячей клавише, кроме того я хочу туда внедрить механизм компановки общих модулей (с корректировкой всех вызовов), и еще подпись хешем всех функций и на этом основании проверку версий функций в конфигурации, и еще подпись авторами своих функций, и еще блекджет со шлюхами 🙂

    Reply
  9. coder1cv8

    (7) Вещь интересная, но лично я не понимаю преимуществ перед тем же AutoIt… Ну да PowerShell работает с объектами .Net, но AutoIt зато компилируется в exe-шники!

    Вот кроме этой интеграции с .Net и похвастаться то нечем! Простой доступ к WMI? Так и через COM там ничего сложного нету… К тому же любителям командной строки, можно wmic для этих целей юзать…

    В общем, для себя, как человека не знакомого с Net Framework, не вижу задач в которых PowerShell лучше др. инструментов…

    ЗЫ: IDE для AutoIt нет нормальной, это грустно…

    Reply
  10. vde69

    мне понравилось StarUML жаль его не прикрутить к 1с

    Reply
  11. JohnyDeath

    (9) PowerShell в новых виндах стоит по умолчанию, поэтому не надо устанавливать сторонние программки. Ну и то, что PowerShell не компилирует exe — не большой минус ИМХО

    Reply
  12. coder1cv8

    (11) У меня вот ХР SP2, нужно установить целых две программы: сам PowerShell и Net Framework…

    Но вообще-то я PowerShell не ругаю, хочу заметить! Наверняка удобный инструмент для тех кто активно использует Net Framework… Ну и мелкие фишки понравились, типа вывода результата в html…

    Reply
  13. sound

    еще туда же про искченджь (прости господи) надо функций понапихать

    Reply
  14. Арчибальд

    Попытаюсь ответить на вапрос, заданный у конкурента.

    1. Выложено в выходные. Пока народ ко вторнику проснулся…

    2. РАБОТАТЬ с АД мало кому нужно. А структуру знать хочется…

    3. Букав поменьше бы надо…

    4. Народ изголодался, пока сайт стоял.

    Reply
  15. Istur

    Если кого тема интересует более широко, то читайте книгу Андрея Михайлова «Системное программирование».

    Reply
  16. echo77

    (5) Удаленный ребут — это:

    Код
    ЗапуститьПриложение("shutdown /m "+ИмяМашины+" /r /t 0",,);

    Показать полностью

    Reply
  17. Моха

    (15) Блин 🙂 , не заметил твой пост :).

    Reply
  18. Моха

    В тему.

    Есть еще книжка Михайлова по системному программированию в 1С. Я ее мельком смотрел только. Но по ходу и туда можно тыкать :).

    Reply
  19. ZERO_

    (16)

    Ну, можно еще, убить lsass.exe 😎

    Reply
  20. Тихоход

    Домен.Код подскажите пожалуйста как получить?

    Reply

Leave a Comment

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