ГИБКИЕ ЗАКЛАДКИ ОТБОРА II




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

33 Comments

  1. CheBurator

    Зачетно!!! +5

    есть неувязочка маленькая.

    внедрил код (колво закладок видимых = 5)

    открываю ПЕРВЫЙ РАЗ ЖУРНАЛ — вижу одну закладку с наименованием «1»

    потом, когда закладки множатся — она сдвигается но остается «1»

    после того, как уходит в «другие» — в списке других фигурирует как «6».

    При выборе ее («6») из списка других — образуется закладка без наименования.

    сие имхо навскидку связано с тем, что первый раз открывалось со штатным «бscnhsq отбор = отсутсвует»

    Reply
  2. CheBurator

    Оперативно полечил вот так:

    Код
       ИначеЕсли ТЗпоЗакладкам.НайтиЗначение(ЧтоИщем,ТекНомерСтроки,"Индекс")   = 0 Тогда
          // новая закладка
          
          ТЗпоЗакладкам.НоваяСтрока(1);
          ТЗпоЗакладкам.Отбор_Значение      = ТекЗначОтбора;
          ТЗпоЗакладкам.Отбор_Имя            = ТекИмяОтбора;
          Попытка
             ТЗпоЗакладкам.Отбор_НомерСтроки      = ВидОтбора.ТекущаяСтрока();
          Исключение
          КонецПопытки;
          Попытка
             ТЗпоЗакладкам.Отбор_Представление   = ЗначениеВВидеСтроки;
    //ВСТАВКА НАЧАЛО
             Если  ПустоеЗначение(СокрЛП(ТЗпоЗакладкам.Отбор_Представление))=1
             Тогда ТЗпоЗакладкам.Отбор_Представление = "Полный";
             КонецЕсли;   
    //ВСТАВКА КОНЕЦ
          Исключение
             ТЗпоЗакладкам.Отбор_Представление   = Строка(ТекЗначОтбора);
          КонецПопытки;   

    Показать полностью

    Reply
  3. CheBurator

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

    Reply
  4. CheBurator

    е! прикручу к своему монитору!!!

    +10, однозначно!!!!

    Reply
  5. CheBurator

    + сохранеямое значение настроек хорошо бы именовать не просто «_ГИБКИКЕ_…» а с неким уник.префиксом (имя списка журнала или еще что…)

    Reply
  6. CheBurator

    + еще бы хорошо — выбрал я например закладку с отбором Контрагент — отбор установился — а почему бы не сделать невидимой колонку «контрагент»…? это в порядке дежурного бреда…

    Reply
  7. CheBurator

    мелкая фича все же нашлась — иногда по логике «Полный» должен вставать в первую позицию — а не встает!

    Reply
  8. Shaman100M

    (1) + (2) действительно, пустую лучше не оставлять, — вылезает значение-номер закладки

    (3) есть недоделанная формочка, с кучей кнопок, возможно будет позднее. Пока ее оставил, соблазнившись на простоту этого варианта…. А вот чистка сделана автоматом… Как только количество отборов превышает _ЗАКЛАДОК_ВСЕГО, последний отбор удаляется. Т.е. можно этот параметр уменьшить.

    (5) Уникальный идентификатор для сохранения — можно, тем более, что это уже делал http://infostart.ru/profile/8196/projects/861/

    (6) Временно скрывать колонку отбора, — прикольно. 🙂

    (7) будем проверять.

    Спасибо, кладезь!

    Reply
  9. Shaman100M

    Обновление.

    1. Для состояния «Отбор отсутствует» закладка без названия —> закладка «*». Попутно решены проблемы с доступностью кнопки «Значение».

    2. Имя сохранения закладок между сеансами открытия формы завязано на ее уникальный идентификатор.

    Reply
  10. cs25

    Гуд ! Плюсуем !!!

    Reply
  11. CheBurator

    Если ПустоеЗначение(СокрЛП(ТЗпоЗакладкам.Отбор_Представление)) = 1 Тогда

    ТЗпоЗакладкам.Отбор_Представление = «*»;

    КонецЕсли;

    …заимствование до степени схожести!!! где мой копирайт????? 😉

    Reply
  12. Shaman100M

    🙂 там в (2) в нижнем левом углу переданы права.

    Reply
  13. Shaman100M

    Обновление, касается оформления кода: обращение к реквизитам формы вынесено в отдельные процедуры.

    Reply
  14. CheBurator

    Отмечаю исключительную полезность разработки. Все мои менеджеры отметили повышение удобства (оперативности!) работы. Несколько раз задавали вопрос «как удалить закладку» — просьба автору подумать над этим, но имхо, это не особо актуально

    Reply
  15. Shaman100M

    (14) Сделаем, возможно, через закладку «Другие» или через внешнюю обработку.

    Reply
  16. Shaman100M

    Обновление.

    — добавлена функция удаления закладок

    — исправлена вторичная ошибка от 21.12, — при отборе по видам документов некорректно отображалось название закладки.

    Reply
  17. CheBurator

    Найдена офигенная багофича к релизу (13)

    имеем открытый журнал, активная закладка — третья.

    Закрываем журнал.

    Открываем журнал.

    Какая закладка активная?

    Reply
  18. CheBurator

    Да, все таки есть, есть шоры на глазах! 😉

    что мешает на кнопку ОК повесить двойную функцию?

    1. показываем СЗ с пометками

    2. если есть ВКЛ пометки и нажата ОК — удаляем те, что ВКЛ, иначе — штатно…

    Reply
  19. Shaman100M

    (17) В (16) релизе третяя.

    (18) А не запутаются с одновременным выбором и пометками? Сомневающиеся не только выберут, но и пометят вдобавок…

    Reply
  20. CheBurator

    (19) согласен.. это ж обизянки… 😉

    Reply
  21. CheBurator

    Ваще-то у меня манагеры просили удалять видимые закладки… типа как я себе представляю: удаляем текущую закладку — старые из стека не подтягиваются… а ну их в зпс!!! ПУСТЬ БУДЕТ КАК ЕСТЬ СЕЙЧАС

    Reply
  22. CheBurator

    А вот какая фича действительно нужна — где тов СЗ для закладок хранить интервал видимости журнала (по крайней мере его верхнюю границу) — а то надоело переключаясь по закладкам все время еще период перевыбирать… — это будет ПРАВИЛЬНАЯ ФИЧА!!!

    Reply
  23. Shaman100M

    (22) Имхо, сделаю так: по-умолчанию сохранение интервала будет отключено, он устанавливается в соответствии с настройками 1с. При смене интервала на текущей закладке (через панель инструментов или через «Действия») пользователю будет предложен режим сохранения интервала только для текущей закладки.

    Reply
  24. Shaman100M

    Обновление.

    — Доработка правильной фичи, — сохранения интервала журнала (см описание)

    — Текущие значения (интервал, документ, колонка) не сохранялись при смене отбора и закрытии журнала, — только при смене закладки. Багофича исправлена.

    Reply
  25. delete009

    Спасибо всё получилось и даже с тем что у меня есть отбор по автору на документ т.е. могу поставить дакумент и отсортировать его по автору

    Reply
  26. CheBurator

    Еще раз отмечу ОФИГЕННО-НЕСОМНЕНУЮ ПОЛЕЗНОСТЬ данной разработки. И мои манагеры и я уже не мыслим себе жизни без данного дивайса.

    MUST HAVE!

    Reply
  27. gator

    Рулез, прикрутил себе, давно, еще до редизайна инфостарта,

    не мыслю без этих закладок…

    вот тут в усн 77 поработал, так там даже отбора штатного нет — обплевался…

    искал перенумераторы, и тут заметил… раньше учетки небыло и и комменты

    не принимали… и сейчас плюсануть не могу )

    Немогу не плюсануть, но не могу )

    Reply
  28. Shaman100M

    Ну, не плюсом, так добрым комментом. Спасибо.

    Reply
  29. Ёпрст

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

    Reply
  30. Shaman100M

    (29) В смысле, добавить закладку без действия установки отбора с меню? так всё меню-то по идее из одной команды — удаление закладок. Можно ее так и назвать — удаление.

    Ну, еще какие действия можно придумать:

    поменять порядок закладок; сделать сохранение наборов закладок… Только… будет ли это востребовано? Менеджерам не «лениво» будет пользоваться таким большим ))) инструментом?

    Reply
  31. Ёпрст

    (30) ну да..управление всеми закладками вынести первой, чтоб была всегда…

    По-уму, нужно еще обработку впихнуть, с более гибкими настройками закладок..

    кнопочки там и т.д и т.п…

    🙂

    Reply
  32. Shaman100M

    (31) так да, такой функционал только обработкой.

    Reply
  33. CheBurator

    Неудобство: работает отвратно при открытии общего журнала с позиционированием на нужный документ из отчета сруктуры подчиненности…

    Reply

Leave a Comment

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