Расчет резерва неиспользованных отпусков для ЗУП и УПП




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

21 Comments

  1. TrinitronOTV

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

    Reply
  2. VIPchik

    (1)Используется типовая процедура расчета среднего заработка для начисления отпуска. То есть все начисления сотрудника за год за минусом не входящих в базу расчета отпусков делят на количество дней в году

    Reply
  3. gull22

    С учетом ограничения по договорникам, нет планов формировать отчет только по сотрудникам с трудовым договором?

    Reply
  4. VIPchik

    Исправил, спасибо за мысль, что-то сам не сообразил.

    Reply
  5. maxDenikov

    На ЗУП 8.2 будет работать?

    Reply
  6. VIPchik

    Проверил, работает

    Reply
  7. trigon33@mail.ru

    Ошибка при выполнении файловой операции ‘C:UsersBuhDesktopРезерв отпусков.epf’

    по причине:

    Неверный формат хранилища данных ‘file://C:/Users/Buh/Desktop/Резерв отпусков.epf’

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

    Платформа 1С:Предприятие 8.2 (8.2.18.109)

    Reply
  8. VIPchik

    (7) trigon33@mail.ru, а у Вас программа запускается в режиме тонкого или толстого клиента?

    Reply
  9. trigon33@mail.ru

    Толстый клиент

    Reply
  10. trigon33@mail.ru

    Под тонким клиентом тоже самое.

    Reply
  11. VIPchik

    Попробуйте файл переложить с рабочего стола например на диск D, и если не поможет, может быть файл криво скачался, дайте E-mail я в четверг вышлю файл.

    Reply
  12. ccm

    (2) VIPchik, «все начисления сотрудника за год за минусом не входящих в базу расчета отпусков делят на количество дней в году». Коэффициент 29,3 используется?

    Reply
  13. VIPchik

    (12) ccm, нет, коэффициент 29,3 не используется, отчет сумму начислений делит на количество дней в году 365, то есть среднее количество дней в месяце 365/12=30,4.

    Reply
  14. ccm

    т.е средний рассчитывается не по правилам для оплаты отпуска?

    Reply
  15. VIPchik

    (14) ccm, Простите, я посмотрел внимательно, я перепутал отчеты, в этом отчете используется типовая процедура расчета среднедневного заработка и если у вас конфигурация не сильно древняя, то считается с учетом коэффициента 29,3. То есть если документ начисление отпуска считает правильно, то и этот отчет считает правильно.

    Reply
  16. megatrend

    Мне кажется, идеологически неправильно округлять остаток дней неиспользованного отпуска до целых дней, в то время как среднедневной заработок (на который умножается округленный остаток дней) считается с точностью до копеек!

    Reply
  17. VIPchik

    (16) megatrend, идеологически может быть и не правильно, но как минимум бухгалтерии двух заводов просили именно так.

    Reply
  18. k

    Не работает на ЗИКБУ((((а жаль , выдает ошибку:{Форма.Форма.Форма(4)}: Поле объекта не обнаружено (Хозрасчетный)

    СтчетДТ=ПланыСчетов.Хозрасчетный.ПустаяСсылка();

    Reply
  19. Gayana

    Спасибо за обработку! Очень выручили))) Все корректно работает.

    Reply
  20. annasm@inbox.ru

    Добрый день, будет ли отчет работать для ЗУП 2.5.111.1?

    Я бы приобрела такой отчет, но баланса не хватает, а абонемент покупать не хочется (((. Что делать?

    Reply
  21. serg76

    (20)

    anna sm, лучше обратите внимание на эту обработку — http://infostart.ru/public/119889/

    Это, по-моему мнению, самая мощная и функциональная обработка по расчету резерва.

    Reply

Leave a Comment

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