Гиперссылки на форме 7.7




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

42 Comments

  1. iov

    а динамически никак?

    Reply
  2. Noy

    (1) А смысл?

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

    А без коммента плюсик берем?

    Reply
  4. Noy

    (3) не откажусь 😉

    Reply
  5. iov

    (2) например формировать ссылку в модуле (например для онлайн справки как самый простой пример).

    Reply
  6. Ёпрст

    Лень смотреть..

    Чего там за 2 базы — с вк и без…

    Без ВК — это что?

    Reply
  7. Noy

    (5) Добавил функцию:

    ДобавитьСсылку(ЗаголовокРеквизита,ТипСсылки,Ссылка,Лево,Верх,Ширина,Высота,ИмяРеквизита=»»)

    Возвращает идентификатор добавленного реквизита.

    Обновил пример.

    (6) Одна и та же база — просто два архива — один для тех у кого нет этих ВК, другой для тех, кто не хочет качать лишнее.

    Reply
  8. iov

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

    Reply
  9. Noy

    (8) Гляди шире — я себе уже кнопочки на формах меняю (Действия, Подчиненные документы и тп) — место экономится на ура и выглядит лучше.

    Reply
  10. iov

    (9) ну для этого и просил примерно…. Просто в зависимости от возможных действий не скрывать кнопки или менять их доступность а формировать ссылки. Инструмент есть гуд.. Будем последить за развитием…

    Reply
  11. Ёпрст

    блин.. чего вы всё время каталогИБ добавляете в путь загрузки ВК ?

    1с-ина и так сама найдет …

    Reply
  12. Noy

    (11) Сорри 😳

    Reply
  13. Ёпрст

    Всё это можно было сделать и штатными средствами (разве что курсор не поменять), просто затратно было делать

    А так — неплохо бы не выводить в подсказку ничего, ибо наводишь на реквизит и видишь \code77 .. как-то не комильфо.

    +Неплохо изменять цвет шрифта при наведении на гиперссылку.. Или менять шрифт на подчеркнутый

    Reply
  14. Noy

    (13) Хорошие замечания — учту. Вот только со сменой шрифта — может быть накладно по ресурсам (особенно если база в терминале)

    Reply
  15. mai

    Недавно искал такую вещь (см. http://www.forum.mista.ru/topic.php?id=462510), дали несколько советов, но реально полезного я не поимел.

    А эта — похоже, то, что надо. Буду проверять. Большое спасибо автору.

    Плюс

    Reply
  16. Ёпрст

    (15) там же есть нормальный ответ.. и даже с примером..

    Чем не подошел то?

    Reply
  17. mai

    (16)Там были примеры поразительные, из разряда фокусов. Я так и не понял, как они работают.

    А здесь предложен понятный рабочий инструмент создания интернет-ссылок на формах 1С.

    Reply
  18. Ёпрст

    (17) да нет там никаких «фокусов» .. на вот, более наглядный пример:

    Reply
  19. mai

    Пытаюсь проверить, выдает ошибку:

    Перехватчик.ПерехватитьСобытияГК(Конт,я<<?>>());

    {Обработка.ОбщиеФормаГиперСсылки.Форма.Модуль(38)}: Функция не обнаружена (я)

    В чем причина?

    Reply
  20. Ёпрст

    (19) в ошибке автора…

    Никто ж не проверяет..

    Перехватчик.ПерехватитьСобытияГК(Конт,Контекст);

    Reply
  21. mai

    (18) Я думал, речь идет про bg.ert, а оказывается про флажок.

    Не подошло, потому что ссылка у меня должна находится в середине формы между другими полями, а не с краю

    Reply
  22. mai

    (20) Поправил, теперь выдает

    ГиперСсылки=СоздатьОбъект(«Общие.Форма.ГиперСсылки»);

    {Документ.Аукцион.Форма.Модуль(2078)}: Неудачная попытка создания объекта (Общие.Форма.ГиперСсылки)

    Reply
  23. Noy

    (19),(20) В свое время в примерах нашел именно такую конструкцию — да, синтаксический контроль не проходит, но видимо данная функция «я()» встроенна в 1с++. Работоспособность такого подхода подтверждена длительным личным использованием.

    Reply
  24. Noy

    (22) Верни взад и не обращай внимания на эту ошибку в конфигураторе.

    Reply
  25. Ёпрст

    (21) Какая разница, где будет твоя ссылка ???

    Это всё равно, для приведенного модуля.

    Reply
  26. Ёпрст

    (23) можно писать и вирт() .. но по мне — лучше контекст

    Reply
  27. Ёпрст

    (22) у тебя просто не загружены ВК 1c++

    Reply
  28. mai

    Вернул, но форма не открывается.

    Выдается ГиперСсылки=СоздатьОбъект(«Общие.Форма.ГиперСсылки»);

    {Документ.Аукцион.Форма.Модуль(2078)}: Неудачная попытка создания объекта (Общие.Форма.ГиперСсылки)

    Этот оператор в процедуре ПриОткрытии() формы.

    Reply
  29. mai

    Виноват, не все обработки скопировал из hyper_with_dlls

    Заработало.

    Reply
  30. Ёпрст

    (21) по -поводу «в середине»..

    На, смотри:

    Reply
  31. mai

    (25) Но мне не нужно, чтобы флажок был виден

    Reply
  32. Ёпрст

    (31) а где ты его видишь???????????????!!!!!!!!

    Reply
  33. Ёпрст

    +32 ты не порть руками обработку в пофигураторе — и всё будет нормально.

    Вот для этого в bg и убрано всё с глаз долой, чтоб шаловливые ручки не портили ничего в пофигураторе.

    Reply
  34. mai

    (30) Понял, значит, я сам не сообразил.

    Так будет проще, чем с ВК

    Reply
  35. Ёпрст

    (34) не, не проще.. так трудозатратнее…

    Это просто для тех, кому религия не позволяет вк использовать.

    Спомощью классов всё быстрее делается.

    Reply
  36. mai

    Зато теперь мне есть из чего выбрать.

    Спасибо за помощь

    Reply
  37. ROM_1C

    При старте системы — опибка

    Не удалось открыть файл определения классов

    D:1$_basedefcls.prm

    УН=СоздатьОбъект(«УправлениеНастройками»);

    {Глобальный модуль(12)}: Неудачная попытка создания объекта (УправлениеНастройками)

    Reply
  38. Noy

    (37) обнови 1С++

    Reply
  39. DimikN

    Доброго времени суток

    Неудачная попытка создания объекта (Общие.Форма.ГиперСсылки)

    компоненты загружены

    1С++ 3.2.2.0

    formex 2.0.5.108

    Reply
  40. Noy

    (39) DimikN, В файле/обработке defcls должны быть прописаны классы.

    В демонстрационной базе есть это.

    Reply
  41. DimikN

    (40) Есть альтернативный способ получить дем. базу ? расчет через карту ? слишком много infostart просит ради одного скачивания. dimikn@mail.ru

    Reply
  42. Noy

    (41) Какой расчет? это бесплатный пример.

    Reply

Leave a Comment

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