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




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

55 Comments

  1. света1969

    Спасибо!Спасибо!Спасибо!Спасибо!Спасибо!Спасибо!Спасибо! 😀

    Reply
  2. YuryKr

    Отлично

    Reply
  3. АллаБух

    Спасибо ОГРОМНОЕ!!!! Давно о такой мечтала!!!!!!

    Reply
  4. bearcat

    спасибо, что сделали табель для 8-ки, т.к. для 7.7 уже давно есть, а вот для 8-ки бухгалтерия предприятие не было.

    Прошу отнестись с пониманием, очень хорошо, что есть наконец табель, но не в обиду, если можно немного доработать, тогда будет вообще супер :

    1. в поле «ответственный» подставлять не из списка «пользователи» , а также из списка «сотрудники», чтобы выводилась ФИО рядом с должностью, т.к. в поле «ПОЛЬЗОВАТЕЛИ» как правило у всех логин.

    2. для совместительства предусмотреть возможность выбора: 1/4 ставки или 1/2 ставки и т.д.

    3. можно сделать кнопку «СОХРАНИТЬ» рядом с кнопкой «ПЕЧАТЬ» или с кнопкой «ЗАКРЫТЬ», в се равно где, лишь бы табель сохранялсся в 1С ?

    4. попробовала заполнить по производственному календарю : все хорошо , считает дни и часы и за 1-ю и за 2-. половину месяца и всего за месяц.

    затем взяла и 7-го и 8-го июня поставила букву К вместо буквы Я, т.е. командировка, часы оставила 8 и 8, а другому сделала букву Б больничный 7,8,9,10-го

    результат: не пишет кол-во дней неявки и букву (код) не пишет , а было бы здорово, если бы в неявке написал букву Б и 4 дня

    не пишет в код Я — и кол-во дней и код К и кол-во дней.

    Может быть можно предусмотреть еще и поля для этих граф, чтобы вручную вносить, как и сами буквы К и Б?

    Можно, конечно сделать в режиме редактирования и ФИО кадровика и и Б и К , но если возможно , то , конечно, здорово бы было, чтобы не руками, а автоматически

    да, конечно, плюс

    Reply
  5. riop

    (4) по пожеланию 1 — если в настройках текущего пользователя указано физ.лицо, то как раз оно и будет подставляться в печатную форму (это видно на скриншоте). вообще стоял вопрос на какой справочник делать ссылку: пользователи или работники. решил что будут пользователи, т.к. предполагается что предприятие маленькое и в пользователях указаны та физ.лица, которые должны подставляться.

    по пожеланию 2 — вроде для совместительства и так есть выбор: по умолчанию 1/2 ставки, при отмеченной галочке — 1/4.

    по пожеланию 3 — нет, нельзя, т.к. в этом случае придется вносить изменения в конфигурацию, а я как раз хотел сделать полностью автономную форму (чтобы не трогать конфигурацию, поставляемую 1С). если нужна с сохранениями, то используйте эту http://www.infostart.ru/public/18788/.

    по пожеланию 4 — в указаниях по применению и заполнению Т-12 и Т-13 сказано:»…При отражении неявок на работу, учет которых ведется в днях (отпуск, дни временной нетрудоспособности, служебные командировки, отпуск в связи с обучением, время выполнения государственных или общественных обязанностей и т.д.), в Табеле в верхней строке в графах проставляются только коды условных обозначений, а в нижней строке графы остаются пустыми…» поэтому при К часов не может быть.

    за колонку «неявки по причинам» — учту. скоро сделаю (просто мне она не нужна — у меня не болеют).

    К, Б и т.п. придется руками вносить, так же как и уволенного работника — особенности формы.

    Reply
  6. riop

    !!!ИСПРАВЛЕНО!!!

    если 15-е число месяца приходилось на код, отличный от «Я», то не суммировались дни и часы за первую половину месяца (например: так получалось в мае и августе 2010)

    !!!ДОПОЛНЕНО!!!

    в печатной форме в колонках неявки ставит код и количество дней по кодам, отмеченным в табеле «Б», «ОТ» и «К».

    Reply
  7. bearcat

    огромное спасибо!!!

    касательно пожеланий (4)

    по п.1 можно добавить в пользователи нужную ФИО специально для табеля, это не проблема

    п.2 имелось ввиду и т.д. , то есть у нас, например, совместитель работает по 3 часа в день, но это можно и руками проставить, ерунда

    по п.3

    при желании можно сохранить в любую папку пользователя, это не проблема

    по п.4 просто замечательно сделал!!!

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

    Reply
  8. klima

    Очень здорово, что теперь есть табель для 8ки!! Спасибо! но у меня почему то выдает ошибку, когда я нажимаю кнопку «заполнить табель»: Индекс находится за границами массива. У меня что то не так? или с обработкой?

    Reply
  9. riop

    (8) эта ошибка возникает если не заполнен календарь (нужно открыть его, перенести праздники с выходных дней на рабочие и т.п. и нажать в нем кнопку «Записать»).

    Reply
  10. Арчибальд

    (4)(8) Выражаю искреннее соболезнование…

    Reply
  11. Elnek

    (8) удивляюсь, что это Вам навеяло выражать соболезнования?

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

    и вдруг Вы со своими соболезнованиями

    странно

    Reply
  12. Alef

    (10) Имеется в виду, очевидно, то, что разумнее использовать ЗиУК, нежели чем прикручивать табель к БП. Это не моя точка зрения, если что.

    Reply
  13. света1969

    хватит головной боли от бухгалтерии. К ЗиУК даже приближаться не хочу!!!!!!!!!!!!1

    Reply
  14. nadenk

    Очень нужная вещь для фирмы с численностью 1,5-2 десятка работников. Спасибо.

    Reply
  15. marina4183

    Огромное спасибо! Очень нужная и полезная обработка!

    Reply
  16. Маргаритка

    Спасибо тысячи раз! Это предел мечтаний для таких небольших фирм как мы, нам отдельно всегда приходилось делать, а программы по начислению заработной платы (т.к. все окладники), смысла приобретать никакого.

    Reply
  17. YuryKr

    Шикарно… Уже давно пользуюсь в 1.6, а теперь с 2.0… Огромное спасибо

    Reply
  18. lazy sea

    YuryKr

    riop 04.08.10 13:28 Ссылка Цитата Ник

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

    (8) эта ошибка возникает если не заполнен календарь (нужно открыть его, перенести праздники с выходных дней на рабочие и т.п. и нажать в нем кнопку «Записать»).

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

    Календарь в самой программе не корректируется, а просто отображает дни месяца. В самой оборабоке я никакого календаря не вижу:((

    Спасибо

    Reply
  19. riop

    (18) идешь по пути: (Файл, Правка, Операции … (это меню будет, если установлен интерфейс «полный»)) Предприятие — Производственный календарь (в самом конце списка). его и надо заполнить.

    Reply
  20. lazy sea

    спасибо огромное, сейчас попробую:)))

    Reply
  21. lazy sea

    Господи, какие же молодцы!!!! От такого гемора избавили ручного. А какой из табелей Вы можете порекомендовать для 7.7 УСн? Там просто добавить во внешний отчет или тоже надо календарь править? Спасибо

    Reply
  22. riop

    (21) не молодцы, а молодец:-)! к сожалению с семеркой уже как лет 8 не работаю — не могу сказать что там и как. но вроде здесь встречал табель для 7-ки. воспользуйся поиском.

    Reply
  23. LindА

    1С:Предприятие 8.2 (8.2.13.219)

    Бухгалтерия предприятия, редакция 2.0 (2.0.21.1)

    спасибо, все работает 😀

    Reply
  24. Soloveva.e2011

    😀 Бухгалтерия предприятия, редакция 2.0 (2.0.23.9) Спасибо огромное!!!!!))))) все установилось и работает , вы мне спасли время на общение с маленьким ребенком)))))))

    Reply
  25. Slivovaya

    И от меня вам большое спасибо! Благодаря таким доработкам ноша на наших бухгалтерских плечах становится легче! Очень пригодился отчет, спасибо!

    Reply
  26. shturman9206

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

    Reply
  27. micnet

    Полезная штука! Спасибо!

    Reply
  28. rmariao

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

    Reply
  29. TOsya

    Спасибо большое. Очень полезная и удобная обработка.

    Reply
  30. smok1986

    (22) доброго времени суток! подскажите пожалуйста, почему в табель не попадают некоторые сотрудники? уже все перепробовал и график менял, и ставку и подразделение, в впустую. Есть Мысли на этот счет?

    Reply
  31. riop

    (30) уволенные в месяце формирования табеля туда не попадают. если нет, то так не скажу — надо смотреть базу.

    Reply
  32. Trek

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

    за разработку большой плюс, не пришлось писать с нуля)

    Reply
  33. riop

    (32) кстати, где-то уже летала мысль про сохранение — пост (4). мысли есть, но вот со временем — беда, так что все идеи, скорее всего, будут реализованы в 1 квартале 2012 года.

    Reply
  34. Trek

    у меня работает сохранени и загрузка, только правда файлы txt, и овершенно нечитаемые. Хочу сделать выгрузку в excel, и загрузку соответственно оттуда же.. Еще думал по поводу штатных расписаний, можно сделать дополнительным реквизитом к специальности работников, и тянуть оттуда. И пересчет также. В моем табеле для подразделения администрация расчет «Ставка * количество отработанных дней / норма дней», для остальных «Ставка * количество часов за месяц/норма часов»(почасовка).

    Reply
  35. Lemyrchick

    хорошая вещь, правда доработал напильником под себя, да будет автору счастье )

    Reply
  36. kэt

    отличная вещь, авторам огромное спасибо

    согласна с высказываниями, что небольшим фирмам нет смысла покупать ЗиК, например.

    все расчеты выполняются средствами базовой версии 1С

    Reply
  37. nae

    Отлично! Спасибо огромное! Теперь все в одном окне хоть!

    Reply
  38. Liliano4ka

    Огромное спасибо автору! Экономит время бухгалтеру, который совмещает должность кадровика =)

    Reply
  39. gutentag

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

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

    Reply
  40. gutentag

    (0) riop, адаптировал/скомпоновал Вашу форму для 15″-экрана с разрешением 1024х768, так как не влезала кнопка печать + закомментировал предупреждение об отсутствии номера табеля.

    Смотрите прикрепленный файл «8.2_Табель_для_2.0-вар002.epf» + картинку

    Reply
  41. riop

    (39)

    gutentag пишет:

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

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

    gutentag пишет:

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

    — каждому по-разному удобно. мне удобно так, как сделано.

    (40) респект и уважуха.

    Reply
  42. gutentag

    (41)

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

    Я сегодня:

    1) составлял табель за январь 2011г и поставил номер 1 -> печатал табель -> закрыл обработку

    2) открыл обработку установил месяц февраль 2011г, а номер остался 1 -> пришлось вручную менять на следующий…

    3) и так далее до декабря 2011г вручную менял номер.

    Если я обработку не закрываю, а меняю месяцы, то номер табеля остается неизменным — что тоже не есть правильно.

    ——

    Вот поэтомуто я и писал, что хорошо бы при смене месяца номер менялся бы(ну, хотябы номер табеля = номер месяца)

    ———

    В остальном, спаисбо за полезную вещь!

    Reply
  43. sav-prog

    Вполне прилично, спасибо.

    Reply
  44. Гость

    Спасибо ОГРОМНОЕ!!!! Давно о такой мечтала!!!!!!

    Reply
  45. kot24147

    Если я обработку не закрываю, а меняю месяцы, то номер табеля остается неизменным — что тоже не есть правильно.

    ——

    Reply
  46. Гость

    Последний номер табеля не сохраняется.

    Reply
  47. protlt

    Еще раз спасибо автору. Ну так время экономит. Если учитывать, что у нас много фирм — то это просто спасение наше. Спасибки, спасибки.

    Reply
  48. svad1

    респект автору!

    Reply
  49. sagg

    Огромное спасибо! (Проверила на 2.0.43.12)

    Reply
  50. milka12371

    Спасибо!!! Для нас маленьких, мечта!!! У меня правда не проставляются расшифровка ответственного лица( проверяла на 2.0 (2.0.49.8)

    Reply
  51. vlanik

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

    Reply
  52. Uejova

    Спасибо большое за обработку. Нужная вещь! Иначе приходилось «рисовать» документ в Excel!

    Reply
  53. Uejova

    Попробовала сформировать Табель за 2012 год (мне нужно будет и за 2011 год).

    Программа выдает «Индекс находится за пределами массива»

    Что нужно предпринять, чтобы было можно сформировать за прошлые периоды?

    Заранее спасибо!

    Reply
  54. riop

    (55) Uejova, нужно внимательно читать описание или справку — там написано: «Для правильной работы обработки необходим заполненный «Регламентированный производственный календарь» на период формирования отчета.»

    Reply
  55. maksa2005

    Сначала вышла ошибка при нажатии кнопки «Заполнить табель»:

    {Форма.Форма(108)}: Индекс находится за границами массива

    ВидДня = Данные[ДеньМесяца — 1].ВидДня;

    Исправил перезаполнение регистра — Производственный календарь.

    Уважаемый riop!

    Исправьте грамматическую ошибку при печати — Не указана номер табеля. на указан)))) Бух смеялся…

    Reply

Leave a Comment

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