Отчет "Плановые начисления сотрудников"




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2026-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='\

20 Comments

  1. cerg110

    очень удобно, часто просят добавить или доработать.

    Reply
  2. Boroda

    Нужный отчётик! Девчатам из отдела труда должен понравиться. Спасибо. По скриншоту только не понял — данные берутся из штатного расписания или он тянутся из регистра сведений?

    Reply
  3. Beta

    Вопрос по скриншоту: доплата за ночные часы как плановое начисление???

    Reply
  4. NRG

    Да, доплата за ночные часы как плановое начисление.

    Reply
  5. gineich

    просто суперская вещь !!!!

    всем рекомендую

    вещь что надо, пользуюсь этим все лето

    для экономистов покатит

    Reply
  6. kdw

    для экономистов точо нужная вещь

    Reply
  7. lumenos

    наши экономисты были рады

    Reply
  8. petrakovam

    Очень хороший отчет,,,,мои расчетчики были очень рады

    Reply
  9. petrakovam

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

    Reply
  10. Dargh

    Спасибо, очень пригодился

    Reply
  11. camomile

    Спасибо!

    Reply
  12. Ulus

    Отчет немного некорректно работает:

    ВЫБОР

    КОГДА РаботникиОрганизации.ПериодЗавершения <= &парамДатаСобытия

    И РаботникиОрганизации.ПериодЗавершения <> ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)

    ТОГДА РаботникиОрганизации.ПодразделениеОрганизацииЗавершения

    ИНАЧЕ РаботникиОрганизации.ПодразделениеОрганизации

    КОНЕЦ КАК ПодразделениеОрганизации,

    Пример. Период завершения заполнен и дата меньше парамДатаСобытия то есть мы попадаем на ТОГДА РаботникиОрганизации.ПодразделениеОрганизацииЗавершения

    Но вид действия «Прекратить»

    А отчет благополучно выдает этот Вид расчета в список

    Reply
  13. Ulus

    я извиняюсь немного не так.

    ВЫБОР

    КОГДА РаботникиОрганизации.ПериодЗавершения <= &парамДатаСобытия

    И РаботникиОрганизации.ПериодЗавершения <> ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)

    ТОГДА РаботникиОрганизации.ПодразделениеОрганизацииЗавершения

    ИНАЧЕ РаботникиОрганизации.ПодразделениеОрганизации

    КОНЕЦ КАК ПодразделениеОрганизации,

    Это просто считываете текущее подразделение с работника.

    Работников работающих на дату отчета ты отбираешь

    Но в регистре сведения «Плановые начисления …»

    Есть такие действия как Прекратить и период завершение итп

    И там надо на них завязываться, а не просто левым совединением выдать то что дала виртуальная таблица среза последнх на дату.

    У тебя она выдаст запись, например, которой это плановое начисление и прекращалось как раз.

    Reply
  14. maestro_

    Спасибо! Отчет пригодился, но есть одно пожелание.

    пожелание: если использовать отбор по подразделению, то при выборе группы отчет не формируется, было бы здорово если обрабатывалась и текущая ситуация.

    Reply
  15. madtosser

    А он показывает персональные надбавки?

    Reply
  16. mamba

    Спасибо, пригодилось

    Reply
  17. anna_black

    Большое спасибо за отчет. Очень понадобился.

    Reply
  18. DarkAngel777

    Хороший отчет, спасибо. Если б еще группировал по дополнительным свойствам сотрудников, цены б не было

    Reply
  19. silver-747

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

    Reply
  20. b-dm

    Отчет работающий, что уже хорошо.Но многого не хватает…

    Reply

Leave a Comment

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