<?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='\
Спасибо! Молодец! Только вот небольшое замечаньице: стаж в разделе II теперь считается не общий или страховой, а стаж работы на предприятии.
Спасибо!
К сожаленью, не получил все результаты по отчету. Дело в том, что категории сотрудников в нашей конторе отличаются от стандартного набора. К примеру, имеются «Рабочие основные» и «Рабочие вспомогательные» и т.п.
Скажите, есть ли возможность изменить отчет так, чтобы «неизвестные категории» воспринимались как стандартные.
(1) точно? проверила еще раз — стаж страховой печатается, т.е. тот, котрый указан у сотрудника в поле «Страховой стаж»
(2) только рабочие у вас нестандартные? можно сделать, чтобы если категория не из списка, то все попадали в рабочие. Так пойдет?
(1) извините, я думала, что печатает не страховой, а нужно страховой — точно, нужно на предприятии, не доглядела, сейчас исправлю:)
У нас есть ещё категории НаучныеИПедагогические — пришлось добавить к вашим, и военнослужащие, поэтому когда вы проверяете ПриказОПриеме.ВидРаботы выдает ош, лучше использовать Сотрудник.ОсновнойЭлемент для выявления внутр. совместителей
(6) не знаю, у нас есть внутренние совместители — никаких ошибок не выдало. Может, напишите код ошибки?
да внутр.-то у нас тоже полно, но у военнослужащих другой приказ о приеме на работу и там нет реквизита ВидРаботы, поэтому ош — не находит реквизит, но т.к. они тоже должны войти в отчет, то я проверяю
Если Сотрудник.ОсновнойЭлемент<>Сотрудник
Продолжить;
КонецЕсли;
если у вас нет военных, то вам это и не мешает и все будет нормально
(8) точно:( я про это знала, но военных нет и из памяти выветрилось:( я так понимаю, вы уже переделали, а через 4 дня отчет уже будет неактуален — закончится срок сдачи:( если еще кто-то попросит, переделаю, спасибо за подсказку:)
(4) Категории сотрудников остались с прошлых лет:
Научные и научно-педагогические работники
Прочие служащие
Рабочие
Руководители
Специалисты
РабочиеОсновные
РабочиеВспомогательные
РуководителиАдмин
СпециалистыАдминистр
Из них используются: Прочие служащие, Руководители, Специалисты, РабочиеОсновные, РабочиеВспомогательные
(4) Получается, что только «рабочие» у нас нестандартные
я извиняюсь может я чего то непонемаю…
поставил отчет ваш экономисты принесли мне данный и говорят что у них Работников гораздо больше отработавших полный месяц 324 а отчет показывает 190 почему то… может условия непрвавельное которое осущетвляет проверку по дням ? если и такие кто отработал в месяц 23 дня из 22 дней что можно с этим сделать ?
(11) посмотрите расшифровку — там есть список отработавших полностью, пусть кадровики хотя бы одного человека не попавшего в список, дадут, посмотрите, почему не попал, кто в месяц 23 из 22 — должны попадать — в отчете условие что если рабочих дней больше, чем отработанных, тогда не включать. В отработанные дни попадают оплата по табелю (окладу, дням, часам) + командировки
просто есть такие кто отработал больше чем 22 дня тоесть 23 дня переработки и они туда не попадают ((( почему то…
или так и должно быть ?
(14) должны вообще-то, условие в отчете не на равно:
Если ТЗОтработавших.РабочихДней > ТЗОтработавших.ОтработаноРабочихДней Тогда
ТЗОтработавших.УдалитьСтроку();
КонецЕсли;
попробуйте закомментарить эти строки и посмотреть по расшифровке (выведутся все работавшие)- сколько у не попавших рабочих дней по календарю и фактически отработано
вы не поняли… ставит календарных дне больше работниками не которым какая то проблема в календарях не могу разобраться почему
в «справочно», там где полностью отработавшие попадают внешние совместители. Нужно в «среднесписочной», когда формируете СписокСотров сразу убрать НеОсновных
(16) «дне больше работниками не которым» трудно вообще понять о чем речь
(17) да, если шел выбор не по всем, а по подразделению — было такое:( исправила, отчет перезалила
(3) Я и говорю, что страховой. А надо — стаж работы на предприятии (посмотрите саму таблицу II в приказе). Это не одно и то же. У сотрудник стаж страховой может быть 20 лет, а на данном предприятии всего 2 года.
================================
Я, например, скорректировал ваш модуль, добавив функцию:
///=========================================================
Функция ОпределитьСтаж(Человек)
НаДату = КонМесяца(ДатаКон);
СтажПредпр = глСтажРаботыНаПредприятии(Человек,НаДату);
// маловероятно, конечно, но всё ж…
Если ПустоеЗначение(СтажПредпр) = 0 Тогда
Стаж = глРазложить(СтажПредпр,» «);
Годиков = Стаж.ПолучитьЗначение(1);
Месяцев = Число(Стаж.ПолучитьЗначение(3));
МесВДесятке = Окр((Месяцев*10)/12,0);
Стажж = «»+Годиков+».»+МесВДесятке+»»;
Иначе
Сообщить(«А «+Человек+» работает на предприятии??»);
Стажж = «Н»
КонецЕсли;
Возврат Стажж;
КонецФункции // ОпределитьСтаж
(2) Господи, какие проблемы-то?! У меня тоже вспомогательныеи основные. Замените в модуле «Рабочие» на «Рабочие основные» и «Рабочие вспомогательные», если понимаете, конечно, где и что надо менять. Ну, и перечисления соответствующие вставьте…. И всё будет работать нормально.
(20) я уже тоже исправила:)
У меня в сумму надбавок попадает оклад, и сумма всего получается больше, на сумму оклада….
(23) вид расчета оплата по окладу? а когда готовим данные для 2 раздела он там есть?
Да есть.
И получается, что оклад/тариф попадает и в 9 колонку, и в 11. соответственно, в колонке 8 сумма больше на величину оклада. И это я проверил на 2 разных базах.
в процедуре подготовитьданные() нужно добавить оплату по тарифу и оплату по табелю — или снять галочки у этих видов расчета в форме- кстати, за основу я брала вашу форму:) попробуйте, напишите, прошло или нет — не могу попробовать, у нас только по окладу оплата
Ну я-то исправил у себя: там, где идет выборка Надбавок, я вставил проверку на основной вид заработка, командировку и т.п., как строчками выше. И все.
А нет новой формы от 20 июля 2011 года?
к сожалению, все — перешла на 8:( так цифры можно взять отсюда и забить в новую форму — это же не каждый месяц делать
Спасибо, пригодилась. Не знала с какой стороны подойти, да еще «надо было еще вчера», а тут все готово. Немного 6 графу сгруппировали по-новому, а в остальном — отличие 2013 от 2009 в паре слов…