Табель учета рабочего времени для Бухгалтерии 2.0




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

44 Comments

  1. m667v

    Работает

    Reply ↓
  2. orehova123

    хм… оригинально! почти целый расчетный модуль из зупы в бухгалтерию закинуть! прямо как в сельхозке 🙂

    Reply ↓
  3. orehova123

    возьму себе на заметку, думаю, пригодится

    Reply ↓
  4. Программулькин

    у меня хелпером такое организовано, но тоже скачал, посмотреть как ты реализовал…

    Reply ↓
  5. Ludmilka

    Скачала. А как установить? Расскажите подробненько, профессионалы.

    Reply ↓
  6. Trek

    Сервис — доп. внешние отчеты и обработки — доп. внешние обработки — добавляем файл обработки (запускать ее из этого же места). Остальное в справке к обработке

    Reply ↓
  7. Ludmilka

    Спасибо! Работает! Прикольно так!

    Reply ↓
  8. olesechka

    Супер!!!

    Очень удобно! СПАСИБО ОГРОМНОЕ!!!

    Редко что-то толковое можно найти!!!

    Reply ↓
  9. segen

    Народ часто такое спрашивает, а я отвечал «нэту». А щас буду предлагать это решение.

    Reply ↓
  10. Trek

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

    Reply ↓
  11. ezupowam

    О! да это же целый ЗиК в бухгалтерии! А если еще отпускные и больничные добавятся — супер! Ждем. Еще бы вот формирование справок о зарплате…

    Спасибо.

    Reply ↓
  12. Фред

    Скачал.Проверил. Восхищен!..)) Работает отлично. Даже если бы был голый табель, и то весьма полезная штука.

    Со всеми подробностями еще не разбирался, но зарплату начислил без лишних движений, заполняя табель.

    Вещь сделана именно для пользователя, не надо искать при работе что и где. Все указано прямо перед носом.

    А справка вообще выше всяких похвал! Даже такому темному буху, как я и то все понятно!

    Разработка заслуживает всяческого одобрения, а уж + сам Бог велел!

    Весьма рекомендую!

    Reply ↓
  13. Фред

    Да… Для информации интересующимся: Опробовал на БП 2.0 Базовая (2.0.28.3)

    Reply ↓
  14. ukgh

    Спасибо! Удобная вещь!!!!

    Reply ↓
  15. Trin

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

    Reply ↓
  16. olesechka

    Гениально!!!!!!!!!!! Спасибо огромное!!!

    Reply ↓
  17. Trek

    (15) Trin, расчет больничных уже сделал, тестирую. Вообще я не зарплатник, поэтому если буду неправ поправьте меня.. Отпускные и коммандировочные считаются за период год, считая от даты отпуска/коммандировки. Расчет общего заработка вытянуть из базы не сложно, а вот количество отработанных дней, не учитывая дни отпуска/больничных невозможно. В бухии не хранятся больничные, отпускные и т.д. Есть идея реализовать так: сумму вытягиваем, а количество отработанных дней указывает пользователь вручную, еще больше автоматизировать это не могу придумать как. Если есть идеи, подскажите

    Reply ↓
  18. dee35

    (17) Для расчета отпускных не нужно знать «Количество отработанных дней», может все-таки получится?

    Средний дневной заработок для расчета отпускных определяется по формуле:

    -В случае если расчетный период отработан полностью: Сумма выплат за расчетный период /( 29,4*12)

    -В случае если расчетный период отработан не полностью: Сумма выплат за расчетный период /Кол-во календарных дней в периоде.

    Количество календарных дней в периоде рассчитывается как 29,4 за каждый полностью отработанный месяц и кол-во отработанных календарных дней в месяце*29,4/кол-во календарных дней в месяце за каждый не полностью отработанный месяц

    Reply ↓
  19. Dethmond

    Trek, спасибо! Новая версия с отпусками и отгулами будет?

    Reply ↓
  20. Trek

    (18) dee35, как раз невозможно в бухии определить был ли расчетный период отработан полностью, там не хранится количество отработанных дней, коммандировочных и больничных, была идея выцеплять из начисленных сумм с видами начисления по коммандировкам и отпускам, но все равно никак невозможно определить сколько дней было отработано, если месяц отработан не полностью

    Reply ↓
  21. dee35

    (20) не пойму зачем отработанные дни? мне кажется главное нужно знать дату приема на работу, например: Сотрудник принят на работу 20.01.2011, в январе заработал 10т, в феврале-марте не работал(не важно по каким причинам, допустим болел, получил б/л но его не учитываем), в апреле — октябре получил по 20т. С 10.11.2011 пошел в отпуск.

    Среднедневной будет = (10т.+20т.*7)/(12/31*29,4 + 9*29,4)

    Reply ↓
  22. Trek

    например в апреле был отпуск 14 дней, а в мае больничный 5 дней, как их учесть в формуле?

    Reply ↓
  23. KliMich

    СУПЕР! Очень изящно!

    Trek пишет:

    (18) dee35, как раз невозможно в бухии определить был ли расчетный период отработан полностью, там не хранится количество отработанных дней, коммандировочных и больничных, была идея выцеплять из начисленных сумм с видами начисления по коммандировкам и отпускам, но все равно никак невозможно определить сколько дней было отработано, если месяц отработан не полностью

    А если попробовать так.

    При закрытии принудительно сохраняем данные в файл (как по кнопке «СохранитьВФайл», но с «предопределенным» именем файла, например НазваниеОрганизации_Подразделение_Период.txt).

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

    Как другой вариант, можно эти недостающие данные заполнять в ТабЧасть (добавив доп колонки).

    Reply ↓
  24. Trek

    Сейчас пока реализована колонка Средняя зарплата, данные оттуда идут в расчет коммандировочных и отпускных. Твой вариант хорош) я тоже про это думал, но дело в том, что данные берутся за весь последний год, соответственно пользователю придется перед началом работы создавать табеля за весь последний год помесячно, и сохранять в файлы. Пока лучше идеи нету)

    Reply ↓
  25. bellaform

    Установил.Понравилось. Спасибо большое.

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

    С расчетом среднего заработка в «Бухгалтерии» заморачиваться, наверное, не стоит — для небольших предприятий нетрудно сделать небольшую табличку в Excel, а для кого этого мало — есть «Зарплата и Кадры». Все же это самостоятельная большая задача, уже решенная в отдельной программе.

    Reply ↓
  26. agarkin

    +1

    Reply ↓
  27. unis

    Класс!!! то что надо!!!! давно искала такую программку!!! Спасибо вам огромно!!!!

    Reply ↓
  28. gutentag

    Замечание/Ошибка: Последний номер табеля не сохраняется.

    Рекомендую сделать номер иабеля = номеру месяца. А если табель составляется по подразделениям, то сделать составной номер, например: «номер месяца/номер подразделения»

    Reply ↓
  29. Asenka

    А можно добавить колонку «Ставка» как в обработке-первоисточнике?

    Reply ↓
  30. ILYA1C

    Спасибо, бухгалтера довольны)

    Reply ↓
  31. artur_antipin

    Кто-нибудь для УТ пробовал табель учета рабочего времени делать?

    Reply ↓
  32. dtitov

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

    Reply ↓
  33. kit

    А печатная форма есть?

    Reply ↓
  34. Sadyga

    Хорошо сделано.

    Reply ↓
  35. pps2715

    подскажите почему выскакивает такая ошибка: Метод объекта не обнаружен (ЗаработокДляВыплатыПособийСоцСтрахованияС2011года) как ее можно исправить? спасибо большое!

    Reply ↓
  36. Trek

    Вохможно релиз старый, тестировался на 25 версии. У вас какой?

    Reply ↓
  37. pps2715

    (37) да вы правы была конфигурация 2.0.14.5 обновился до 2.0.22.1 проблема исчезла, прошу прощения не догадался сразу сделать обновление, есть еще вопрос можно ли его как то привязать через меню дополнительные отчеты и обработки, я не знаю как и просто открываю файл через меню открыть файл. спасибо

    Reply ↓
  38. vadimt_82

    Очень хорошо выполненная обработка. Удобная, наглядная. Бухгалтерия довольна

    Reply ↓
  39. klop_v

    Все работает, пользуемся и отказались от xls-формы. Спасибо.

    Reply ↓
  40. klima

    Спасибо за столь полезную обработку!!! Все замечательно, кроме одного «но»…

    Коды неявок такие как: «Р» (декрет), «ОЖ» (отпуск по уходу за ребенком), «ОЗ»(за свой счет),»ПР» (прогул) не считаются и не отражаются в графах 10,11 (12,13). Понятно, что они встречаются редко, но бывает)))..

    Возможно ли добавить эти коды?

    Спасибо!!!

    Reply ↓
  41. 26178_mail.ru

    Скачал.Посмотрел, отличная задумка.

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

    Больше обработок такого рода, легче жизнь, и на судьба. большое спасибо ++++++++++++++++++++

    Reply ↓
  42. Светлый ум

    Классная весч — такие вещи надо продавать незадорого: всеравно будут качать.

    Reply ↓
  43. bnw

    Идея отличная!

    Что такое Средняя зарплата и откуда ее брать?

    Reply ↓
  44. ssn5810

    для БП 3 ???

    Reply ↓

Leave a Comment

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