[AgentDialog] Модальные диалоги у MS Agent из 1С




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

34 Comments

  1. Душелов

    Понадобилось на работе организовать помощник ввода документов и проверки данных для совсем «никаких» пользователей.

    MS Agent подошел вполне (поверх окон, дружелюбный вид/интерфейс), но вот интерактивности не хватало, пришлось добавить…

    Другие варианты рассматривал, но они все платные.

    Reply
  2. mirco

    (1) Ну идея супер. Сам пробовал использовать агента и не хватало интерактивности. Саму компоненту еще не посмотрел, =но уже есть вопрос : а у диалогов таймаут есть (или он у стандартного агента уже есть) ?

    Reply
  3. Душелов

    (2) Таймаута не делал, но добавить — не проблема.

    Reply
  4. Душелов

    Добавил примеры для 7.7, 8.1 и 8.2 (на управляемых формах)

    Reply
  5. mirco

    (3) Добавь пожайлуста. И еще а оформление диалогов фиксированное ?

    Reply
  6. Душелов

    (5) А какое оформление нужно? Фон, шрифт, цвет?

    Reply
  7. mirco

    (6) фон.

    Reply
  8. kswsar

    при запуске выводит сообщение

    Ошибка при создании объекта из компоненты <Неизвестная компонента> (отсутствует CLSID)

    Reply
  9. Evg-Lylyk

    сомобъект «Agent.Control.2» вроде дает теже функции. Так?

    Книга «Андрей Михайлов 1С предприятие системное программирование»

    Reply
  10. Константин С.

    Василий, вопрос не по теме, чтож ваш сайт не работает?

    Reply
  11. Душелов

    (9) Нет, не дает. У него в примерах используется демо-версия BalloonDialog 6.5.

    (10) А не нужен он мне 🙂

    Reply
  12. Душелов

    (8) Значит компонента не зарегистрировалась. Если не пользуетесь файловыми менеджерами, то в батнике регистрации пропишите полный путь к dll-ке.

    Reply
  13. Константин С.

    (11) тогда чтож его пиаришь???

    Reply
  14. Evg-Lylyk

    (11) так в чем функциональные отличия?

    Reply
  15. Душелов

    (13) Этот пример описан в книжке.

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

    (14) Я думаю, что надо сравнить. На данном этапе — платность + простота установка. Но уже пошли первые отличия — таймаут диалога. Что не было реализовано в BalloonDialog

    Reply
  16. Душелов

    Добавлено свойство

    — ЦветФона //строка, формата «R,G,B»

    И параметр «Таймаут» (в секундах) в функции «Показать» и «ВвестиТекст» .

    Reply
  17. Saint

    Идея интересная. Жаль только что Microsoft прекратила разработку технологии «MS Agent» и в новых версиях ОС она уже не поддерживается. Например, обновление MS Agent для Windows 7 x64 я так и не нашёл.

    Reply
  18. Душелов

    (17) А тот, что я выложил не подходит?

    Reply
  19. Saint

    (18) Ну, походу оно для Windows 7 x32. Его же я нашёл на сайте Microsoft, где речь шла опять таки только о x32-версии. Тем не менее я попытался установить выложенное тобой обновление. Процесс обновления минут 10 висел в начальной стадии (что-то типа поиска подходящих обновлений), а потом я его прибил, так как надоело ждать.

    Reply
  20. Душелов

    (19) На форумах советую использовать агента от 32-битной версии.

    Попробуй

    Reply
  21. Saint

    (20) Агент то может и 32-х битный, но обновление должно быть именно для 64-х битной версии Windows. Я так думаю. 💡 Хотя файлы в прикреплённом архиве действительно помогли. Оригинальный дистрибутив MS Agent не поддерживает прозрачность у персонажей, а с обновленными файлами всё нормально работает.

    За архив отдельное спасибо. 🙂

    Reply
  22. Sherlock_kmw

    у меня обнаружился баг. если на помощника кликнуть правой кнопкой мыши, то 1С перестает отвечать.

    а так конечно +

    Reply
  23. Душелов

    (22) От компоненты тут вообще ничего не зависит. Попробуйте поиграться со свойством агента «показывать меню» или как-то так…

    Reply
  24. Veduin

    В комплексе с новогодними поздавлениями довольно не плохо выглядит.

    ПРосто и интерсно! +

    Reply
  25. pavlo

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

    Да и грузится он весьма долго!

    Reply
  26. Душелов

    (25) Ну да, можно подключить и «баловаться».

    Выведите, пожалуйста, без компоненты диалоги, аналогичные изображенным на скриншотах.

    Reply
  27. DitriX

    а у меня что то проблемка ))

    1С 8.2 я закрыл, а помощник совсем не исчез а только сидит в углу и смотрит на меня призрено…

    Reply
  28. v.l.

    (0) Таки плюс!

    А можно ли и если да, то как нарисовать своего агента? В смысле шкурку свою прикрутить.

    Reply
  29. Душелов

    (27) Надо на него мышкой ткнуть, он и удалится. 1С-ка, видимо была закрыта аварийно (или прекращена отладка)

    (28) http://www.rsdn.ru/article/multimedia/newchar.xml

    Reply
  30. DitriX

    29) Закрыл нормально, стоит последняя платформа 8.2.

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

    Reply
  31. Душелов

    (30) У меня на 8.2 и на 9 релизе и на 10 — все ок. Советую обновить агента.

    Reply
  32. v.l.

    (29) Спасибо!

    Reply
  33. simol

    При свернутой 1С выскочит?

    Reply
  34. anig99

    (31) а нельзя ли прикрутить к нему выпадающий список, ну или просто список выбора?

    Reply

Leave a Comment

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