"Захват окон" — ActiveX-компонента для 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='\

64 Comments

  1. Душелов

    Вообщем, режим «АнтиБосс» 😉

    Reply
  2. coder1cv8

    Прикольно! Но бесполезно… )

    А можешь сделать ВК что-бы она выбранное окно принтскринила?… )

    Reply
  3. Душелов

    (2) Ну почему же бесполезно? Я на позапрошлом месте работы использовал аналог для сокрытия оперы, а то когда подходили к компу — много чего левого можно было в заголовках окон увидеть ;)))

    Ну запринтскринить -то можно, если оно открыто, а если закрыто другим приложением, тогда врядли….

    Reply
  4. coder1cv8

    (3) В смысле принтскринить в файл, пофиг, с активизацией окна!…

    Типа так:

    ВК.ПринтскринВФайл(ПИДПроцессаОкна, ПутьКФайлу)

    Но это я так, мечтаю… Кроме плюса предложить нечего )

    А со всякими существующими длл-ками, типа V7ICQ.dll у меня лично, проблемы…

    Reply
  5. Душелов

    (4) Да в целом можно…. Так же по заголовку, активировать его, определить координаты и запринскринить выбранный диапазон.

    Reply
  6. luns

    (0) Ай молодец, сколько интересных идей…

    Reply
  7. CheBurator

    Душелов жжот!

    +1

    .. а закладочки в 7-ке тоже будут?

    .. чат — дорабатывается?

    Reply
  8. Душелов

    (7) С чатом пока взял перерыв… То, на практике его использовал, а чисто теоретически дорабатывать — не интересно…

    Скрин 7.7 сейчас сделаю и выложу.

    Reply
  9. Душелов

    (7) Добавил скрин из 7-ки

    Reply
  10. Hadgehogs

    (4) Чего, Нетленку уже отменили?

    Reply
  11. Душелов

    (10) Это что?

    Reply
  12. Душелов

    Добавил функцию получения скриншота. Пока в таком виде…

    Reply
  13. coder1cv8

    (12) Спасибо. Но, лично мне, по PID-у нужно… )

    (10) Будем смотреть! )

    Reply
  14. Душелов

    (13) Добавил:

    — Получение списка открытых окон — возвращает в виде строки: <title>Заголовок окна</title><pid>Идентификатор процесса</pid><path>Путь к exe-файлу процесса</path>

    — ЗахватитьОкноПоPID(PID);

    — СкриншотПоPID(PID, ПутьКФайлу);

    Reply
  15. coder1cv8

    (14) Класс! Спасибо огромное!!!

    Reply
  16. Душелов

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

    Reply
  17. skom

    )))) вот это прикол под конец раб дня…..

    Антибосс))

    клева…

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

    но идейка зачет

    Reply
  18. skom

    сорри за дубль…два раза даванул. модеры — убейте дубль и этот мессаг плиз

    Reply
  19. cleaner_it

    Когда располагаю на другом в закладке — фокус не устанавливается. Хотя окно «живое» — то есть отображаются все действия. А мышкой тыкнуть не моги. Еще помучаюсь, может у меня косяк

    Reply
  20. cleaner_it

    (20) на другом слое, конечно. в 7.7

    Reply
  21. Душелов

    (20-21) Ок, сейчас при себе исходников нет, дома посмотрю. Проблему воспроизвел.

    Reply
  22. Froloid

    Добрался наконец-то до нужной странички. Душелову однозначно +

    Reply
  23. Душелов

    (23) Это не та 😉

    Reply
  24. Душелов

    (20) что 7-ка, что 8-ка таким образом перехватывают окна, так что победить эту проблему не могу. На других платформах этой проблемы нет.

    Reply
  25. HotShot

    Очень удобная компонента. Каким методом можно автоматически перейти на вновь захваченное окно?

    Reply
  26. Душелов

    (26) Т.е. активировать нужную закладку?

    Reply
  27. Solemn

    (27) ага, и мне тож это нужно очень

    Reply
  28. HotShot

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

    Reply
  29. Душелов

    Добавлено:

    Код
    //МЕНЮ:
      
       ПоказатьМеню();
       СкрытьМеню();
    
    //АКТИВАЦИЯ ОКНА:
    
       АктивироватьОкно(ЗаголовокОкна);
       АктивироватьОкноПоPID(PID);
    

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

    Reply
  30. HotShot

    Спасибо… Буду пробовать.

    Reply
  31. Solemn

    Спасибо

    Reply
  32. HotShot

    Добрый день.

    Дополнительные методы сильно упростили задачу разработки.

    Однако, встала проблема программного закрытия приложения… Возможно ли интегрировать метод закрытия захваченного приложения по PID?

    Reply
  33. Душелов

    Спасибо в стакан не нальешь 😉

    (33) Сейчас напишу метод закрытия окна с восстановлением или без.

    Reply
  34. Душелов

    Написать-то написал… Вот только обновить разработку не могу… 🙁

    Reply
  35. Душелов

    Добавлено:

    Код
    //ЗАКРЫТЬ ОКНО:
    
       ЗакрытьОкно(ЗаголовокОкна);
       ЗакрытьОкноПоPID(PID);
    
    //ВОССТАНОВИТЬ ОКНО:
    
       ВосстановитьОкно(ЗаголовокОкна);
       ВосстановитьОкноПоPID(PID);
    

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

    Скачать пока тут: http://dushelov.ru/1c/WinHost.zip

    Reply
  36. trdm

    А можно на каком-нить менее ресурсоемком фраймверке сделать?

    А то не очень хочется на серваке фраймверки городить?

    Или хоть подсказку какую для имплементации?

    Reply
  37. Душелов

    (37) > можно на каком-нить менее ресурсоемком фраймверке сделать?

    На каком?

    Reply
  38. trdm

    (37)>> можно на каком-нить менее ресурсоемком фраймверке сделать?

    (38)>На каком?

    WTL/ATL например?

    Reply
  39. trdm

    Хоть они и не фраймверки 🙂

    Reply
  40. Душелов

    Для получения демо-версии или покупки обращайтесь по контактам, указанным в профиле.

    Reply
  41. Душелов

    Снова в бесплатном доступе 🙂

    Reply
  42. liooo

    Как определить программно что приложение захвачено компонентой???

    Reply
  43. Abadonna

    (0)»Хотите играть в пасьянс в 1С, смотреть кино или просматривать секретные документы ;)»

    Вась, а что, пасьянс внутри 1С пасьянистее становится? ;))))

    Как проггер понимаю, как юзер — на … оно надо?

    Reply
  44. Душелов

    (43) Храните список захваченых приложений.

    (44) 🙂 иногда надо скрывать лишние окна 😉

    Reply
  45. Abadonna

    Стал быть примерно так?:

    procedure TMiracleClass.CaptureAimp;

    var wnd:hwnd;

    begin

    wnd:=FindWindow(‘TAIMP2Main’,nil);

    if isWindow(wnd) then begin

    SetParent(wnd,h1C);

    end;

    end;

    Могу приватно подарить коды WM_COMMAND для управления Aimp прям из 1С 😉

    Для особых извращенцев :)))))))))

    Reply
  46. liooo

    Abadonna

    Я такой извращенец, а точнее руководство!!! Необходимо запустить эту прогу http://www.thebrain.com/ на форме списка справочника и показать графические связи элементов, а потом изменить данные в 1С, если изменили связи в этой приблуде, так что коды WM_COMMAND для управления Aimp — это для меня 😉

    dushelov

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

    Reply
  47. Душелов

    А что он должен возвращать?

    Reply
  48. liooo

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

    Reply
  49. Abadonna

    (48)>А что он должен возвращать?

    По уму — хэндл ;)))))

    Reply
  50. Душелов

    (50) Скорее ПИД, хэндл для 1С-ы не нужен.

    Reply
  51. Abadonna

    (51) Зато его наличие гарантирует, что захват произошел.

    А на хрена 1С-е PID? Мочить при выходе?

    Reply
  52. Душелов

    (52) У меня методы есть, которые по пиду работают 😉

    Reply
  53. Abadonna

    (53) Хэндл ВСЕГДА PID даст, а вот по PIDу хэндл — сложнее ;)))

    Reply
  54. liooo

    Abadonna

    (46) подари коды WM_COMMAND для управления Aimp прям из 1С

    Reply
  55. cool.vlad4

    (0) Вопрос возник…как это все работает не разбирался…хочется сделать следующую штуку — надоело работать с консолью кода без подсказок. Возникла мысль сделать захват конфигуратора, затем перехват кода, текста и передача в консоль. Поможет ли мне эта ActiveX?

    Reply
  56. yoyoman

    У меня зависает при использовании нескольких вкладок. Если на второй вкладке добавить этот элемент управления, сделать захват. И переключиться на первую вкладку — все вылетает 🙁

    Reply
  57. DimaP

    А можно-ли этой компонентой ловить окна внутри самой 1С?

    Например, стандартные формочки (список значений, ввод значения и т.д.)

    Reply
  58. alyuev

    Вопрос. Как сделать открытие приложения внутри самой 1С? Запомнить ПИДы запущенных приложений до запуска нужного и после запуска найти новое открытое?

    Reply
  59. alyuev

    Я воспользовался твоей компонентой захвата окон — захватываю по имени файла. Работает отлично. Но не могу найти свойство закрытия вкладки програмно. Буду очень признателен за помощь. Спасибо.

    Reply
  60. smaharbA

    мальчоник если чо эта фигня реализовывается и без вк

    Reply
  61. alyuev

    (61) Сотрясение воздуха не приветствуется, а конструктив — да.

    Reply
  62. dagroma

    А кто-нибудь может поделиться последней версией компоненты?

    Reply
  63. Alex_Legacy

    Мало с какими окнами работает

    Reply
  64. leha1904

    Добрый день. У кого-нибудь есть последняя версия компоненты? Заранее премного благодарен.

    Почта — pohomoff@mail.ru

    Reply

Leave a Comment

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