Остатки отпусков сотрудников организаций (ЗУП 2.5)




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

43 Comments

  1. gutentag

    Очень полезный отчет, отдел кадров пищит от восторга!

    Reply
  2. Armando

    Скоро можно будет увидеть остаток/перерасход отпуска в суммовом выражении.

    Reply
  3. isn

    отчет у меня работает с ошибками и некорректно считает остатки отпусков. наверное потому что работников больше 1000. 😎 поставил плюс за «заготовку» отчета.

    Reply
  4. SternZ

    К сожалению,

    {ВнешнийОтчет.ОстаткиОтпусковСотрудниковОрганизации(95)}: Ошибка при вызове метода контекста (Выполнить): Ошибка выполнения запроса «Ошибка при выполнении операции над данными:

    Microsoft OLE DB Provider for SQL Server: Adding a value to a ‘datetime’ column caused overflow.

    HRESULT=80040E07, SQLSrvr: Error state=1, Severity=10, native=517, line=1

    »

    Запрос.Выполнить();

    по причине:

    Ошибка выполнения запроса «Ошибка при выполнении операции над данными:

    Microsoft OLE DB Provider for SQL Server: Adding a value to a ‘datetime’ column caused overflow.

    HRESULT=80040E07, SQLSrvr: Error state=1, Severity=10, native=517, line=1

    »

    по причине:

    Ошибка при выполнении операции над данными:

    Microsoft OLE DB Provider for SQL Server: Adding a value to a ‘datetime’ column caused overflow.

    HRESULT=80040E07, SQLSrvr: Error state=1, Severity=10, native=517, line=1

    Reply
  5. Armando

    (3) «В отчете используется типовой механизм расчета остатков дней отпуска» можете писать в 1С, это все они))) если исправят процедуру расчета, то в отчете это отразится.

    Reply
  6. Armando

    (4) только что протестировал. платформа 8.1.12.101, ЗУП 2.5.10.11, SQL 2005. Ошибок нет.

    огласите версию платформы и SQL, пожалуйста. и способ реализации ошибки.

    Reply
  7. Armando

    (4) кстати, корректно ли у вас работает отчет «Списки работников организаций»?

    Reply
  8. SternZ

    (7) 8.1.12.101 ЗУП 2.5.12.1 SQL 2000 SP3

    Reply
  9. SternZ

    Подключаю как дополнительный внешний отчет. Можно выбрать как-то организацию ?

    Reply
  10. SternZ

    Вопрос по выбору организации снимаю 🙂 Списки работников организаций — работает нормально

    Reply
  11. Armando

    сегодня протестировал на sql 2000 sp2, отчет сформировался без ошибок. даже не знаю, чем помочь. буду подумать.

    Reply
  12. SternZ

    Это не может помочь ?

    http://itland.ru/forum//index.php?showtopic=13292

    Reply
  13. iaa

    обрадовался. поставил. в итоге ошибка:

    {ВнешнийОтчет.ОстаткиОтпусковСотрудниковОрганизации(95)}: Ошибка при вызове метода контекста (Выполнить): {(7, 9)}: Поле не найдено «ПлановыеНачисленияРаботниковСрез.ВидРасчета»

    ИНАЧЕ <<?>>ПлановыеНачисленияРаботниковСрез.ВидРасчета

    Запрос.Выполнить();

    по причине:

    {(7, 9)}: Поле не найдено «ПлановыеНачисленияРаботниковСрез.ВидРасчета»

    ИНАЧЕ <<?>>ПлановыеНачисленияРаботниковСрез.ВидРасчета

    в наличии

    1С:Предприятие 8.1 (8.1.11.67)

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

    Reply
  14. Armando

    Нужна платформа 8.1.12.101

    Reply
  15. elenavv@inbox.ru

    Очень замечательный отчет. очень понравился. Но маленький недочет, который пугает ))) не правильность происходит с сотрудниками, которые находятся(находились) в декретном отпуске. за 3 года проведенные в декрете отчет смело добавляет в остаток 84 дня (28*3)

    Reply
  16. Bell

    Еще проблема -более 14 дней в году за свой счет (уменьшает отпуск)

    Reply
  17. SkyAVS

    > Еще проблема -более 14 дней в году за свой счет (уменьшает отпуск)

    Так ведь по ТК РФ и должен уменьшать. Или отчет таки НЕ уменьшает?

    > за 3 года проведенные в декрете отчет смело добавляет в остаток 84 дня (28*3)

    Этот отчет здесь, вероятно, не причем. Стандартные расчеты ЗУП дали мне такой же результат. Видимо надо или регламентный алгоритм 1С править или руками вычитать…

    Reply
  18. rasswet

    по 300 сотрудникам без доп настроек работал долгонько (сек 10) на не слабой машине, а хотелось бы секунды две)))

    но это мелочи!

    Спасибо!

    Reply
  19. elvi

    а у меня выдает ошибку «не найдено поле ПлановыеНачисленияРаботниковСрез.ВидРасчета»… в чем проблема?

    Reply
  20. magvay_k

    Этот отчет не учитывает заполненный справочник, «остатки отпусков прошлых лет». В следствии этого, неправильно считает остаток отпуска.

    Reply
  21. pavlika

    Спасибо, но поскольку базу перенесли с 7-ки, то использовали «остатки отпусков прошлых лет» — с ними считает неправильно..

    Reply
  22. johnson@mail.ru

    Ошибку: «Ошибка при выполнении операции над данными:

    Microsoft OLE DB Provider for SQL Server: Adding a value to a ‘datetime’ column caused overflow» из-за MS SQL, т.к. иногда получается слишком длинный запрос который скуль не всилах принять полностью. После перевода на Postgree все заработало, на файловой версии тоже все работает.

    Reply
  23. apatyukov

    А как глянуть за какой период работы этот остаток висит?

    Reply
  24. aparnikov_ve

    а для ЗиК 7.7 есть нечто подобное?

    Reply
  25. 666Oleg666

    Отчет работает отлично.

    Но вот возник вопрос как туда впихнуть Дополнительные дня отпуска для людей радей работающих ненормированный рабочий день

    Reply
  26. глюкер

    Тоже вылетает ошибка SQL с вышеуказанным сообщение.

    Причина:

    Microsoft OLEDB Provider for SQL Server: Adding a value to a ‘datetime’ column caused overflow. HRESULT=80040E07, SQLSTATE=22077, native=517

    Возникает при выполнении функций над датами в том случае, если в качестве их результата получается слишком большая или слишком маленькая дата. Для Microsoft SQL Server минимально допустимой является дата 1 января 1753 года, а максимально допустимой — 31 декабря 9999 года.

    Значит где-то у кого-то в используемых в запросе полях скорее всего незаполнено значение дат (00010101000000 =))))

    Reply
  27. СуперСтар

    ЗУП 2.5.14. На каждого сотрудника отчет выводит две строки с видом отпуска Основной и Дополнительный соответственно. У каждой строки свой остаток дней. Чтобы это значило?

    Reply
  28. СуперСтар

    Так что, в последних редакциях ЗУП у вас отчет работает нормально? Дайте свежие отзывы…

    Reply
  29. Armando
  30. sv1233

    Подскажите, как установить этот отчет. Пишит, что он не является внешним отчетом или не предназначен для этой конфигурации. У меня конфигурация 8.1.13.41. Номер версии 2.5.17.8

    Reply
  31. fedor40

    2.5.21 на 8.2.10 после конвертации и открытия пишет

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

    по причине:

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

    по причине:

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

    по причине:

    {(140, 21)}: Поле не найдено «СоставСемьиФизлица.ГодРождения»

    СоставСемьиФизлица.<<?>>ГодРождения КАК ФизЛицоГодРожденияРодственника,

    Reply
  32. ikot

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

    Reply
  33. Intimatik

    хорошая заготовка, не боле

    Reply
  34. msmaiorka

    спасибо, наконец-то хоть одна из множества подобных обработок считает правильно 😀

    Reply
  35. elisK

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

    Reply
  36. eli1984

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

    Reply
  37. Risa

    (32) так, к сожалению, и не сообщил, работает ли отчет на 8.2. По внешнему виду такой простой и понятный отчет, очень нравится. И очень хочется такой, с суммированием дней по подразделению, а не встроенную обработку, из которой неудобно копировать и складывать нужно к Excel’е. Хотелось бы запустить его на 2.5.41.3. Или это фантастика? Или, может, Остатки отпусков сотрудников организации. С деньгами!!! будет работать с 8.2? В общем, я в сомнениях =( Поделитесь опытом, если не сложно.

    Reply
  38. m-xolding

    Очень пригодилась! Большое спасибо автору! Удачи Вам!

    Reply
  39. Risa

    Да, действительно, на 8.2 отчет не работает, ругается на ФизЛицоГодРожденияРодственника =(

    Reply
  40. yalo

    В отчете , на мой взгляд, не хватает колонок даты окончания рабочего периода и остатка на эту дату. Но в целом отчет пригодился. спасибо

    Reply
  41. sinQio

    С какой целью при расчете остатка отпуска в запросе прописан сбор посторонней информации, например

    СоставСемьиФизлица.СтепеньРодства КАК ФизЛицоСтепеньРодства,
    СоставСемьиФизлица.Имя КАК ФизЛицоИмяРодственника,
    СоставСемьиФизлица.ГодРождения КАК ФизЛицоГодРожденияРодственника,
    ВЫБОР
    КОГДА СоставСемьиФизлица.ГодРождения = 0
    ТОГДА 0
    ИНАЧЕ ГОД(&Период) — СоставСемьиФизлица.ГодРождения
    КОНЕЦ КАК ФизЛицоВозрастРодственника,
    ОбразованиеФизлица.ВидОбразования КАК ФизЛицоВидОбразования,
    ОбразованиеФизлица.УчебноеЗаведение КАК ФизЛицоУчебноеЗаведение,
    ОбразованиеФизлица.Специальность КАК ФизЛицоСпециальность,
    ОбразованиеФизлица.Диплом КАК ФизЛицоДиплом,
    ОбразованиеФизлица.ГодОкончания КАК ФизЛицоГодОкончания,
    ОбразованиеФизлица.Квалификация КАК ФизЛицоКвалификация,
    ТрудоваяДеятельностьФизлица.Организация КАК ФизЛицоТД_Организация,
    ТрудоваяДеятельностьФизлица.ДатаНачала КАК ФизЛицоТД_ДатаНачала,
    ТрудоваяДеятельностьФизлица.ДатаОкончания КАК ФизЛицоТД_ДатаОкончания,
    ТрудоваяДеятельностьФизлица.Должность КАК ФизЛицоТД_Должность,
    ЗнаниеЯзыковФизлица.Язык КАК ФизЛицоЯзык,
    ЗнаниеЯзыковФизлица.СтепеньЗнанияЯзыка КАК ФизЛицоСтепеньЗнанияЯзыка,
    ПаспортныеДанныеФизЛиц.ДокументВид КАК ФизЛицоДокументВид,
    ПаспортныеДанныеФизЛиц.ДокументСерия КАК ФизЛицоДокументСерия,
    ПаспортныеДанныеФизЛиц.ДокументНомер КАК ФизЛицоДокументНомер,
    ПаспортныеДанныеФизЛиц.ДокументДатаВыдачи КАК ФизЛицоДокументДатаВыдачи,
    ПаспортныеДанныеФизЛиц.ДокументКемВыдан КАК ФизЛицоДокументКемВыдан,
    ПаспортныеДанныеФизЛиц.ДокументКодПодразделения КАК ФизЛицоДокументКодПодразделения,
    ГражданствоФизЛиц.Страна КАК ФизЛицоСтрана,
    ГражданствоФизЛиц.НеИмеетПравоНаПенсию КАК ФизЛицоНеИмеетПравоНаПенсию,
    ГражданствоФизЛиц.НеЯвляетсяНалоговымРезидентомРФ КАК ФизЛицоНеЯвляетсяНалоговымРезидентомРФ,
    ВоинскийУчет.ОтношениеКВоинскойОбязанности КАК ФизЛицоОтношениеКВоинскойОбязанности,
    ВоинскийУчет.ОтношениеКВоинскомуУчету КАК ФизЛицоОтношениеКВоинскомуУчету,
    ВоинскийУчет.Годность КАК ФизЛицоГодность,
    ВоинскийУчет.Звание КАК ФизЛицоЗвание,
    ВоинскийУчет.ЗабронированОрганизацией КАК ФизЛицоЗабронированОрганизацией,
    ВоинскийУчет.НаличиеМобпредписания КАК ФизЛицоНаличиеМобпредписания,
    ВоинскийУчет.Военкомат КАК ФизЛицоВоенкомат,
    ВоинскийУчет.ВУС КАК ФизЛицоВУС,
    ВоинскийУчет.КатегорияЗапаса КАК ФизЛицоКатегорияЗапаса,
    ВоинскийУчет.Состав КАК ФизЛицоСостав,
    ВоинскийУчет.НомерКомандыПартии КАК ФизЛицоНомерКомандыПартии,
    СемейноеПоложениеФизЛиц.СемейноеПоложение КАК ФизЛицоСемейноеПоложение,
    

    Показать

    под Зарплата и Управление Персоналом (2.5.33.4)не работает… жаль что потратила время и рейтинг на этот отчет

    Reply
  42. lees

    Отчет мне оказался полезным — на его базе сделал нужный мне. Также интересен был код. Спасибо!

    Reply
  43. vechiy

    Как исправить следующую ошибку?

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

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

    метод удалили в новом релизе, а другой не добавили?)

    Reply

Leave a Comment

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