Методика переопределения и вызова обработчиков событий обычной формы




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2025-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='\

30 Comments

  1. цыпа

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

    Reply
  2. tormozit

    (1) Ниасилил?

    Reply
  3. vheart

    А в чем преимущество данного функционала перед возможностью платформы переопределять обработчики событий (only v8.1). Ведь можно назначать обработчики для событий прикладных объектов, прикладных объектов, наборов записей и СОМ — объектов.

    Reply
  4. KapasMordorov

    (3)

    Вообще-то статья о формах. Форма — прикладной объект?

    Reply
  5. inse0f

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

    Reply
  6. Поручик

    Лучше поздно, чем никогда.

    Сам применил эту методику в рабочей конфе. Спасибо автору.

    Reply
  7. bashhhh

    Внедряю УПП. Попоробую эту методику, т.к. события форм максимально автоматизируются. Только вот вопрос вида форм для разных ролей этой методикой не решить, скорее всего будет несколько форм документов для различных должностей. ❓

    +1 Шпасиба!

    Reply
  8. Поручик

    (2) Для управляемых форм 8.2. не пробовал портировать?

    Reply
  9. amiralnar

    Не работает на подменю:

    ЛксУстановитьДействиеФормы(ЭтаФорма, , «ДействияФормы.Подменю2.ЭлектронныеПисьмаПлюсКонтактныеЛица»);

    Reply
  10. HIgor

    Классное решение. Правда не сразу разобрался, но сейчас доволен как удав 🙂 (УПП 8.2 работает)

    Reply
  11. script

    Пожалуйста продемонтрируйте данную технологию на практическом примере.

    Описание методики до меня начало доходить только после 2 прочтения. И все равно я не понял

    как будут переопределяться динамичиские обработчики событий, назначенные программно (напр. меню кнопки «Печать»,»Заполнить» или «Вид операции» в документах типовых конфигураций).

    Очень прошу описать выполнение действий для простой задачи, например:

    1) Ручное добавление реквизита «НаименованиеДляНалоговойНакладной» в справочник «Контрагенты»

    и заполнение данного реквизита при изменении заначения в реквизите «Наименование».

    По аналогии с реквизитом «Полное наименование».

    2) В документе «Реализация товаров и услуг» в процедуре ПриОткрытии() вызывается процедура

    РаботаСДиалогами.УстановитьПодменюВыбораВидаОперации(,……,Новый Действие(«ДействияФормыДействиеУстановитьОперацию»));

    Цель задачи: необходимо переопределить обработчик «ДействияФормыДействиеУстановитьОперацию».

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

    Reply
  12. HIgor

    (8) Поручик, присоединяюсь. Кто знает подобное решение для управляемых форм?

    Reply
  13. stalker18

    (12) HIgor, поддерживаю, очень интересует подобная схема для управляемых форм

    Reply
  14. script

    БРАВО!!! Это просто круть.

    Reply
  15. alekseies

    хорошо бы реализовать подобное для управляемых форм 8.2…………….

    Reply
  16. pbazeliuk

    (8) Поручик, (12) HIgor, (13) stalker18, (15) alekseies, вот для УФ http://infostart.ru/public/169131/. Метод похож на та этот. Спасибо автору за идею и малость кода.

    Reply
  17. LexSeIch

    Мир этому дому. Спасибо за статью. Чужой опыт, всегда полезен — указывает возможный путь и решение.

    Reply
  18. mikhailovaew

    Можно попросить Вас отформатировать программный текст? Сейчас он растянут, читается тяжело

    (

    особенно

    перенос

    скобок

    на новую

    строчку

    )

    Reply
  19. tormozit

    (18) К сожалению вручную это большие трудозатраты. Как это сделать автоматизировано, у меня пока нет идей. Сломалось по вине движка сайта. Я лишь добавил ссылку на версию методики для управляемых форм. После сохранения все форматирование сломалось. Я обращался к модератору с просьбой помочь, но он пока не отреагировал на нее =(

    Reply
  20. tormozit

    Тех. поддержка восстановила форматирование содержимого публикации.

    Reply
  21. alekseies

    для УФ http://infostart.ru/public/169131/. Метод похож , но более трудоемк для обновления на новые конфигурации ………….

    Reply
  22. tormozit

    (21) Я все надеялся в самой публикации указать эту ссылку, но к сожалению при попытке отредактировать публикацию в ней ломается все оформление программного кода. Видимо теперь она навсегда останется в текущем виде.

    Reply
  23. mikhailv

    Шаблоны в конце статьи не читабельны. Здесь зеркало статьи с нормальными шаблонами: http://kb.mista.ru/article.php?id=268

    И еще: долго с коллегами думали, что же делает, например, код:

    [Выполнить(ЛксПолучитьСтароеДействиеФормы(ЭтаФорма, «ПередОткрытием»));]

    Оказалось, что квадратные здесь — просто для красоты #k8SjZc9Dxk.#k8SjZc9Dxk Может быть, хотя бы в статье-зеркале уберёте, раз эта не недактируется?

    Reply
  24. tormozit

    Квадратные скобки обозначают необязательный фрагмент.

    Reply
  25. Патриот

    (0), спасибо.

    Потребовалось добавить во все формы конфы немного программного кода. В платформе есть возможность выгружать загружать файлы конфы. Чтоб велосипеды не городить да время сэкономить, не подскажите, нет ли обработки, позволяющей во все формы конфы добавить некий код? Может даже с указанием, в какую процедуру надо код вопхнуть…

    Reply
  26. script

    Сколько лет прошло, а методика жива и работает

    Reply
  27. dima_home

    (1)

    центр в геометрической схеме ограничивающего прямоугольника

    Центр = Половина длины сторон ограничивающего прямоугольника. 😉

    Reply
  28. UNIT68RUS

    По обработке можно выложить скрин экрана обработки?

    Reply
  29. Cерый

    По образцу Вашей статьи мной решалась задача вызова обработчика «ПриИзменении» реквизита формы документа в процедуре общего модуля;

    оказалось, что для обработчиков, не объявленных как экспортные, возвращается ПолучитьДействие (отличное от Неопределено),

    но попытка выполнения их вне формы выдает ошибку: Метод объекта не обнаружен, объявление их экспортными ошибку устраняло

    (8.3.9, режим совместимости Версия 8.2.16, обычные формы).

    Благодарю за статью.

    Reply
  30. tormozit

    Обработчик ПриИзменении для поля формы часто удобнее вызывать через https://infostart.ru/public/16985/

    Reply

Leave a Comment

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