Вызвать внешний отчёт или обработку — быстро и удобно (8.2)




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

49 Comments

  1. Поручик

    (0) Не скачивал, но подход одобряю. Вещь полезная, даже с учетом минуса.

    Reply
  2. cool.vlad4

    Были же менеджеры обработок внешних или я ошибаюсь? (правда для 8.1, но их переделать можно)

    Reply
  3. Поручик

    (2) Были. Но и эта не помешает. Всё же лучше, чем очередной перенумератор или консоль запросов. Ах да, забыл про статистику по документам.

    Reply
  4. nav1971

    Полезная вещь! Спасибо!

    Reply
  5. Somebody1

    (3) Про накопление статистики мысль, конечно, была. Можно даже было бы сделать список «Часто используемые обработки» для каждого пользователя. «За последний месяц Вы открыли эту обработку 12 раз. Перенести её в панель Избранного?» Но показалось пока не особо актуальным.

    Reply
  6. artbear

    (0) Смотрю скриншоты, вижу, что нет удобного поиска по наименованию

    Совет — сделай поиск по части наименования

    Reply
  7. Zoomby

    Полезная вещь, одобряю.

    Reply
  8. kondrashka

    А мы просто в меню вставили открытие справочника внешних обработок, научили пользователей кликать только если вид обработки отчет или обработка — и ОК.

    Reply
  9. iov

    (8) ПОделитесь секретом дрессировки юзверей. А то вот одного приучил пользоваться консолью запросов — теперь этот гад только так и может. К лотку закрывать корректно программу еле приучил.

    Reply
  10. Somebody1

    (9) Не понял, а какая связь между консолью запросов и корректным закрытием программы?

    Reply
  11. kondrashka
    iov пишет:

    (8) ПОделитесь секретом дрессировки юзверей. А то вот одного приучил пользоваться консолью запросов — теперь этот гад только так и может. К лотку закрывать корректно программу еле приучил.

    Терпение, терпение и еще раз терпение… и все с начала по нескольку раз… А мы консользапросов еще с ними не проходили…

    Reply
  12. 1801

    (11) kondrashka,

    Ну и зря, очень полезная штука для тех кто мозгами шевелить умеет! Остальных правда вгоняет в ступор!

    Reply
  13. proger1c81

    Пользователи главное чтобы пользовались! Для них ведь это все пишется

    Reply
  14. asg1975

    Если много пользователей юзают доп.функционал самое то. +1 🙂

    Reply
  15. asg1975

    УТ 10.3. При первом запуске получаем

    {Форма.ВидимостьГруппФорма.Форма(168)}: Метод объекта не обнаружен (ЗаписатьНабор)

    ОбщегоНазначения.ЗаписатьНабор(НаборЗаписей);

    Reply
  16. hanio

    {Форма.ВидимостьГруппФорма.Форма(168)}: Метод объекта не обнаружен (ЗаписатьНабор)

    ОбщегоНазначения.ЗаписатьНабор(НаборЗаписей);

    УТ 10.3.12

    Reply
  17. avart

    Да, поддерживаю! Столько стало этих отчетов и обработок, что сам стал в них путаться, не то что обычные пользователи. Идея очень хорошая! Попробую, потестирую

    Reply
  18. Alexey55

    спасибо! думаю пригодится

    Reply
  19. SanyaGrek

    Качаю. Некоторые юзеры ругаются, что обработки так «далеко» расположены.

    +

    Reply
  20. ivn75

    Нужная вещь,

    Reply
  21. Somebody1

    (15), (16). Пожалуйста, скачайте обновленную версию (1.1). В старой были ошибки — использовались процедуры общих модулей, отсутствующие в ряде конфигураций, в том числе и в УТ.

    Reply
  22. pt_olga

    Плюс! Полезная обработка ибо тонем во внешних отчетах

    Reply
  23. asg1975

    Спасибо за доработку. Потестим!

    Немного не по теме. Скажите,а то что при повторном скачивании 1$ снимают это нормально? Пытаешься помочь автору улучшить разработку. Скачиваешь каждую новую версию, а с тебя за это ПОСТОЯННО мани снимают…. Может я что не понял 🙁

    Reply
  24. Somebody1

    (6) Работает поиск по вводу с клавиатуры. Что имеется в виду под «поиском по части наименования»? Это не одно и то же?

    Reply
  25. echo77

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

    То что доступ к справочнику лежит далековато(Сервис — Дополнительные отчёты и обработки->…) согласен. Поскольку у нас полно самописных интерфейсов, то часто используемые вещи выносим в главное меню.

    Reply
  26. hanio

    (24) Снимается снова — проверено (((

    Reply
  27. orsprog

    одобрям…одобрям…вещь полезная

    Reply
  28. hanio

    В целом очень неплохо придумано только такие моменты — слева тоже неплохо бы дерево, и как быть с отчетами и обработками находящимися в корне?

    Reply
  29. orsprog

    еще раз спасибо…очень пригодилось

    Reply
  30. hanio

    А еще необходима кнопка раскрытия сразу всех папок

    Reply
  31. Somebody1

    (28) Слева линейный список сделан специально — подразумевается, что много избранного быть не должно, и к нему должен быть максимально быстрый доступ. Дерево же не подходит для быстрого доступа. Для структурирования информации — подходит, но не для скоростного выбора.

    Отчёты и обработки в корне не выводятся по определению. Были определенные технические сложности, и в конце концов решили считать это не багом, а фичей 😉 Вам ведь ничего не мешает переместить их из корня в папку? 😉

    Reply
  32. Somebody1

    (4),(18),(29)

    Пожалуйста! 🙂

    Reply
  33. Somebody1

    (26) Извините, не понял?

    (30) Принято. Доработаем.

    Reply
  34. hanio

    и колонка в которой видно что это отчет или обработка, привычки пользователей все равно останутся и вопрос а это в каком месте лежит???

    Reply
  35. orehova123

    только для управляемых форм, я правильно понимаю?

    Reply
  36. Somebody1

    (35) Наоборот, только для обычных форм.

    Reply
  37. vovkakursk

    Полезная штука

    Reply
  38. che444

    + автору за отличный инструмент в моем арсенале

    Reply
  39. ninch

    Еще немного и вот оно управляемое приложение:)))

    Reply
  40. ir_en

    Спасибо, хорошая обработка. Хотелось бы, чтобы при открытии был только список избранного, а форма настройки этого списка открывалась бы по кнопке «настройка» или на другой закладке. А то очень отвлекает полный список…

    Reply
  41. Boroda

    Да, вещь стоящая. Надо скачать и потестировать. Обработок пока что немного, но в перспективе, полагаю, их число будет расти и расти.

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

    Reply
  42. Somebody1

    (40) ir_en,

    Знаете, а у нас многие сотрудники совсем не используют Избранное, только в правой панели работают. Более того, изначально была только правая панель, потому что была цель уйти от разделения отчетов и обработок. А Избранное добавили потом. Но ваш подход тоже имеет место, я подумаю, как красивее его реализовать 🙂

    Reply
  43. Somebody1

    (41) Boroda,

    Права доступа учитываются на уровне RLS, то есть если сотруднику недоступна обработка, он её и не увидит. Но тут есть одна особенность. Если у пользователя нет прав на использование обработки, то она удаляется из Панели избранного. То же самое и с видимостью групп.

    Пример. Предположим, у вас есть группа обработок «Для расчетчиков». И кадровики к ней доступа не имеют. Вы настроили видимость этой группы. После этого, если Панелью будут пользоваться только расчетчики, группа будет видна. Но, когда Панель откроет любой кадровик, группа исчезнет из списка видимых, причем для всех пользователей.

    Резюме. Разделение по правам в том виде, в котором вы хотите, не реализовано. Поддерживается только недоступность обработок на уровне RLS.

    Reply
  44. silver-747

    Идея хорошая. Но в ЗБУ выдает ошибку

    {Форма.ВидимостьГруппФорма.Форма(106)}: Ошибка при установке значения атрибута контекста (ТипЗначения)

    Элемент.ТипЗначения = Новый ОписаниеТипов(ТипЗначения);

    по причине:

    Тип не является подмножеством типа значений плана видов характеристик

    Reply
  45. Somebody1

    (44) silver-747, что такое ЗБУ?

    Reply
  46. silver-747

    ЗБУ это Зарплата бюджетного учреждения

    Reply
  47. Mag_LI

    У меня вопрос к разработчику — каким образом «панель обработок» добавлена в врехнее меню?

    Reply
  48. Somebody1

    (47) Mag_LI, для этого, безусловно, придется разрешить изменения в конфигурации и добавить обработку в нужные интерфейсы.

    Reply
  49. Mag_LI

    Вот у меня что-то и не получается добавление, не могу найти, как или где это сделать. Не подскажете?

    Reply

Leave a Comment

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