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




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

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 не будет опубликован. Обязательные поля помечены *