<?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='\
То есть отличия от типового — это только алгоритм расчета?
Вроде все корректно работает, вещь нужная 🙂
Стандартный алгоритм вечно косячит от релиза к релизу. Написал как альтернативу для кадровиков.
(3) Понято. Тоже проверил, вроде работает, только оформление бы малость подправить или вообще на СКД сделать — и будет зашибись.
Учитывает ли отчет корректировки остатков дней отпуска, если ведение отпусков в программе началось, скажем в 2009-2010м годах, а работник был принят в 2005м или ранее, и за период с 2005 по 2009 кадровых приказов и движений по фактическим отпускам нет?
radian, нет, не учитывает
Я для своих кадровиков реализовал что-то подобное, только в больших масштабах. Как нибудь опишу схему, если время позволит.
суперский отчёт, особенно хорошо что свой алгоритм — для проверки встроенного
а) не учтено, что могут быть остатки отпусков.
б) не учтено, что до 14ти дней при взятии отпуска за свой счет в течение раб года не удлиняет рабочий год. если более 14 дней, то раб год удлиняется.
в) не сходится с остатками дней отпуска, которые покажет программа если уволить сотрудника в дату составления отчета. на 1-2 может разбежаться.
В целом понравилось. Натолкнуло на мысли взять одну процедурку себе. Написано внятно и понятно. За это и плюсанул.
А что то подобное для Кофигурации: 1С:Зарплата и Управление Персоналом 8.2 есть?
(10) Переконвертировал под 82 и всё работает.
Обработка очень помогла! Большое спасибо!
Алгоритм очень точный, точнее чем встроенный механизм!
Спасибо, огромное спасибо, меня кадровики замучили требуют именно такой алгоритм расчета, сначала как всегда решил посмотреть что есть готовое, очень помогло.
Обработка очень помогла, большое спасибо! Много данных в одном отчете, кадровики счастливы.
Спасибо большое! Удобный и наглядный отчет, кадровикам требовался именно такой!
а если сотрудник был уволен, а потом принят снова? как тогда? не путается в отпусках?
Подскажите в конфигурации 1С:Зарплата и Управление Персоналом 8.2 работает?
да, работает
Очень помогла в свое время. Да, некоторые моменты не учтены, плюс у кадровиков были свои требования к отчету. С небольшими доработками устроила всех, пользуемся по сей день. Спасибо
Классно, однако, можно ли сделать так, чтобы отображалась компенсация отпуска. Раньше по Трудовому законодательству можно было выплачивать компенсацию отпуска, если количество накопленных дней отпуска превышает 28 дней, часть, которая свыше 28 дней можно было выплатить. Соответственно, тем, кому мы выплатили уже эту компенсацию, остатки отпусков считает неправильно.
в 8.2 выдает ошибку
{Форма.ФормаОтчета.Форма(375)}: Ошибка при вызове метода контекста (Выполнить)
Результат = Запрос.Выполнить();
по причине:
по причине:
{(8, 33)}: Поле не найдено «СостояниеРаботниковОрганизаций.УдалитьФизЛицо»
СостояниеРаботниковОрганизаций.<<?>>УдалитьФизЛицо,
Спасибо большое. Не понадобилось писать с 0. Немного пришлось доработать, т.к. отчет сложносотавной нужен был. Но в качестве базы очень даже пригодился.
Foxux, поставленный «плюс» будет лучшей благодарностью 🙂
Очень нужная обработка. Переписала немножко, добавила то, что просил бухгалтер по ЗП. Теперь пользуются пользователи! Спасибо!