Настройка начальной страницы (Рабочего стола)




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

24 Comments

  1. Makushimo

    Очень лаконично.

    Чтобы даже понять, что это, надо скачать.

    мдэ

    Reply
  2. Erne100

    (1) Makushimo, на самом деле всё просто. Обработка решает проблемку обсуждаемую ещё в http://forum.infostart.ru/forum90/topic88841/ без необходимости писать код.

    Там же есть ссылки на подобные разработки, но все они «заставляют лезть в конфигуратор».

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

    Reply
  3. ryutao

    Скачал. Очень полезная обработка. Автору большое спасибо! Пойду разбираться дальше.

    Reply
  4. herfis

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

    Но в любом случае за обработку плюс.

    Reply
  5. Erne100

    (4) herfis, Некоторым «продвинутым» пользователям, например руководителям отделов, можно и выдать обработку.

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

    В чужие или типовые из-за такой мелочи лезть как-то лениво трудозатратно.

    Обработка же даёт большую гибкость или оперативность. То что не надо никого выгонять из базы по каждой хотелке — однозначное преимущество. Даже перезапуск не нужен.

    + В типовых (на БСП) настройка сделанная этой обработкой копируется (новому пользователю от уволенного,отпускника или соседа) так же как и другие настройки.

    Reply
  6. herfis

    (5) Обработку я не критикую, плюс уже поставил.

    Но «В своей конфигурации она (подсистема) не нужна» — нет, нужна.

    Для пользователей с ограниченным функционалом сплошь и рядом удобно просто сделать «рабочий стол» со всеми необходимыми функциями, без стандартных меню. Т.е. выводить им начальную страницу в требуемом виде, а панели отключать.

    Reply
  7. ryutao

    Все хорошо, вот еще бы наладить передачу параметров в формы отчетов, хучь бы период, и команду Сформировать, чтобы отчет на начальной странице появлялся уже сформированным.

    Reply
  8. Erne100

    (6) herfis,

    Но «В своей конфигурации она (подсистема) не нужна» — нет, нужна

    Я имел ввиду, что при создании своей конфигурации разработчик сам напишет что надо и где надо.

    И то что в подсистему не включишь «Модуль управляемого приложения»,

    а именно там, в процедуре «ПриНачалеРаботыСистемы()», логичнее разместить назначение «рабочих столов».

    Для пользователей с ограниченным функционалом сплошь и рядом удобно просто сделать «рабочий стол» со всеми необходимыми функциями, без стандартных меню. Т.е. выводить им начальную страницу в требуемом виде, а панели отключать.

    Согласен, примерно так и делаем:

    — «рисуем» стол и добавляем его в обработки

    — добавляем на начальную страницу

    — лишнее отключаем


    я не критикую

    я и не подумал даже… наоборот благодарен за конструктив

    Reply
  9. Erne100

    (7) ryutao, к сожалению платформа не поддерживает передачу параметров формам рабочей области.

    Но это не так страшно, если формы умеют «при открытии» или «ПриСозданииНаСервере»

    восстанавливать ранее введённые (подставлять настройки по умолчанию).

    Причем настройки форм «внутри стола» часто независимы от таких же «снаружи».

    Автоматическое формирование при открытии поддерживается многими типовыми,

    но тяжелые отчеты замедляют запуск и потому чаще бесят чем радуют.

    Reply
  10. Erne100

    (6) …кстати, в моей обработке автоподбор форм далёк от идеала

    …предлагаю обсудить

    Reply
  11. herfis

    (8) Ну, подсистема — понятие широкое. В БСП они тоже не инкапсулированы.

    ЗЫ. Могу ошибаться, но вроде в ПриНачалеРаботыСистемы() уже поздно назначать — настройки в этот момент уже считаны из хранилища. Не? У меня в модуле сеанса назначается.

    Reply
  12. Erne100

    (11) herfis, Вы правы (а я попутал что-то),

    «УстановкаПараметровСеанса» в модуле сеанса исполняется на сервере раньше всего остального,

    и настройки гарантированно будут применены сразу.

    Надо только помнить, что вызывается процедура далеко не однократно, и отгородить свой код

    чем-то легким типа:

    Если ИменаПараметровСеанса = Неопределено

    А «ПриНачалеРаботыСистемы» я чаще всего подключаю оборудование, внешние обработки и…

    что там можно ещё подключить к клиенту? … или открываю какие-нибудь формы «вне стола».

    Reply
  13. benzotopor

    Храни тебя Господь. Ты столько мне времени сэкономил!

    Reply
  14. Terve!R

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

    Reply
  15. Erne100

    Настроить видимость/расположение панелей можно штатными средствами платформы

    Reply
  16. AlexKo

    Отличная

    Reply
  17. user945750

    (8)а как сделать на главной такие вкладки ? что бы переключаться между ними

    Reply
  18. Erne100

    (17) На скрине закладки сделаны на форме самописной обработки добавленной в конфигурацию. Затем эта форма добавлена на главную обработкой «Настройка начальной страницы (Рабочего стола)».

    Reply
  19. MulderCelica

    Можно ли вытащить на страницу несколько разных вариантов одного отчета как отдельные ссылки ?

    Reply
  20. Erne100

    (19) Вытащить 2 копии одной формы отчета можно в разные колонки, работать с разными вариантами тоже, но…. после перезапуска во всех будет выбран вариант последней.

    По другому никак, ведь форма отчета одна. Для такой задачи надо несколько форм… и снять ограничение на выбор только основных форм в моей обработке

    Reply
  21. Erne100

    (19) Предложенный мной вариант с разными формами скорее всего не сработает. Потому как в подсистеме «Варианты отчетов» из БСП все настройки привязаны к КлючуОбъекта (к Отчету)

    Reply
  22. PowerBoy

    Вопрос. Можно ли подключить внешний отчет из справочника дополнительных отчетов и обработок?

    Reply
  23. Erne100

    (22) Пока нет… сразу не взлетело, отложил на потом

    Reply
  24. fomix

    Название курьерской компании ЧЕРЕПАХА — ахаха!

    Reply

Leave a Comment

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