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




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

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