<?php // Полная загрузка сервисных книжек, создан 2025-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) 105raz, удаляется. Регистр сведений хранящий лицевые счета непериодический, а в конфигурацию мы изменений не вносим.
(2) 105raz, у меня нет — с этим как-то справляется отдел кадров в ворде и экселе.
А есть возможность добавить проверку…
Если разделить ведомость, сохранить, а потом повторно разделить — создаются дубли ведомостей по банку.
+ есть сотрудники, которые получают деньги через кассу, в этом случае в комментариях всегда ошибка распределения.
(4) logdog, У меня дубли только в комментариях создаются. Документ остается неизменным. Второй не появляется. Если у Вас не так пишите, последовательность и результаты подробней.
С комментариями, согласен, не аккуратненько получилось. Поправлю.
Ошибка распределения по банкам, для людей не имеющих лицевого счета — это правильно 🙂 Вас смущает комментарий в документе, в котором они остаются? Давайте вместо «Ошибки распределения по банкам» напишем «Не удалось распределить по банкам»? Или могу вообще не писать никаких комментариев.
(5) 2.5.68.1
Зарплата к выплате — заполнить — разделить ведомость — сохранить. В итоге имеем 2 зарплаты к выплате.
Повторное заполнение зарплаты к выплате — разделение — сохранить. В итоге имеем 3 зарплаты к выплате (два дубля).
По поводу комментарием, даже не знаю. У Вас, возможно, нет сотрудников, кто получает деньги из кассы, в этом случае коммент нужен, а для тех у кого есть — он излишен.
Ага. Понял. Проверку для такой ситуации воткнуть можно, но что делать с документом, который повторно заполнили и пытаются разделить? Вывести сообщение «вы уже пилили этот документ» и ничего не делать?
Ну можно ввести еще свойство «получает деньги в кассе», но проще завести «банк» с названием «касса» и проставить всем сотрудникам получающим деньги в кассе лицевой счет «1». После чего в ошибках будут оставаться только те у кого больше одного счета и не выбран основной. А в ведомости на выплату через банк «касса» нужно будет перещелкунть «через банк» на «через кассу».
Замечательная вещь. Единственно пришлось еще раз руками выбрать что выплата через банк, для отображения поля банка.
(8) Manoshkin, Опишите последовательность действий, после которых нужно еще раз выбирать руками вариант — у меня не получается.
(9) Версия ЗУП 2.5.69.2 создали документ «Зарплата к выплате» указали «Способ выплаты» «через кассу». Далее «заполнить», «разделить ведомость по банкам». Через кассу никого нет. Ведомость остается открытая. Способ выплаты меняется на «Через банк», в комментарии банк указан, а (по крайней мере в изначальной ведомости) напротив «Способ выплаты»»Через банк» пусто. Руками заходим в поле «Способ оплаты» и еще раз подтверждаем «через банк». Выскакивает надпись «Банк:» и наименование банка. Возможно просто разделяемом уже открытом документе видимости полей не хватает.
Спасибо. ПЛЮС. Идея очень хорошая. Попробую использовать в УТП для Украины.
Только вот найду время на «напильник».
Спасибо автору. Переходим с 1С7.7:ЗИК на 1С8:ЗУП, понадобилось перенести имеющиеся в 7 доработки. Бухи, думаю, еще оценят автоматическое деление ведомостей и выгрузку в зависимости от банка. А от меня спасибо за лаконичный структурированный код и оригинальное (для меня, так как в 8 пока только ученик…) использование внешних обработок.. Жаль, нет заявок на открытие счетов, был бы полный комплект.. Трудолюбивые у вас кадры… У нас единственный бух по ЗП занимается всем этим, причем для десяти организаций, поэтому в 7.7 и реестр на выпуск, и на изменение данных держателей (ГПБ уж сильно много хочет знать), и реестр уволенных формировали программно…
(12) bnk72, Реестры в банки у нас формируют настройкой отчета по сотрудникам: там через ключик гаечный можно добавить и убавить все что угодно.
ПлАчу….Почему же этот добрый человек не пишет такую красоту для ЗУП 3.1 ?
(14) Ну почему же сразу не пишет? ) Не выкладывает. Не выкладывает потому что смартманей ему больше не нужно, А за рубли, наверняка, никто не купит )
(15) Может и купили бы, но как-то связка Инфостарт-Работодатель не работает, а программист — не альтруист, у него только смартмани и есть, причем очень немного 🙂 А за сколько рублей продаете? Кстати, благодарность пользователей тоже бывает очень приятна… 😉