Остатки отпусков сотрудников для ЗУП




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

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

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

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

38 Comments

  1. mafia

    А под какой релиз ЗУП на платформе 82 сделано? У меня при открытии на ЗУП 2.5.33.4 вываливает ошибку:

    Ошибка в схеме компоновки данных

    по причине:

    Ошибка получения информации набора данных

    по причине:

    Ошибка в запросе набора данных

    по причине:

    {(158, 20)}: Поле не найдено «ГражданствоФизЛиц.НеЯвляетсяНалоговымРезидентомРФ»

    ГражданствоФизЛиц.<<?>>НеЯвляетсяНалоговымРезидентомРФ КАК ФизЛицоНеЯвляетсяНалоговымРезидентомРФ,

    Reply
  2. Lyuda11

    2.5.34.2 — аналогично

    Reply
  3. alexsy

    Тоже самое под 8.1 в ЗУП 2.5.33.4

    Reply
  4. SOAR

    Устранил ошибки. Сейчас должен работать на всех релизах в том числе на УПП и КА. Тестировалось в Комплексная автоматизация, редакция 1.1.6 — 8.2 и в ЗУП 2.5.33 — 8.1.

    Reply
  5. alexsy

    8.1 в ЗУП 2.5.33.4

    1. Пришлось добавить функцию, иначе не пашет.

    Функция ПолучитьПараметрыИсполненияОтчета() Экспорт

    СтруктураНатроек = Новый Структура();

    Возврат СтруктураНатроек;

    КонецФункции

    2. Показывает уволеных, ну это можно как фичу расматривать.

    3. Есть у меня пара человек с декретными отпусками, по ним типовой отчет криво остаток считает, еще не нашел почему. Этот отчет тоже один в один по ним кажет не правильный ответ.

    Reply
  6. qwerty2020

    не понятно, просто пустая обработка, что для 8.1 что для 8.2

    Reply
  7. r32f23

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

    Reply
  8. Vida

    (5) alexsy 12.05.11 6:44 писал

    2. Показывает уволеных, ну это можно как фичу расматривать.

    У меня с уволенными все хорошо. Когда стоит отбор «не показывать» — не показывает. Может уже поправили?

    Reply
  9. lookindenis

    кхмм…

    уж не знаю почему, но в поле «оклад тарифная ставка»

    у меня надпись- «Оклад по часам» или «Оплата по часовому тарифу»



    и ссылки на вид расчета =))

    потом гляну что не так)

    и надо б добавить поле «средний заработок» и «сумма резерва»

    а так — спс =)

    Reply
  10. oska2000

    не могу понять почему какая-то абра-кадабра открывается?

    Reply
  11. berz

    Обработка настроена на объект — справочник «Остатки отпусков». У нас он пустой. В результате получается ерунда. Можно ли настроить этот отчет на справочник «Остатки отпусков организаций» или сделать еще одну обработку с этим объектом?

    Reply
  12. Holly-khv

    У нас обработка работает как надо. Кадровики счастливы, теперь им не надо по каждому работнику отдельно выводить справку по отпуску.

    Reply
  13. Famza

    ЗУП 2.5.37.1 на платформе 8.2.14.533 — все работает. А этот отчет — переделанный типовой?

    Reply
  14. Fish_ka

    Очень полезный отчет. У нас отдел кадров до этого практически вручную эти остатки отслеживал, по каждому сотруднику отдельно. А когда стали резервы на оплату отпусков создавать, пришлось порядок наводить- отчет очень пригодился. А бухгалтерия им теперь пользуется, чтобы резервы считать.

    Reply
  15. alexsiswx

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

    Reply
  16. Bruk

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

    Reply
  17. didol3

    Хороший отчет. Бухи очень довольны. Упростили работу по подсчету резервов.

    Reply
  18. LevSon

    не понятно, просто пустая обработка, что для 8.1 что для 8.2

    Reply
  19. Jancoy

    (12) Holly-khv, а наши кадровики от этого отчета пришли в ужас. истерики и вой «я не понимаю что он мне тут пишет», я не вижу за какой рабочий год, ничего не вижу, ничего не понимаю. возможно есть смысл немного побольше информации выводить? тот же «рабочий год»? а нет, так и суда нет, у всех свои заморочки на работах. автору за труд все равно спасибо

    Reply
  20. yalo

    Используем стандартные отчеты, но вашу обработку тоже попробуем

    Reply
  21. Спасибо за полезный отчет

    Reply
  22. fiyona
    lookindenis пишет:

    кхмм…

    уж не знаю почему, но в поле «оклад тарифная ставка»

    у меня надпись- «Оклад по часам» или «Оплата по часовому тарифу»

    и ссылки на вид расчета =))

    потом гляну что не так)

    и надо б добавить поле «средний заработок» и «сумма резерва»

    а так — спс =)

    Показать

    Среднего, действительно не хватает.

    Reply
  23. profych1

    Классный отчет. Чуть доработал и на ура пришлось

    Reply
  24. kot24147

    очень полезная обработка!в типовой ЗУПе выводит все что необходимо

    Reply
  25. Гость

    А под какой релиз ЗУП на платформе 82 сделано?

    Reply
  26. Гость

    а наши кадровики от этого отчета пришли в ужас. истерики и вой «я не понимаю что он мне тут пишет», я не вижу за какой рабочий год, ничего не вижу, ничего не понимаю. возможно есть смысл немного побольше информации выводить?

    Reply
  27. yegorZ

    Да, не учитывает справочник «Остатки отпусков организаций»

    Reply
  28. vvsokolov

    (27) yegorZ,

    замените строку

    ВыборкаПоОстаткам = ПроцедурыУправленияПерсоналом.ПодготовитьДанныеПоРегламентированнымОтпускам(ТаблицаСотрудников,,Ложь,);

    на строку

    ВыборкаПоОстаткам = ПроцедурыУправленияПерсоналом.ПодготовитьДанныеПоРегламентированнымОтпускам(ТаблицаСотрудников);

    потому что:

    Функция ПодготовитьДанныеПоРегламентированнымОтпускам(

    ТаблицаПериодов, // Таблица периодов, для которой рассчитываем данные по отпускам

    Регистратор = Неопределено, // Регистратор, которым списывается отпуск

    ИспользоватьОстатки = Истина, // Ложь только в случае, если необходимо пересчитать остатки из формы элемента справочника остатков

    ВключатьТекущийРабочийГод = Истина // Значение Истина должно быть установлено всегда, когда передается регистратор

    ) Экспорт

    Reply
  29. katun

    Я тоже считаю, что это полезный отчет, т. к. упрощает и ускоряет работу для работников бухгалтерии и отдела кадров

    Reply
  30. v.kov945

    Пустой отчет. Неучитывает введенные остатки отпусков, показывает уволенных, неясно под какой релиз сделан.

    Reply
  31. hasp_x

    чет уволенных показывает

    Reply
  32. hasp_x

    с пустой датой отчет показывает сотруднику 3 дня, при этом в шапке выводит «отчет на дату 30.05.12» Ставлю конкретно дату 30.05.12, сотруднику показывает уже 8 дней

    Reply
  33. Raminus

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

    Reply
  34. vechiy

    (33) Как исправить эту ошибку? Переименована процедура? Или изменен сам принцип расчета остатков?

    Ошибка:

    {ВнешнийОтчет.ОстаткиОтпусковСотрудниковОрганизации.МодульОбъекта(180)}: Метод объекта не обнаружен (ПодготовитьДанныеПоРегламентированнымОтпускам)

    ВыборкаПоОстаткам = ПроцедурыУправленияПерсоналом.ПодготовитьДанныеПоРегламентированнымОтпускам(ТаблицаСотрудников,,Ложь,);

    Reply
  35. Raminus

    (34) vechiy, Да насколько я понял, принцип изменен, процедуры такой больше нет, добавлен новый модуль ОстаткиОтпусков, теперь все там.

    Reply
  36. rodoz32

    Спасибо,надо попробовать

    Reply
  37. Alex_ao

    .Сотрудник.Организация не верно

    Нужно .Сотрудник.ОбособленноеПодразделение

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

    Reply
  38. margo_m09

    Можно такой вопрос задать: Может ли отчет, например, показать мне остаток отпуска при следующих условиях: Сотрудник работает с 22.02.2014 по сегодняшний день накопилось 26 дней отпуска, в августе брал неделю отпуска, как сделать, чтобы отнимал от 26 14 дней, уже использованных. Отчет отнимет от 26 14 дней и покажет результат?

    Reply

Leave a Comment

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