Загрузка табеля учета рабочего времени из файла Excel




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

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

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

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

65 Comments

  1. Ulfhedhinn

    Спасибо! Как по заказу, как раз подобную фишку нарисовать попросили 😀 Как руки дойдут отпишусь на сколько понравилось

    Reply
  2. smooth

    Буду рад, если хоть чем-то поможет 🙂

    Reply
  3. DarkAn

    Загрузка табеля для 7.7 может тоже кому пригодиться 😉

    http://infostart.ru/public/19759/

    (0) Кстати, если реализуешь, формирование бланка табеля со списком людей буду ООООООчень благадарен, т.к. самому писать не придеться 😀

    А вообще если есть желание и возможность посмотри может тоже какие идеи подчерпнешь

    Reply
  4. L_Slavon

    Обработка не запускается ЗУП 2.5.18.2 ошибка

    {ОбщийМодуль.НастройкаПравДоступаПереопределяемый(468)}: Поле объекта не обнаружено (Проведение)

    ПараметрыПроверкиДокумента.Вставить(«ПроверятьПроведениеДокумента», (МетаданныеДокумента.Проведение = Метаданные.СвойстваОбъектов.Проведение.Разрешить));

    Reply
  5. sergey-201

    Хорошая мысль, значительно облегчит труд кадровика. Жаль что для УПП не подходит….

    Reply
  6. natarezn

    спасибо я сделаю такую на семерке..

    Reply
  7. smooth

    (4) это в какой момент вываливается? в момент открытия, при загрузке или при создании документа?

    (5) под УПП, скорее всего, надо некоторые общие функции переопределить (названия общих модулей или функций скорее всего отличаются)

    (6) не стоит, здесь где-то много таких есть. Если надо могу выложить/сбросить. Под 77 у меня тоже есть 😉

    Reply
  8. DarkAn

    (5) О! А мне как раз под УСО (УПП) надо, значит придеться свое писать 😀

    Reply
  9. z-alexey

    (3) Посмотри в сторону этого варианта: http://infostart.ru/public/61090/

    Выгружает список сотрудников. И в УПП тоже работает.

    Reply
  10. natarezn

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

    Reply
  11. L_Slavon

    В момент открытия. отключаю строку №642 в Процедура ПриОткрытии()//РаботаСДиалогами.УстановитьДоступностьФормыДляРедактирования(ЭтотОбъект, ЭтаФорма); обработка запускается. работает нормально. спасибо.

    Reply
  12. stol6

    Привет. Загрузку шаблона табеля сделал бы для ВСЕХ, а то обработку скачал и не протестить — шаблон еще сутки ждать.

    Reply
  13. altar

    Спасибо. Помогла для реализации собственных задач

    Reply
  14. dlyamenya67

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

    Reply
  15. vamleshka

    Спасибо. Как раз нужно подобная вещь. сейчас скачаю. но думаю нужно будет доработать. но ничего страшного главное есть с чего начать. а это главное.

    Reply
  16. kostya23

    Спасибо. Адаптировали для реализации своих задач — сЪэкономили много времени.

    Reply
  17. smooth

    Пожалуйста 🙂 Рад, что помогло!

    Reply
  18. DDos76

    Загрузил, хоть ЗУПом пока тьфу-тьфу не занимался. Зато пригодится код чтения из Excel — надо загружать С/Ф. Правда там у каждого поставщика свой бланк — придется долго ковыряться. А за обработку — жирный плюс!

    Reply
  19. vz1987

    Спасибо за обработку. Сэкономил кучу времени. Пришлось докрутить тонкий момент: в разные табели приходят с разными разделителями целой и дробной частей («.» и «,»). Поправил, убрав «,» из массива «Разделители».

    Reply
  20. Nur

    Показала бухам — пищат от восторга. У нас более 500 сотрудников. Кадровики заполнять табеля в программе не хотят. Теперь будет всем радость

    Reply
  21. Lyuda11

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

    Reply
  22. Lyns_owner

    Это все очень красиво… Но я один не понимаю ЗАЧЕМ это нужно?

    Reply
  23. Lyuda11

    Нам табеля присылают обособленные подразделения по этому шаблону, и потом все загружаем в ЗУП.

    Reply
  24. smooth

    (21) Возможности дописывать табель нет.

    Reply
  25. Lyns_owner

    (23) Lyuda11, А как же кадровые документы отклонений, которые двигают регистры, которые используются программой? Например, для расчета остатков отпусков. А если есть эти документы, заполнить можно по кнопке без всяких обработок.

    Reply
  26. Lyuda11

    (25) Lyns_owner, У нас народ работает по табелю (маляры), определенного графика у них нет, по которому можно было бы заполнить табель с учетом отклонений.

    Reply
  27. Lyns_owner

    (26) Lyuda11, Не увидел в вашем сообщении ответ на мой вопрос. Может, я его плохо сформулировал? Или, может быть, вы не знаете, для чего служит регистр «Состояния сотрудников организаций»? И не вводите кадровые отклонения, нарушая при этом ТК и завышая количество дней отпуска сотрудников (в убыток компании).

    Reply
  28. Lyuda11

    (27) Lyns_owner, для этого сотрудник должен быть принят на работу по определенному графику. А если графика нет? Отклонения то ведь от какого то графика вводятся? Мы контролируем чтобы сотрудник отрабатывал определенное количество часов в месяц.

    Reply
  29. Lyns_owner

    (28) Lyuda11, Смысл не в отклонении от графика, а в увеличении рабочего года для целей расчета остатков отпусков.

    Вы фиксируете, сколько дней/часов работник прогулял без сохранения зарплаты, на это кол-во дней у него увеличивается рабочий год для целей расчета остатков отпусков, число дней в году при этом остается прежним. Работать ваши маляры могут по пятидневке, просто фиксировать их невыходы вы будете на рабочие дни. Они работают на сделке или на окладе? Либо вам необходимо переписать абсолютно весь функционал в системе, опирающийся на регистры, которые двигают документы отклонений, т.к. документы отклонений вы не используете.

    Банальный пример:

    Сотрудник «Прогулял» (проболел без справки, брал дни за свой счет и т.д.) за год с момента приема на работу 50 дней. Сколько дней отпуска вы ему должны будете оплатить через год после приема на работу?

    Reply
  30. iksanova

    Скачаем обработку, посмотрим, потом отпишимся.

    Reply
  31. Гелла

    Своевременно. Как раз такое надо было. Отправляем сотрудников на чужие объекты работать. Они оттуда табеля в exel предоставляют. Попробуем этой обработкой воспользоваться. Спасибо.

    Reply
  32. makas

    Если в «Шаблон» пишем/шифруем «как положено»(типа Я8, НН, ДО) тогда это очень неудобно. Т.к. табельщики или тек кто этим занимается факультативно — любят писать упрощенно — в один символ/знак.

    Reply
  33. РоманКокарев

    Подскажите, данная обработка работает на зуп 2.5.58.1?

    Reply
  34. Гость

    При открытии обработки выходит ошибка {Форма.Форма.Форма(1389)}: Метод объекта не обнаружен (ПолучитьРабочуюДату). ЗУП релиз 2.5.65.2

    Reply
  35. Sava944

    Спасибо уже не надо..подправил.

    Reply
  36. Sava944

    Возник еще один вопрос. При загрузке данных из Excel при днях месяца равных 30 все садится корректно. Если же дней в месяце 31 или 28(февраль) то данные отличаются. Стоит символ В, но при этом указывается время в часах. Может кто сталкивался с таким?

    Reply
  37. smooth

    скиньте мне файл табеля — если будет секунда св.времени гляну

    Reply
  38. Sava944

    (37) пример табеля

    Reply
  39. smooth

    (38) Sava944, у меня все ОК

    выложил обновление обработки под последние релизы (изм.месторасположение общих функций)

    Reply
  40. Sava944

    То есть тут дело в настройках самой конфиг. ЗУП? Если у меня садит неверно? И где скачать последнюю версюю обработки под 82?

    Reply
  41. smooth

    (40) Sava944, скорее всего дело не в настройках. Последняя версия обработки уже здесь (если нет sm могу на ящик кинуть)

    Reply
  42. Sava944

    Буду признателен…..очень надо время поджимает…Savelich@list.ru Спасибо большое.

    Reply
  43. TODD22

    (41)

    Вот такую ошибку выдаёт:

    {Форма.Форма.Форма(1173)}: Метод объекта не обнаружен (ОткрытьФормуВыбораСотрудникаОрганизации)

    ПроцедурыУправленияПерсоналомПереопределяемый.ОткрытьФормуВыбораСотрудникаОрганизации(Элемент, Документ.Ссылка, Истина, Дата, мГоловнаяОрганизация, 1, СтандартнаяОбработка, Элемент.Значение);

    При изменение периода на форме:

    {Форма.Форма.Форма(586)}: Недостаточно фактических параметров

    УниверсальныеМеханизмы.Просклонять(глЗначениеПеременной(«глКомпонентаСклоненияФИО»), МесяцСтрокой, 4, МесяцСтрокой);

    Не загружает… пишет что не найдена организация и не найден сотрудник. Я вбил его табельный номер и ФИО. Вбил организацию в эксель.

    При этом каждый раз после загрузки очищаются реквизиты обработки: Дата, подразделение и тд

    Релиз 2.5.65.2

    Reply
  44. smooth

    (43) TODD22, не все глобальные функции обновил 🙁

    Обработку исправил и перезалил.

    Заодно добавил в настройках порядок определения таб.номера: в типовой автонумерация таб.номеров идет с ведущими нулями, а у некоторых организаций табельный присваивают руками (без нулей)…

    Не загружает… пишет что не найдена организация и не найден сотрудник.

    При этом каждый раз после загрузки очищаются реквизиты обработки: Дата, подразделение и тд

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

    Reply
  45. fxfan

    Спасибо тщательную проработку темы!

    Пришлось дорабатывать под свой формат экселя и работу в ночные смены- все прошло легко, благодаря хорошему коду Автора!

    Reply
  46. smooth

    Благодарю! Рад что помогло 🙂

    Reply
  47. Гелла

    Надо будет попробовать. актуально для нас.

    Reply
  48. pinachet

    Возможно ли переделать под LibreOffice?

    Reply
  49. smooth

    В планах такого не стоит 🙂

    Но код открыт и все в Ваших руках!

    Reply
  50. floragrace

    Отличная обработка с возможностью доработки под свою конфигурацию и требования. Пользуюсь с 2011год с небольшими доработками.

    Reply
  51. 1vasia1

    Пришло время и мне табель загружать. Скачал, посмотрел, переделал под наши требования. Сэкономил кучу времени. Спасибо!

    Вот только одно, может падать платформа если не закрывая обработки из разных файлов грузить (падает на строке

    Если Форма<>Неопределено Тогда

    ФормаЭлементыФормыОтработанноеВремя.ДобавитьСтроку();).

    Reply
  52. Kombarova

    Добрый день!

    Не могу воспользоваться обработкой, выдает ошибку следующего содержания:

    {ОбщийМодуль.НастройкаПравДоступаПереопределяемый.Модуль(474)}: Поле объекта не обнаружено (Проведение)

    ПараметрыПроверкиДокумента.Вставить(«ПроверятьПроведениеДокумента», (МетаданныеДокумента.Проведение = Метаданные.СвойстваОбъектов.Проведение.Разрешить));

    Не подскажете в чем может быть проблема?

    Спасибо.

    Reply
  53. St1979

    добрый день,

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

    st1979@yandex.ru

    Спасибо всем кто откликнется, соответственно за вознаграждение

    Reply
  54. dage

    Отличная штука после небольших доработок. Плюс за код (читабельно).

    Reply
  55. salbey

    Подскажите, сохраняю печатную форму табеля в excel (ЗУП релиз 2.5.91.1) с типом файла «Лист Excel (*.xls)» и у меня различается количество колонок табличного документа (всего 33) и количество колонок в шаблоне (всего 62).

    Как вообще формируется экселевский шаблон для данной обработки?

    Причина в строках с различной шириной колонок в области «Подвал», пришлось править макет «Т-13».

    Reply
  56. natarezn

    У меня есть такой отчет с другого сайта. поняла что качает данные из файла Т13 — табель

    Reply
  57. aleksxx

    ФормаЭлементыФормыОтработанноеВремя=Форма.ЭлементыФормы.ОтработанноеВремя;

    ФормаЭлементыФормыОтработанноеВремя.ДобавитьСтроку();

    ФормаЭлементыФормыОтработанноеВремя.ТекущиеДанные.Сотрудник=Сотр;

    ФормаЭлементыФормыОтработанноеВремя.ТекущиеДанные.ФизЛицо = Сотр.ФизЛицо;

    Вылетает ошибка, что дыннае не являются объектного типа Сотрудник

    В отладчике ТекущиеДанные пусто (

    http://s018.radikal.ru/i508/1509/a8/a0a6f647b46f.png

    Reply
  58. ivv1970

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

    Выскакивает ошибка :

    ФормаЭлементыФормыОтработанноеВремя=Форма.ЭлементыФормы.ОтработанноеВремя;

    ФормаЭлементыФормыОтработанноеВремя.ДобавитьСтроку();

    ФормаЭлементыФормыОтработанноеВремя.ТекущиеДанные.Сотрудник=Сотр;

    ФормаЭлементыФормыОтработанноеВремя.ТекущиеДанные.ФизЛицо = Сотр.ФизЛицо;

    Что делать с этим непонятно.

    Reply
  59. smooth

    (58),(57) Скажите, в какой момент выскакивает ошибка? или пришлите файл табеля что Вы грузите (mail-smooth собака mail.ru), я посмотрю. Но у меня грузит все нормально…

    Reply
  60. ivv1970

    (59) Ошибка выходит после нажатия кнопки «Загрузить из XLS» по достижении искомого куска кода. Точнее, выходила когда было нужно срочно загрузить табели. Сейчас хотел отправить файл xls для демонстрации ошибки — ошибка не проявляется , хоть убейся, даже на тех файлах , на которых раньше выскакивала ! Законы Мерфи в действии !!!!

    Reply
  61. DragonAgo

    Добрый день, обработка быстро загружает данные?

    Reply
  62. galyna

    Добрый день. Если можно перешлите пожалуйста файл обработки под 8.2 на почту . Почему-то не скачивается файл…Почта afanaseva@binar-plus.ru Заранее Большое спасибо.

    Reply
  63. alina71

    Игорь, Вы написали, что есть такая же обработка для ЗиК 7.7. А можно пжлст на почту

    a-alinova@mail.ru, попробуем применить у себя. Спасибо. Плюсик за мной.

    Reply
  64. smooth

    отправил Вам на почту 3 варианта. Посмотрите, может что сможете из этого для себя полезное извлечь 😉

    Reply
  65. Yusufoff

    При попытке запустить выдает ошибку:

    {Форма.Форма.Форма(1398)}: Метод объекта не обнаружен (ПолучитьРабочуюДату)

    у нас ЗУП 2.5 (2.5.61.1)

    Reply

Leave a Comment

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