Использование визуальных (ActiveX) компонент в тонком клиенте 1С 8.2




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

58 Comments

  1. Душелов

    Слушаю идеи и предложения 😉

    Reply
  2. Русский

    (1) А реально будет: редактирование mxl средствами Excel?

    Reply
  3. Душелов

    (2) Ничего не понял…

    Reply
  4. Русский

    (3) Можно ли сделать редактирование табличных документов 1С при помощи Excel? Ну, скажем, макетов для отчетов?

    Reply
  5. Душелов

    (4) К теме данной статьи это не относится, но конверторы mxl2xls и обратно существуют.

    Reply
  6. kadr

    В статье рассмотрен вопрос об управлении ВК из 1С.

    А есть ли наработки по управлению приложением из ВК на базе ActiveX?

    Ну к примеру получить Контрагентов текущей БД и вывести их в форму html.

    Reply
  7. akkvamarin

    полезно и на заметку

    Reply
  8. Душелов

    (6) А что там сложного? Обычное ком-соединение.

    Reply
  9. kadr

    Можно испросить пример как получить контекст приложения, загрузившего ВК из ВК?

    Reply
  10. Душелов

    (9) В шаблонах 1С реализовано через указатель на интерфейс 1С: http://www.asd-dnepr.com/v82vkomponent.html#_cpp_intf_comp

    В ActiveX-ах только новым com-соединением к базе.

    Reply
  11. kadr

    Спасибо.

    Реально помогли.

    Reply
  12. afanasko

    Интересно.

    А что насчет файрфокса? Слышал что у 1С новый метод реализации внешних компонент: не АктивИкс, а NativeAPI. Не ковырял еще?

    Reply
  13. nikolega

    Обратите внимание как автор себя любит 🙂

    Dushelov.VectorDrawing1C.dll#Душелов.VectorDrawing
    Reply
  14. vip

    (13) Обращаем.

    Любит себя вполне заслуженно.

    Абсолютно нормально. Ненормально #nikolega.ОчереднойПеренумератор

    Reply
  15. Душелов

    (12) >не АктивИкс, а NativeAPI

    Не верно сказано ;), правильнее не COM, а NativeAPI.

    Это всего лишь технология подключения ВК к 1С, не визуальная (пример — формирование штрихкода, на макете в 8.2 уже нет объекта компоненты, как было в 8.1, а ВК формирует картинку и вставляется на форму).

    А визуально — только ActiveX

    (13) А в чем проблема?

    Reply
  16. larisab

    (14) Ха, любить себя можно и незаслуженно, как и вообще любить 😉

    (13) Мало того, мы его тоже любим 🙂

    Reply
  17. vip

    (14+) Программеру добиться признания в среде программеров (я не об адынэснегах) практически невозможно. Каждый считает себя творцом, единственным и неповторимым.

    В данном случае г-н Душелов этого заслуженно добился.

    Чего и вам искренне желаем.

    Reply
  18. Abadonna

    (0)

    русские называния событий IE не видит, как побороть — пока не знаю

    А я знаю! 😀 У меня ни в одной ВК нет русского названия

    Reply
  19. Душелов

    (18) Я делал русскими, чтобы на форме в конфигураторе были «нормальные» (привычные) названия свойств и событий 😉 Видимо, придется дублировать…

    Reply
  20. eiffil
    1. На веб-сервере выкладываем файлы компоненты и html-страницу для инициализации объекта компоненты. (примеры файлов приложены к статье)

    А без вэб-сервера нельзя обойтись??? Это IIS???

    Reply
  21. Душелов

    А какой смысл в тонком клиенте без вебсервера?

    Reply
  22. eiffil

    может смысла и не много, хотя где-то прочитал в 1С-ной литературе, что предпочтительней выбирать тонкий клиент. Но вся проблема в том, что в управляемом приложении (хоть даже толстый клиент) так просто не кинешь элемент управления ActiveX на форму…

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

    Reply
  23. Душелов

    (22) Такого сделать не возможно.

    Reply
  24. Душелов

    +(23)

    А в чем проблема настроить вебсервер или расшарить папку в сети и грузить html вида \192.168.0.1components.html ?

    Reply
  25. eiffil

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

    Не похоже, что это так и должно быть 😐 . В чем может быть косяк?

    Reply
  26. Душелов

    (25) Не хватает прав. Эксплорер блокирует активикс.

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

    (В IE — меню «Сервис» — «Свойства обозревателя» — закладка «Безопасность» — зона «Надежные узлы»)

    и проверяем уровень безопасности для этой зоны (должно быть разрешено использование ActiveX).»

    Reply
  27. eiffil

    не помогло… м.б. что-то в настройках веб-сервера надо сделать???

    Reply
  28. Душелов

    (27) Если есть возможность скачать dll по ссылке, то с веб-сервером все нормально. А у эксплорера стот еще указать разрешение на выполнение .Net кода. вообщем, ради эксперимента стоит вообще поставить все в «разрешено» и поиграться настройками.

    Reply
  29. eiffil

    В эксплорере уже выставил се по максимуму. При попытке сохранить с сервера файл Dushelov.VectorDrawing1C.dll он выдает ему такое содержимое:

    <html><head><title>Error</title></head><body>Не найдена указанная процедура. </body></html>

    Отсюда и получался фрейм, как на скриншоте

    Reply
  30. Душелов

    (29) А в 8.1 эта компонента работает?

    Reply
  31. eiffil

    сделал обычную (неуправляемую 8.2) форму, туда кинул контрол активХ — работает.

    Что-то мне подсказывает, что в вэб-сервере настройки безопасности не дают выполниться dll-ке… Эх, как любят центральные 1С-ники усложнять жизнь…

    Reply
  32. Душелов

    (31) Это не 1С-ники, это технология. Как же еще та же компонента будет работать в веб-клиенте? Там на форму ничего не кинешь.

    А настройки безопасности не в веб-сервере, а именно в эксплорере, от веба главное отдать файл и все.

    Reply
  33. eiffil

    прогресс наступил (мало ли кому пригодится). по материалам похожего вопроса на gotdotnet выяснил, что если для папки в которой лежит dll в настройках стоит

    Execute Permissions: Scripts and Executables

    при этом dll интерпретируется как ISAPI dll, поэтому при обращении к ней она пытается выполниться и в результате выдается ошибка 404: ресурс не найден.

    Для решения проблеммы достаточно убрать разрешение на выполнение для папки в которой лежит контрол…

    Однако контрол всё равно не отоборажается, хотя скачать уже его можно… Буду копать дальше…

    Reply
  34. Душелов

    (33) Ну вот, уже набирается материал для собственной статьи 😉

    Reply
  35. cleaner_it

    (34) А на обычной форме в «толстом» клиенте пробовал визуальные актив-икс компоненты располагать? Что-то поиск молчит по этому поводу, такое чувство что все актив-икс придется располагать в тонких клиентах, и толстые совсем не у дел останутся

    Reply
  36. Душелов

    (34) В управляемых формах? Точно так же.

    Reply
  37. Душелов

    Спасибо sgeneralov за дополнение к статье по настройкам безопасности для .Net Framework’а.

    Reply
  38. Душелов

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

    Reply
  39. sergling

    подскажите почему у меня не работает конструкция

    ОбъектВК = ЭлементВК.contentDocument;

    а работает

    ОбъектВК = ЭлементВК;

    при этом почему то в отладчике не видно реальных методов и свойств объекта, хотя использовать их получается? Основная же моя беда — не находятся события объекта.

    Reply
  40. Душелов

    (39) Вебклиент? Версия платформы какая?

    Reply
  41. Душелов

    (39) и еще, события «не находятся» еще потому, что они могут быть с русскими названиями

    И в отладчике не всегда видны свойства и методы ком-объектов.

    Reply
  42. sergling

    Тонкий клиент, 8.2.10.82, 8.2.11.229

    пробовал свою компоненту, не из статьи

    Reply
  43. sergling

    (41) имена латинскими, мне почему-то кажется что как-то связано с contentDocument, может быть новая версия платформы иначе работает.

    Reply
  44. Душелов

    contentDocument — это ActiveX-объект InternetExplorer’a

    Reply
  45. sergling

    Запустил таки это чудо через тонкий клиент (свой компонент), но вот при попытке старта через web-клиент получаю от браузера «…ФормаУправляемая.Форма(418)}: Поле объекта не обнаружено (url)». Соответственно 418 строка это

    Элементы.ВьюверПоле.Документ.url = «http://localhost/agro.html»;

    как тут быть? У меня IE 8.0.6001.18702, может версия не подходящая?

    Reply
  46. kiba

    У кого-нибудь получилось таким же образом подключить компоненту WebCam.dll тоже от Dushelovа? Все делал по аналогии. Но не работает — черный квадрат и все…

    Reply
  47. minister2007

    dushelov, подскажи, что может быть при web-клиенте «Поле объекта не обнаружено (URL)»? В тонком все «как по маслу».

    Reply
  48. sergling

    У меня и его компонента и моя отлично работают в тонком клиенте. Обновил ИЕ до 8 версии, поставил фреймверк 2 версии, добавил хост в доверенную зону, разрешил для доверенной зоны все.

    Reply
  49. sergling

    Получается что свойство «Документ» поля вида «Поле html Документа» не работает в веб-клиенте, во всяком случае его тип не определен, по документации такое св-во доступно только в толстом клиенте. Однако успешно использует в тонком.

    Reply
  50. sergling

    св-во «документ» не доступно в обработчике при открытии формы в веб-клиенте, после открытия пожалуйста…

    Reply
  51. Душелов

    Скорее всего при открытии его еще нет, этого документа, точнее его значение равно Null

    Reply
  52. sergling

    Вот это очень сбило с толку, сейчас пытаюсь понять почему в веб-клиенте не работает

    ОбъектВК = ЭлементВК.contentDocument; Нету св-ва contentDocument, т.е. работает такая конструкция ОбъектВК = ЭлементВК, но при этом не получается использовать события активХ элемента.

    Reply
  53. yastreb_220

    а вообще таким образом можно с любой dll -кой работать чтоли??? кто нить пробовал??? напрмер в УТ 11 можно будет покдлючить оборудование ???

    Reply
  54. seermak

    Для заторможенных — на примере: http://infostart.ru/public/16446/ — как такое сделать в 8.2 на если несложно, то на пальцах 🙂

    Reply
  55. l_oleg

    (54) seermak,

    также интересует этот вопрос.

    Уточню: в 8.2 на ТОНКОМ клиенте

    Reply
  56. serpisal

    Интересно, пришлось чутка повозитья ,чтобы разобраться и прикрутить, но это того стоило

    Reply
  57. intrata

    Зарегистрировал Active-X компонент в системе. На форму документа добавил Поле HTML документа.

    При создании на сервере присваиваю переменной даного поля следующий текст:

    <HTML>

    <OBJECT id=ThermalLib classid=clsid:904511D2-5407-4033-8DAD-07B33EC7317E width=0 height=0><PARAM NAME=»»_Version»» VALUE=»»65536″»><PARAM NAME=»»_ExtentX»» VALUE=»»26″»>

    <PARAM NAME=»»_ExtentY»» VALUE=»»26″»>

    <PARAM NAME=»»_StockProps»» VALUE=»»0″»>

    </OBJECT>

    </HTML>

    Запускаю предприятие. При открытии данной формы 1С начинает матюкатся, типа настройки обозревателя не разрешают показывать ActiveX компоненты и все такое.

    Иду в свойства обозревателя. Для зоны «Интернет» Включаю всевозможные настройки Active-X и сценарии.

    Запускаю форму — вуаля, ни на что не ругается, компонента Active-X отлично работает.

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

    Нужно все те настройки включить только для надежных узлов. Но самый сложный вопрос: Какой адрес добавить в надежные узлы??? Промучался. Что только не добавлял. И 904511D2-5407-4033-8DAD-07B33EC7317E добавлял, и clsid:904511D2-5407-4033-8DAD-07B33EC7317E добавлял не работает. Открываю форму — все те же сообщения и 1С виснет намертво.

    Reply
  58. intrata

    Делаю в тонком клиенте

    Reply

Leave a Comment

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