Менеджер внешних отчетов и обработок v8




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

44 Comments

  1. Fuego

    Молодес!

    Reply
  2. z-alexey

    +1.

    1. Сделать возможность указывать папку в которой искать, а не только в текущей

    2. Исключить из списка саму себя

    3. Почему-то формы открываемых обработок открываются на заднем плане.

    Reply
  3. Душелов

    (0) В обработку выбора в начале пропиши «СтандартнаяОбработка = Ложь;» иначе обработка после открытия перехватывает фокус на форму — не есть гуд.

    Reply
  4. IronDemon

    Добавить сортировку/группировку по дате, по имени (как в Viste)

    Имена обработок можно хранить.

    Reply
  5. Abadonna

    Есть еще одно… по причине лени качнул обработку в корень С:, оттуда же и запустил. И зае…ся ждать пока оно весь диск сканирует :))))))))

    Reply
  6. tomvlad

    1. Исправил процедуру-обработчик ДеревоВыбор. Фокус не смещается на текущую форму

    2. Добавил возможность выбора каталога хранения внешних отчетов и обработок.

    Reply
  7. Abadonna

    Поставлю плюс за правильное восприятие критики 🙂

    Reply
  8. Fuego

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

    Reply
  9. tomvlad

    Выложи, интересно будет посмотреть, а то только грозишь 🙂

    Reply
  10. Fuego

    (9) я не грожу, и выкладывать не стану 🙂 Я её уже встроил в конфигурации, и переделал: теперь у меня внешние отчеты и обработки хранятся в регистре сведений в реквизите с типом «ХранилищеЗначений», и право доступа устанавливается конкретным пользователям. Теперь это просто идея.

    Reply
  11. Fuego

    А вообще-то, я понял, как добиться комментариев — нужно побольше ошибок в программном коде допустить…

    Reply
  12. tomvlad

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

    Reply
  13. direktorSan

    Думаю, что хранение внешних отчетов и обработок в регистре сведений в хранилище значения может выйти не тем боком: если 1С в очередной раз изменит формат базы (как это было, например, при переходе с 8.0 на 8.1) — придется перекомпилировать обработки! А это гемор при таком хранении!

    Reply
  14. Fuego

    (13) это ведь бред. При чём тут «формат базы»? Если у тебя они хранятся внешне, что — они у тебя не требуют изменения формата??? Точно так же всё работает…

    Reply
  15. Fuego

    (12) какие полномочия? Разве это главное? Чем меньше пользователь может сделать, тем ему же лучше! У меня однажды бухгалтерша одна не ту обработку открыла, и потом долго правила пачку документов вручную. Закрыл всем доступ на интерактивное открытие внешних отчетов и обработок, создал на шаре папочку, накидал туда обработочек и в справочнике-обработке сделал разграничение доступа по пользователям. А потом оказалось, что 1с-ка не хочет открывать файл только для чтения! Ей полный доступ нужен, и причём далеко не всегда, а когда она просто хочет этого. Я админа замаял, но всё нормально. Это 1с-ка порой пытается открыть файл для записи, вот и выходит конфликт. Метод «ВнешниеОбработки.Создать(<Имя файла обработки>)» вызывает исключение. Вот так я и отказался от такого простого метода.

    Reply
  16. tomvlad
    Reply
  17. Pashkaa

    Неплохая штуковина.

    Пожелания:

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

    Поэтому было бы удобно отобразить несколько папок.

    2. Можно сделать еще что то типа настроек, «Работа», «Дом» которые бы хранили разные пути к каталогам с обработками 🙂 т.к. на работе они могут лежать в одном месте, дома в другом и т.д.

    3. Придумать бы еще синхронизацию каталогов. Нет конечно есть другие средства для этого, но раз уж писать менеджер так…

    Допустим постоянно таскаешь обработки с дома на работу и наоборот через флэху. Вот и придумать бы некую синхронизацию.

    Reply
  18. baan4c

    При подключении внешних отчетов и попытке открыть расшифровку отчета — у меня идет ругань на отсутствующий *.tmp файл. Как быть?

    Reply
  19. tomvlad

    Это не ошибка обработки. Она всего навсего пытается создать экземпляр внешнего отчета или обработки (если это строка дерева) или открыть папку (для узла)

    Reply
  20. Nickon

    А мне понравилось! Спасибо!

    Reply
  21. bazavs

    Как пользователь ОЦЕНИЛ! спасибо, удобненько!

    Reply
  22. manserg

    =-))) «Добавлены возможность использования в качестве источника справочник «Внешние обработки»» — плагиатничаем?! http://infostart.ru/projects/3859

    Reply
  23. tomvlad

    Да было бы чего плагиатничать, идея уже давно крутится. Мне было бы стыдно брать за такую ерунду деньги в отличие от тебя. Тем более скрывать код такой пустяковой обработки, возможно тебе просто стыдно его показать?

    Reply
  24. manserg

    Ну так давай сделаем ее на СКД и продемонстрируем у кого лучше получилось? Или слабо?

    Reply
  25. manserg

    А код скрывают обычно от таких как ты, которые сразу бегут дорабатывать свои обработки…

    Reply
  26. tomvlad

    Слушай, давай не будем меряться. Эта обработка -побочный продукт моей основной деятельности, делать на ней деньги я не собираюсь. Правда не понимаю, каким образом я мог чего-то у тебя позаимствовать. Если есть какие-то вопросы — пиши в личку.

    Reply
  27. manserg

    =-)) ну да, видимо все остальные деньги зарабатывают написанием подобных обработок… Вопросов больше не имею… Всех благ.

    Reply
  28. manserg

    =-) Ха дядя, давно не ведемся на высказывания индивидумов не гнушащимся плагиатничать… Быть может тогда скажежешь, почему такой крутой спец как ты, у которго конечно за плечами лет 20 работы с 1С 😉 делает такие ляпы и гордо выставляет их на всеобщее п

    Reply
  29. manserg

    А то, что тут присутствует нездоровая атмосфера и сформированная коалиция это однозначно, видели бы комментарии ярых сторонников данной «разработки» http://infostart.ru/projects/3859/?p=1#comm11

    Reply
  30. manserg

    Дядя Том, большое спасибо за мнение крупного специалиста, теперь буду знать что есть такой объект как ТаблицаЗначений, кстати, могу не глядя на твою «разработку» сказать, что у тебя только с этим объектом все и связано =-)) http://infostart.ru/projects/3859/

    Reply
  31. tomvlad

    Плохо смотрел, там есть и дерево значений. Учи матчасть студент.

    Reply
  32. manserg

    Дядя, Том, не путай сдудента, ну раз такая пьянка, то скажи, а лучше продемонстрируй =-)) как построителем создать дерево по файлам?! А то умничать все горазды…

    http://infostart.ru/projects/3859/?p=1#comm16

    Reply
  33. manserg

    И призадумался дядя Том, а как же правда сформировать запросом дерево по файлам… =-)) Жду с нетерпением варианта решения вместо банальных отписок, что это обсуждалось пару миллионов раз и только студенты не в курсе…

    Reply
  34. tomvlad

    На, пользуйся. Источник: http://partners.v8.1c.ru/forum/thread.jsp?id=573285#573285

    Построитель = Новый ПостроительЗапроса;

    Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(ДеревоФайлов);

    Построитель.ЗаполнитьНастройки(); Построитель.Результат.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам);

    Reply
  35. manserg

    =-)) америку открыли… Попробуй сформируй и посмотри на свое «дерево»…

    Reply
  36. tomvlad

    Попробовал, сформировал… И что? Смотри позицию разработчиков по данному вопросу (http://partners.v8.1c.ru/forum/index.jsp) здесь есть несколько комментариев по использованию дерева значений в качестве источника построителя запроса. Если у тебя не хватает ума понять, что не везде можно применять существующие инструменты, то кто же просветит? Могу порекомендовать книжку Хрусталевой по СКД — там есть пример построения отчета с использованием собственной иерархии.

    Reply
  37. manserg

    Спасибо «профессор» по СКД я тебе сам могу подсказать без Хрусталевых…

    Reply
  38. константин

    Классно!!!, спасибо!

    Reply
  39. mtv:)

    (0) Поздравляю, юбилейный СОТЫЙ плюс… 🙂

    Reply
  40. Sergey_Murzinov

    По крайней мере, сейчас не теряюсь вор всех внешних обработках, красиво, удобно

    Reply
  41. IgoriKr

    Спасибо,теперь и сам в своих ‘творениях’ не буду путаться.

    Reply
  42. archt

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

    При больших количествах обработок,очень не хватает.

    И еще добавить бы уровни доступа по пользователям и можно продавать.

    Reply
  43. nick-max

    вот моя похожая обработка, но с наворотами и на управляемых формах (в том числе): http://infostart.ru/public/384987/

    Reply
  44. vovchiksir

    Хорошая обработка.

    Reply

Leave a Comment

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