<?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='\
Молодес!
+1.
1. Сделать возможность указывать папку в которой искать, а не только в текущей
2. Исключить из списка саму себя
3. Почему-то формы открываемых обработок открываются на заднем плане.
(0) В обработку выбора в начале пропиши «СтандартнаяОбработка = Ложь;» иначе обработка после открытия перехватывает фокус на форму — не есть гуд.
Добавить сортировку/группировку по дате, по имени (как в Viste)
Имена обработок можно хранить.
Есть еще одно… по причине лени качнул обработку в корень С:, оттуда же и запустил. И зае…ся ждать пока оно весь диск сканирует :))))))))
1. Исправил процедуру-обработчик ДеревоВыбор. Фокус не смещается на текущую форму
2. Добавил возможность выбора каталога хранения внешних отчетов и обработок.
Поставлю плюс за правильное восприятие критики 🙂
Вот интересно мне. Если бы я выложил свою обработку, которая в несколько раз лучше этой самой, хрен бы кто комментарий написал, а не то, что бы оценил. Здесь на сайте коалиция какая-то формируется?..
Выложи, интересно будет посмотреть, а то только грозишь 🙂
(9) я не грожу, и выкладывать не стану 🙂 Я её уже встроил в конфигурации, и переделал: теперь у меня внешние отчеты и обработки хранятся в регистре сведений в реквизите с типом «ХранилищеЗначений», и право доступа устанавливается конкретным пользователям. Теперь это просто идея.
А вообще-то, я понял, как добиться комментариев — нужно побольше ошибок в программном коде допустить…
Ну и чем эта идея принципиально отличается от внешних отчетов и обработок типовых конфигураций? Только разграничением полномочий? И чем спрашивается тут хвастаться?
Думаю, что хранение внешних отчетов и обработок в регистре сведений в хранилище значения может выйти не тем боком: если 1С в очередной раз изменит формат базы (как это было, например, при переходе с 8.0 на 8.1) — придется перекомпилировать обработки! А это гемор при таком хранении!
(13) это ведь бред. При чём тут «формат базы»? Если у тебя они хранятся внешне, что — они у тебя не требуют изменения формата??? Точно так же всё работает…
(12) какие полномочия? Разве это главное? Чем меньше пользователь может сделать, тем ему же лучше! У меня однажды бухгалтерша одна не ту обработку открыла, и потом долго правила пачку документов вручную. Закрыл всем доступ на интерактивное открытие внешних отчетов и обработок, создал на шаре папочку, накидал туда обработочек и в справочнике-обработке сделал разграничение доступа по пользователям. А потом оказалось, что 1с-ка не хочет открывать файл только для чтения! Ей полный доступ нужен, и причём далеко не всегда, а когда она просто хочет этого. Я админа замаял, но всё нормально. Это 1с-ка порой пытается открыть файл для записи, вот и выходит конфликт. Метод «ВнешниеОбработки.Создать(<Имя файла обработки>)» вызывает исключение. Вот так я и отказался от такого простого метода.
Неплохая штуковина.
Пожелания:
1. Предлагаю сделать открытие обработкой не одной папки, а например массива папок. Ну скажем на работе есть папка с обработками на серваке (готовые и обкатанные), есть папка обработок на моей машине, есть обработки которые хранятся на флэхе.
Поэтому было бы удобно отобразить несколько папок.
2. Можно сделать еще что то типа настроек, «Работа», «Дом» которые бы хранили разные пути к каталогам с обработками 🙂 т.к. на работе они могут лежать в одном месте, дома в другом и т.д.
3. Придумать бы еще синхронизацию каталогов. Нет конечно есть другие средства для этого, но раз уж писать менеджер так…
Допустим постоянно таскаешь обработки с дома на работу и наоборот через флэху. Вот и придумать бы некую синхронизацию.
При подключении внешних отчетов и попытке открыть расшифровку отчета — у меня идет ругань на отсутствующий *.tmp файл. Как быть?
Это не ошибка обработки. Она всего навсего пытается создать экземпляр внешнего отчета или обработки (если это строка дерева) или открыть папку (для узла)
А мне понравилось! Спасибо!
Как пользователь ОЦЕНИЛ! спасибо, удобненько!
=-))) «Добавлены возможность использования в качестве источника справочник «Внешние обработки»» — плагиатничаем?!http://infostart.ru/projects/3859
Да было бы чего плагиатничать, идея уже давно крутится. Мне было бы стыдно брать за такую ерунду деньги в отличие от тебя. Тем более скрывать код такой пустяковой обработки, возможно тебе просто стыдно его показать?
Ну так давай сделаем ее на СКД и продемонстрируем у кого лучше получилось? Или слабо?
А код скрывают обычно от таких как ты, которые сразу бегут дорабатывать свои обработки…
Слушай, давай не будем меряться. Эта обработка -побочный продукт моей основной деятельности, делать на ней деньги я не собираюсь. Правда не понимаю, каким образом я мог чего-то у тебя позаимствовать. Если есть какие-то вопросы — пиши в личку.
=-)) ну да, видимо все остальные деньги зарабатывают написанием подобных обработок… Вопросов больше не имею… Всех благ.
=-) Ха дядя, давно не ведемся на высказывания индивидумов не гнушащимся плагиатничать… Быть может тогда скажежешь, почему такой крутой спец как ты, у которго конечно за плечами лет 20 работы с 1С 😉 делает такие ляпы и гордо выставляет их на всеобщее п
А то, что тут присутствует нездоровая атмосфера и сформированная коалиция это однозначно, видели бы комментарии ярых сторонников данной «разработки»http://infostart.ru/projects/3859/?p=1#comm11
Дядя Том, большое спасибо за мнение крупного специалиста, теперь буду знать что есть такой объект как ТаблицаЗначений, кстати, могу не глядя на твою «разработку» сказать, что у тебя только с этим объектом все и связано =-))http://infostart.ru/projects/3859/
Плохо смотрел, там есть и дерево значений. Учи матчасть студент.
Дядя, Том, не путай сдудента, ну раз такая пьянка, то скажи, а лучше продемонстрируй =-)) как построителем создать дерево по файлам?! А то умничать все горазды…
http://infostart.ru/projects/3859/?p=1#comm16
И призадумался дядя Том, а как же правда сформировать запросом дерево по файлам… =-)) Жду с нетерпением варианта решения вместо банальных отписок, что это обсуждалось пару миллионов раз и только студенты не в курсе…
На, пользуйся. Источник:http://partners.v8.1c.ru/forum/thread.jsp?id=573285#573285
Построитель = Новый ПостроительЗапроса;
Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(ДеревоФайлов);
Построитель.ЗаполнитьНастройки(); Построитель.Результат.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам);
=-)) америку открыли… Попробуй сформируй и посмотри на свое «дерево»…
Попробовал, сформировал… И что? Смотри позицию разработчиков по данному вопросу (http://partners.v8.1c.ru/forum/index.jsp) здесь есть несколько комментариев по использованию дерева значений в качестве источника построителя запроса. Если у тебя не хватает ума понять, что не везде можно применять существующие инструменты, то кто же просветит? Могу порекомендовать книжку Хрусталевой по СКД — там есть пример построения отчета с использованием собственной иерархии.
Спасибо «профессор» по СКД я тебе сам могу подсказать без Хрусталевых…
Классно!!!, спасибо!
(0) Поздравляю, юбилейный СОТЫЙ плюс… 🙂
По крайней мере, сейчас не теряюсь вор всех внешних обработках, красиво, удобно
Спасибо,теперь и сам в своих ‘творениях’ не буду путаться.
Удобно. только не хватает запоминания последних открытых папок. Все время попадаешь в головню папку, указанную в настройках.
При больших количествах обработок,очень не хватает.
И еще добавить бы уровни доступа по пользователям и можно продавать.
вот моя похожая обработка, но с наворотами и на управляемых формах (в том числе):http://infostart.ru/public/384987/
Хорошая обработка.