Табель учета рабочего времени (Т-13) для Бухгалтерия 1.6 и 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='\

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