<?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) Makushimo, на самом деле всё просто. Обработка решает проблемку обсуждаемую ещё вhttp://forum.infostart.ru/forum90/topic88841/ без необходимости писать код.
Там же есть ссылки на подобные разработки, но все они «заставляют лезть в конфигуратор».
А эта обработка поможет, вообще без участия программиста, сделать рабочий стол например вот таким:
Скачал. Очень полезная обработка. Автору большое спасибо! Пойду разбираться дальше.
(2) В продакшене вы не будете пользователям выдавать эту обработку. И назначать пользователям через нее рабочие столы — тоже не будете. Удобнее сделать подсистемку для управления рабочими столами пользователей, а применяться они будут автоматически при старте сеанса. Но для типовых без доработок — вполне вариант.
Но в любом случае за обработку плюс.
(4) herfis, Некоторым «продвинутым» пользователям, например руководителям отделов, можно и выдать обработку.
Вариант подсистемы для управления рабочими столами я делал. В своей конфигурации она (подсистема) не нужна, легче организовать заполнение по ролям.
В чужие или типовые из-за такой мелочи лезть как-то
ленивотрудозатратно.Обработка же даёт большую гибкость или оперативность. То что не надо никого выгонять из базы по каждой хотелке — однозначное преимущество. Даже перезапуск не нужен.
+ В типовых (на БСП) настройка сделанная этой обработкой копируется (новому пользователю от уволенного,отпускника или соседа) так же как и другие настройки.
(5) Обработку я не критикую, плюс уже поставил.
Но «В своей конфигурации она (подсистема) не нужна» — нет, нужна.
Для пользователей с ограниченным функционалом сплошь и рядом удобно просто сделать «рабочий стол» со всеми необходимыми функциями, без стандартных меню. Т.е. выводить им начальную страницу в требуемом виде, а панели отключать.
Все хорошо, вот еще бы наладить передачу параметров в формы отчетов, хучь бы период, и команду Сформировать, чтобы отчет на начальной странице появлялся уже сформированным.
(6) herfis,
Я имел ввиду, что при создании своей конфигурации разработчик сам напишет что надо и где надо.
И то что в подсистему не включишь «Модуль управляемого приложения»,
а именно там, в процедуре «ПриНачалеРаботыСистемы()», логичнее разместить назначение «рабочих столов».
Согласен, примерно так и делаем:
— «рисуем» стол и добавляем его в обработки
— добавляем на начальную страницу
— лишнее отключаем
я и не подумал даже… наоборот благодарен за конструктив
(7) ryutao, к сожалению платформа не поддерживает передачу параметров формам рабочей области.
Но это не так страшно, если формы умеют «при открытии» или «ПриСозданииНаСервере»
восстанавливать ранее введённые (подставлять настройки по умолчанию).
Причем настройки форм «внутри стола» часто независимы от таких же «снаружи».
Автоматическое формирование при открытии поддерживается многими типовыми,
но тяжелые отчеты замедляют запуск и потому чаще бесят чем радуют.
(6) …кстати, в моей обработке автоподбор форм далёк от идеала
…предлагаю обсудить
(8) Ну, подсистема — понятие широкое. В БСП они тоже не инкапсулированы.
ЗЫ. Могу ошибаться, но вроде в ПриНачалеРаботыСистемы() уже поздно назначать — настройки в этот момент уже считаны из хранилища. Не? У меня в модуле сеанса назначается.
(11) herfis, Вы правы (а я попутал что-то),
«УстановкаПараметровСеанса» в модуле сеанса исполняется на сервере раньше всего остального,
и настройки гарантированно будут применены сразу.
Надо только помнить, что вызывается процедура далеко не однократно, и отгородить свой код
чем-то легким типа:
А «ПриНачалеРаботыСистемы» я чаще всего подключаю оборудование, внешние обработки и…
что там можно ещё подключить к клиенту? … или открываю какие-нибудь формы «вне стола».
Храни тебя Господь. Ты столько мне времени сэкономил!
Подскажите, пожалуйста, а как сделать чтобы только моя форма открылась без панели меню слева?
Настроить видимость/расположение панелей можно штатными средствами платформы
Отличная
(8)а как сделать на главной такие вкладки ? что бы переключаться между ними
(17) На скрине закладки сделаны на форме самописной обработки добавленной в конфигурацию. Затем эта форма добавлена на главную обработкой «Настройка начальной страницы (Рабочего стола)».
Можно ли вытащить на страницу несколько разных вариантов одного отчета как отдельные ссылки ?
(19) Вытащить 2 копии одной формы отчета можно в разные колонки, работать с разными вариантами тоже, но…. после перезапуска во всех будет выбран вариант последней.
По другому никак, ведь форма отчета одна. Для такой задачи надо несколько форм… и снять ограничение на выбор только основных форм в моей обработке
(19) Предложенный мной вариант с разными формами скорее всего не сработает. Потому как в подсистеме «Варианты отчетов» из БСП все настройки привязаны к КлючуОбъекта (к Отчету)
Вопрос. Можно ли подключить внешний отчет из справочника дополнительных отчетов и обработок?
(22) Пока нет… сразу не взлетело, отложил на потом
Название курьерской компании ЧЕРЕПАХА — ахаха!