Отчет по очередным отпускам




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

35 Comments

  1. rdm

    «клетки этого цвета расшифруются» — использованные дни не расшифровываются!

    «годовые периоды работы» — не показывает периоды. Только сотрудник и дата приема. При «расшифровке» проваливаюсь в карточку сотрудника, а хотелось бы как раз периоды увидеть.

    Reply ↓
  2. 010280

    Да, желтая клетка где ФИО сотрудника выводит в карточку сотрудника в любом варианте.

    Если используется режим <По всем сотрудникам>, тогда Сводные данные, расшифровка

    Периодов в поле <Использовано>, то же самое, если сформирована в режиме <По списку сотрудников>, то выводится расклад всех периодов. А там увидите еще желтые клетки.

    Так как, модуле использованы стандартные параметры Журнала зарплата, то от релиза конфи не должен завесить , и использована локальная обработка ячейки. Я уж еще раз проверил. Если все таки проблемы вышли MD, протестирую.

    Reply ↓
  3. rdm

    Приношу свои извинения. Все работает. Видимо сбой был в программе. Обработка отличная. Спасибо!

    Reply ↓
  4. rimma_n

    Хорошая обработка. что примечательно, учитывает документы-исправления 🙂

    Reply ↓
  5. Nativan

    Удачная обработка! Спасибо, пригодилась.

    Reply ↓
  6. ju7ivanova

    Обработка понравилась.

    Но возник вопрос, почему ВНУТРЕНННЕМУ совместителю ставится половина отпуска?

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

    Насколько я понимаю требования ТК, человеку за год вне зависимости от количества мест работы и количества занимаемых должностей положено 28 к.д. отпуска.

    Reply ↓
  7. gucci76

    Можно подключить этот отчет без доработки документа «приказ по отпуску» используя механизм описанный здесь:

    http://infostart.ru/public/79583/

    Reply ↓
  8. 010280

    почему ВНУТРЕНННЕМУ совместителю ставится половина отпуска?

    Значит у него в истории 0.5 ставка

    28 к.д.,это у кого (учреждения, организации) сколько принято. Поэтому дни можно уточнить выбором.

    Reply ↓
  9. 010280
    gucci76 пишет:

    Можно подключить этот отчет без доработки документа «приказ по отпуску» используя механизм описанный здесь:

    http://infostart.ru/public/79583/

    Конечно.Внедри Константа.КаталогВнешнихФорм и включай Отчет по отпускам StarterExtForms.ert,

    Я лично это не использую, так и так приходится изменить конфи и лазит в допонительные возможности,

    а внедрил в Документе <ПриказОбУвольнении> установил кнопку <Поазать дни>, так как именно это место

    очень возмущает уволняющих.

    Reply ↓
  10. gucci76

    (9) Я конечно не настаиваю на (7). Но могу сказать несколько плюсов (7):

    1. Сделав 1 (ОДИН) раз изменение в глобальнике (2 места) и парочкой новых обработок можно к ЛЮБОМУ документу, без его изменения подключать различные отчеты и обработки, а возможности скрыты в них очень и очень большие, главное иметь прямые руки!!!

    2. Изменения в глобальнике позволяют немного убыстрится ЗиКу (для больших и медленных баз это заметно).

    Решать пользователю!

    Reply ↓
  11. 010280

    gucci76 Согласен.

    Reply ↓
  12. Ироида

    Спасибо! Очень пригодилась!

    Reply ↓
  13. Nady_71

    Хорошая обработка. Спасибо-очень пригодилась.

    Reply ↓
  14. TrinitronOTV

    спасибо за отчет

    Reply ↓
  15. kurvik

    Спасибо.Отчет интенсивно используют и бухгалтера и кадровики

    Reply ↓
  16. TrinitronOTV
    TrinitronOTV пишет:

    спасибо за отчет

    а у меня почему-то по некоторым документам начисления отпуска идёт задвоение количества использованных дней, а в расшифровке показывается два раза один и тот же документ

    Reply ↓
  17. 010280
    TrinitronOTV пишет:

    а у меня почему-то по некоторым документам начисления отпуска идёт задвоение количества использованных дней, а в расшифровке показывается два раза один и тот же документ

    (16) TrinitronOTV, (16) TrinitronOTV,

    Очень интересно. Причин может быть два: 1)База требует полной индексации, 2)запись в журнала ЗП Отпуска очередного является перерасчетом другой записи прошлого периода. Если последняя, то в модуле я его не учитывал,

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

    Reply ↓
  18. TrinitronOTV
    010280 пишет:

    TrinitronOTV, Очень интересно. Причин может быть два: 1)База требует полной индексации, 2)запись в журнала ЗП Отпуска очередного является перерасчетом другой записи прошлого периода. Если последняя, то в модуле я его не учитывал, просто живым примером не встречался в проведениях по отпускам.

    спасибо за разъяснение

    Reply ↓
  19. orsprog

    Обработка работает хорошо…а главное пригодилась на деле, спасибо

    Reply ↓
  20. keysnofelet

    спасибо, посмотрел один из вариантов

    Reply ↓
  21. Мать Тереза

    Спасибо, использовала,когда искала работников без отпусков- официально надо проводить отпуска ,а там по факту-как хотят.

    Reply ↓
  22. kler

    Спасибо, отличный отчет

    Reply ↓
  23. haous

    Спасибо. Собираюсь написать такой же отчет для ЗУП 82, может кто подскажет есть ли он уже реализован.

    Reply ↓
  24. Nikola178

    Спасибо, автору, отчет весьма хорош! но возник вопрос, учитывается ли отпуск за свой счет при расчете количества дней отпуска??

    Reply ↓
  25. 010280

    (24) Nikola178,

    Обработка называется <Отчет по очередным отпускам> и учет ведется по виду расчета <Отпуск очередной> из Журнала

    расчетов <Зарплата> и она дает возможность определить количество дней неиспользованного очередного отпуска для возмещения, в случае увольнения и т.п.. Отпуск за свой счет не относится к регламенту, это воля администрации и сотрудника и нет необходимости ввести учет по нему. Модуль открыто, и заменить отпуск очередной на отпуск за свой счет не представляет трудности.

    Другое дело, только недавно столкнулся ошибочным результатом при обращении функции <глПолучитьТаблицуИсторииРеквизитов>(глобальный модуль): если внештатника уволили и тут же приняли в штат, то выдается, что он не работает и соответственно чел-дни далее не нарастают. Пришлось добавить своею подобную функцию локально. Обновление выставлю как будет время и если не затормозят.

    Reply ↓
  26. 010280

    (24) Nikola178,

    Извините Никола, Я в торопясь с первого раза не совсем осознал суть вопроса <учитывается ли отпуск за свой счет при расчете…>, сегодня выставлю обновление, где предусмотрен флажок <Исключить Отпуска за свой счет из Отпускного стажа>. Конечно скорость обработки чуть повысилась, но выбор варианта предусмотрел и в расшифровке.

    Спасибо.

    Reply ↓
  27. JER_MARK

    Прикольно получается, если сотрудник принят на работу скажем в 69 году (ну бывают такие ветераны на предприятиях) ему стаж берется от 1969 года и неиспользованных отпусков — страшно сказать, более тысячи дней. Короче, надо как-то выкрутиться и ставить расчет количества дней выбирая между датой приема и началом учета в программе. Наверное так. Если дата приема < даты начала учета, то брать дату начала учета.

    Reply ↓
  28. gucci76

    ИМХО — лучше создать новый документ для остатков отпусков, а также реквизит у сотрудника или даже справочник, где хранятся дополнительные дни отпуска (например для северных районов или если должность позволяет или за ненормированный рабочий день).

    К этому отчету можно и расчет резервов прикрутить.

    Reply ↓
  29. NPMar

    Хорошая обработка. Спасибо! Надеюсь очень пригодится.

    Reply ↓
  30. 010280

    (27) JER_MARK,

    Спасибо, учел Ваше предложение и обновил, в моей практике такое не встречалось.

    Reply ↓
  31. 010280

    (28) gucci76,

    Мы тут работаем только типовой конфигурацией, модернизация — это другая тема.

    Reply ↓
  32. gucci76

    (31) Новые метаданные никак на типовизну (с точки зрения обновления) не влияют.

    Или у вас базовая?

    Reply ↓
  33. 010280

    (32) gucci76,

    Не издевайся, профессионал, не доведи до спама. (Для пользователей только отвечу, структуры конфигураций что проф, что базовая одинаковы).

    Reply ↓
  34. gucci76

    (33) С чего взял, что издеваюсь? Я серьезно. Кстати, я даже не настаивал, а высказал свое мнение (ИМХО).

    В базовую добавить ничего нельзя. А в проф можно. Что я без раздумья делаю, т.к. при обновлении это никак не сотрется. А типовые объекты 100 раз проанализирую прежде чем изменить.

    А в ЗИКе я давно уже «специалист» ))))

    Reply ↓
  35. skurser

    спасибо, полезная обработка

    Reply ↓

Leave a Comment

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