Отчет по показателям Текучесть,Интенсивность,Стабильность,Закрепленность.




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

12 Comments

  1. denium

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

    Данный отчет написан по просьбе сотрудников отдела персонала, не согласных с типовым отчетом

    «Коэффициент текучести кадров организаций».

    Формулы расчета смотрите ниже.

    Перейти к публикации

    Reply
  2. rsu55

    Релиз -Зарплата и Управление Персоналом, редакция 2.5 (2.5.33.4)

    Ошибка:

    «{ВнешнийОтчет.мТекучесь.МодульОбъекта(25)}: Метод объекта не обнаружен (ПолучитьТаблицуЧисленностейПодразделение)

    ТаблицаСреднихЧисленостей = Отчет.ПолучитьТаблицуЧисленностейПодразделение(Организация, НачалоПериода, КонецПериода,ложь);»

    Reply
  3. e.kogan

    Будьте проще, не лезьте в изменение типовой конфигурации. Нужный дополнительно отчёт можно не трогать, а запихнуть к вам же.

    См.вложение.

     //Отчет = Отчеты.СредняяЧисленностьРаботниковОрганизаций.Создать();
    // Э.
    рИмяПутьФайла=ПолучитьИмяВременногоФайла(«erf»);
    Отчет=ПолучитьМакет(«Отчет_СредняяЧисленность»);
    Попытка
    Отчет.Записать(рИмяПутьФайла);
    Исключение
    Предупреждение(«Проблема при открытии, обратитесь к программисту!»);
    КонецПопытки;
    Отчет=ВнешниеОтчеты.Создать(рИмяПутьФайла);
    // Э.
    

    Показать

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

    (1) берите вложение, оно работает без изменений конфигурации.

    Reply
  4. rus128

    А где собственно формулы? вижу только текст…

    Reply
  5. denium

    Во вложении 2 Функция ПолучитьТаблицуЧисленностейПодразделение.

    Ее необходимо добавить в модуль типового отчета «СредняяЧисленностьРаботниковОрганизаций»

    Либо сделать так как предлагает e.kogan.

    e.kogan, спасибо за совет, учту 😀

    Reply
  6. ChGL

    Сделал, как предложил e.kogan (скачал его вложение).

    Платформа 8.2, ЗУП 2.5.33.4

    Очень долго не мог въехать, что оно от меня хочет. Чуть мозг не сломал по своей неопытности…

    Оказывается, встроенную копию отчета о средней числености надо тоже выгрузить, сконвертировать, и загрузить на место. Вдруг кто-то тоже в такой ситуации окажется 😉

    Reply
  7. Yackov

    А попроще никак? 😀

    Reply
  8. denium
    Yackov пишет:

    А попроще никак?

    Я уже писал, во вложении Функция ПолучитьТаблицуЧисленностейПодразделение.

    Ее необходимо добавить в модуль типового отчета «СредняяЧисленностьРаботниковОрганизаций» .

    Проще некуда.

    Reply
  9. tango

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

    книжек начитался?

    Reply
  10. Nefrit88

    Добрый день. Не знаю у кого как, но у меня не работает.

    {ВнешнийОтчет.мТекучесь.МодульОбъекта(315)}: Поле объекта не обнаружено (МесяцыОтчета)

    ЗапросСКДМесяцыОтчета = СхемаКомпоновкиДанных.НаборыДанных.МесяцыОтчета.Запрос;

    Reply
  11. denium

    В Публикации я подчеркнул.

    Во вложении 2 Функция ПолучитьТаблицуЧисленностейПодразделение.

    Ее необходимо добавить в Модуль типового отчета «СредняяЧисленностьРаботниковОрганизаций»

    Вы добавили Функцию ?

    И еще , в последних версиях ЗУП нужно заменить вызовы функций из общего модуля «Общегоназначения» на

    «ОбщегоназначенияЗК»

    Reply
  12. qwerty33

    Вот нормальная версия этой обработки для 8.2 http://yadi.sk/d/EQE7PVGy98q5C

    Автор, выкладывай, пожалуйста, обработки, где не надо ничего дописывать. Сам же знаешь каково в чужом коде копаться.

    Reply

Leave a Comment

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