Полноценные шорткаты




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

23 Comments

  1. tsd

    А зачем оно, штатное событий ПослеОткрытия()? чего хорошего может дать?

    Reply
  2. SatanClaws

    (1) Например, создание элементов формы до ее открытия ведет себя достаточно глючно в случаях, когда необходимо исходную форму увеличить по высоте/ширине.

    Конечно, как вариант: сделать исходную форму максимальных размеров и потом только уменьшать ее — но это не выход, на мой взгляд.

    Reply
  3. Serj1C

    Шорткаты понравились! +

    Reply
  4. artbear

    (0) В описании/названии отдельно выдели, что для 8 или 8.1

    Сразу и не поймешь, для какой платформы

    Reply
  5. Evg-Lylyk

    А где коды посмотреть для стрелок (left, right и т.д.) например?

    Reply
  6. Altair777

    (5) В Гугле 🙂 Строка поиска

    коды клавиш клавиатуры

    Первая ссылка

    Reply
  7. SatanClaws

    (5) см апдейт

    Reply
  8. milkers

    Каким образом ты фиксируешь нажатие ALT? Привел бы ты кусочек кода.

    Reply
  9. SatanClaws

    (8) «Кстати, можно повесит шорткат даже, например, на Alt+Shift — только нужно и в модификаторы прописать 20 и в КодКлавиши прописать, 18(это Alt) или 16(это Shift).»

    на пальцах — Альт должен участвовать и как модификатор и как код клавиши.

    Причем, в цитируемом примере 2 шортката (по коду клавиши Альта и по коду клавиши Контрола) будут вести себя немного по разному — в одном случае для его срабатывания будет необходимо нажать сначала Альт, затем Ктрл; во втором — в обратной последовательности.

    Reply
  10. PRoman

    как-то сумбурно. Ничё не понял.

    Reply
  11. aquakosh

    > но отсутствие штатного события ПослеОткрытия() несколько… удручает :-/

    Уже проходили. См. ОбновлениеОтображения().

    Reply
  12. SatanClaws

    (11) только ОбновлениеОтображения() отрабатывает весьма и весьма часто.

    Т.е. делаем флаг «ПервоеОткрытие», который будет изменен при первом обновлении отображения и т.д. — но принципиально метод не лучше, чем

    ПодключитьОбработчикОжидания(«ПослеОткрытия», 0.1, Истина);

    Reply
  13. Serj1C

    хочу добавить:

    Функция БыстрыйВызов(Код, Alt=0, Control=0, Shift=0) Экспорт
    Возврат ЗначениеИзСтрокиВнутр(«{«»#»»,69cf4251-8759-11d5-bf7e-0050bae2bc79,1,
    |{0,»+ Формат(Код, «ЧН=0; ЧГ=0″) +»,»+ Формат(Alt*16+Control*8+Shift*4, «ЧН=0; ЧГ=0″) +»}
    |}»);
    КонецФункции 
    Reply
  14. DrAku1a

    А событие «ПриОткрытии» разве происходет не по факту открытия формы?..

    Reply
  15. SatanClaws

    (14) DrAku1a,

    честно, в осьмерке плотно не программировал уже давно — основной код сейчас идет на 7.7++

    Но если сравнивать с 7.7, то ПриОткрытии() отрабатывает даже раньше, чем форма физически создается (под нее выделяется место в памяти и на ней создаются контроллы). Собственно, ради чего в FormEx-е есть события ПослеСозданияФормы() и ПослеОткрытия(). Первое отрабатывает, когда в памяти уже существуют все, что нужно; второе — уже после первичной отрисовки формы.

    Раз во времена исследования всех этих вещей я решил какую-то проблему — видимо, проблема все-таки имеет место быть.

    Скорее всего, в снеговике ПередОткрытием() — аналог ПриОткрытии() из 7.7, а ПриОткрытии() — ПослеСозданияФормы() формекса.

    Reply
  16. Synoecium

    Шикарно (имею ввиду возможность назначить любые сочетания клавиш).

    Reply
  17. frkbvfnjh

    Красавчег, статья зачетная!

    Reply
  18. shard

    Спасибо тебе, добрый человек!

    Reply
  19. Shootoff

    В 8.3 комбинация с Enter уже не работает.

    Reply
  20. Кузьмич

    (19) Работает.

    БыстрыйВызов(13,,1);
    Reply
  21. grachev1c

    (19) Версия 8.3.8.2197

    комбинация с Enter уже снова работает 🙂

    Reply
  22. pvlunegov

    (13) прекрасно работающее универсальное решение, работает в случае управляемых и обычных форм.

    Апплодирую стоя! Виват победителям, вы помогли — спасли меня уже дважды!

    Первый раз — на управляемых формах — 2 раз на обычных формах!

    Кто не в курсе, сочетания клавиш для метода (13) можно посмотреть например здесь — http://jquery.page2page.ru/index.php5/%D0%9A%D0%BE%D0%B4%D1%8B_%D1%81%D0%B8%D0%BC%D0%B2%D0%BE­%D0%BB%D0%BE%D0%B2_%D0%B8_%D0%BA%D0%BB%D0%B0%D0%B2%D0%B8%D1%­88

    Reply
  23. Pupupu

    При редактировании ячейки табличной части документа (1С:Предприятие 8.2 (8.2.19.102)) шорткат не отрабатывает.

    При работе с табличной частью документа (8.3) шорткат не работает с комбинацией БыстрыйВызов(40,,1);

    Reply

Leave a Comment

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