В помощь кадровику. Отчет «Среднесписочная численность» для ЗУП.




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

66 Comments

  1. Ish_2

    Вдруг уследил ! Работаю правда на 8.1.

    Reply
  2. RailMen

    (1) Намек понял и выложил текст запроса. Если работать не будет на твоей платформе, то убери все что в фигурных скобках компановки данных {…}. Или вставляй по блокам в консоль отчетов/запросов, пока все не собирешь))) Ну это если надо, конечно.

    Reply
  3. sound

    А чтобы в 8.2.10 заработало что надо?

    Reply
  4. RailMen

    В прикрепленных файлах есть текст запроса, настройки и т.д.

    Reply
  5. pogroleg

    У меня виснет запрос на вот тут

    РС_ГрафикиРаботПоВидамВремени.Дата <= ВТ_ДатыИСотрудники_СостоянияИКадры.ДатаКалендаря

    Reply
  6. RailMen

    (7) во всем запросе ТЕТА соединение самая медленная часть.

    Причин может быть в принципе несколько:

    — выбран слишком большой период, за который нужно получить среднесписочную численность;

    — используется файловая БД;

    — большой штат или много отклонений или кадровых приказов, т.е. большой объем данных.

    На сегодняшний день ошибок формирования отчета не выявленно. Если отчет показывает какие-то сомнительные цифры, то причину надо искать в неверно заполненом регламентированном календаре или графиках работы или первичке.

    Reply
  7. Marina_Borohova

    Здравствуйте! Спасибо за ваш отчет. Но возник один вопрос: Почему среднесписочная за год суммируется? Она же должна делиться на 12 месяцев?

    Reply
  8. kuzes

    Поделить можно и руками, таких обработок вообще очень мало, так что ставлю +

    Reply
  9. logoped

    Спасибо,

    плюсик поставил.

    Но уж больно замудреный выход получился.

    Отдал экономисту, она юзает потихоньку и ко мне больше не пристает.

    Reply
  10. mariyanna

    Спасибо! Хороший отчет!

    Reply
  11. opiumdx

    Спасибо!

    Reply
  12. cerg110

    Спасибо за отчет, а почему округление не включили?)

    Reply
  13. m818rt

    Спасибо) Плюсую!

    Reply
  14. RailMen

    Удивительное дело! Отчет я выложил около года назад. А «популярность» к нему пришла только теперь!

    Reply
  15. almas

    Ничего удивительного штатный отчет по среднесписочной за 9 месяцев на 4000 чел формируется в течении 1 часа.. Сидю жду… Курю газету….

    Счас посмотрим как ваш отчет сработает..

    Reply
  16. sdw2007

    Будет ли этот отчет работать на УПП?

    есть ли какие то ограничения по версиям платформы и если работает на УПП, то версии конфигурации?

    Reply
  17. Boroda

    Отчёт, безусловно, интересный. Но возник такой вопрос: если он писался год назад и под платформу 2.5.12, то под 2.5.14 работает нормально? И ещё: код открыт? Если, скажем, подкорректировать что-то захочется (например, на 12 поделить, как желает (9)), удастся сделать?

    Reply
  18. RailMen

    Еще раз подчеркну: это самый методически правильный отчет для получения среднесписочной численности, который мне известен. Он разрабатывался около года лично мной, несколько раз делался рефакторинг. Он не может быть меньше в силу архитектуры типового ЗУПа и поставленной задачи.

    (14) Это можно сделать и в режиме предприятия. Моя цель — донести методику получения отчета.

    (17) Типовой отчет не рекомендую, т.к. в нем не решена главная проблема: получение последнего рабочего дня перед праздничным/ыми днями. В основе методики ТЕТА соединение, поэтому на больших объемах данных он отрабатывает не быстро.

    (18) В УПП отчет не тестировался. Тем не менее мой прогноз благоприятный, должен открыться (нет УПП для тестов).

    (19) Сейчас тестирую отчет в ЗУП 2.5.37.1 / 8.2.14.533. Все отлично работает. Код открыт. Но сразу предупрежу: запрос там не тривиальный.

    Reply
  19. e_kazakova

    Отчет интересный, кадровики будут рады. Спасибо.

    Reply
  20. acherey

    Отчёт очень полезен. Прекрасный аналитический отчёт, всё по делу, на 5.2.14 всё работает

    Reply
  21. vec435

    отчет нужный в плане разбивки на группы

    Reply
  22. Massimo

    спаибо за отчет, стандартный упп’шный очень уныл.

    Reply
  23. vec435

    файловый вариант 700 человек — >6 мин(стандартный-1) серверный ~2 мин

    Reply
  24. mdie

    Отличная обработка! Отлично отработала на ЗиК БУ, единственное что не сразу понял почему в январе время неверно определяло (оказалось что просто производственный календарь на 2011 год не был заполнен, т.к. учет начали вести в 8-ке только в 2012 и нерабочий день распространился по 9-е января).

    Reply
  25. Gesperid

    MagIvan, на основании каких нормативных актов разработан отчет?

    Reply
  26. annkod

    Потестила, вроде все правильно считает. Только вопрос: какая цифра выводится в колонку «Средняя численность»? Почему-то она отличается от колонки «Дней учтено» (по людям с нестандартным графиком работы, например пятидневка выходные воскресенье-понедельник)? И не очень удобно, когда формируешь отчет за 3 месяца, расшифровка в любой колонке выходит суммарная по 3-м месяцам…

    Reply
  27. 713-87

    Добрый день, отчет скачал. А на 1С ЗУП:Предприятие 8.2 (8.2.14.540) почесмуто не формирует данные, шапка только появляется и все. Подскажите в чем может бвть загвоздка?

    Reply
  28. milov.aleksey

    (29) товарищ «713-87», Вы настройку структуры отчета произвели?

    1)Какие данные(расчетные показатели из возможного списка вам нужны)? Например, мне Списочную численность и ССЧ.

    2)С какими группировками их вывести? Например, строки сгруппировать по организациям(Владелец подразделения), подразделениям.

    Столбцы сгруппировать по месяцам, чтоб видеть динамику в горизонтальном развороте).

    3)отобрать данные по периоду(указать дату «С» и дату «По»), по организации, по основнымвнутренним сотрудникам, исключить отсутствующих по причине Увольнение, декрета и т.п.

    Сам скачал час назад, покрутил настройки, добился чего от меня срочно хотели кадровики. Но придётся развивать отчет, т.к. в нем нет количества сотрудников на начало и конец месяца и пр., по сути совместить два отчета в один мегаотчет!

    Reply
  29. azmon

    Извините может вопрос глупый.

    Не понимаю, что это за показатели «Дней учтено» и «Число дней»? И почему эти показатели для месяцев больше количества дней в месяце? Допустим для января у меня показывает 92.

    Reply
  30. azmon

    Видимо этот отчет не предназначен для организаций имеющих сотрудников со сменным графиком работы

    Reply
  31. ksv1cc
    Через механизм характеристик реализована поддержка использования категорий и свойств объектов.

    Добавил свойство в должность организации — в настройке отчёта его нет? где я накосячил?

    Reply
  32. Трям

    у меня на платформе 8.2.13.205 релиз 2.5.54.1 выдает ошибки

    Не найден параметр ПарамНачПериода

    Не найден параметр ПарамКонПериода

    Не найден параметр ПарамОрганизация

    Не найден параметр СписокВидовЗанятости

    или я что то не так делаю? настройки вроде все заполнены.

    Reply
  33. azmon

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

    Reply
  34. Светлый ум

    Не могу настроить:

    — Как поставить возрастной интервал (такой вариант представлен на скриншоте)?

    Reply
  35. fin7

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

    Reply
  36. azmon

    Еще раз дублирую вопрос. Автор аууу!!!! Можно ли использовать данный отчет для организаций имеющих сотрудников со сменным графиком работы????

    Reply
  37. bus1ka

    (37) finch, бюджетная ведь аналогичная совсем в плане таких отчетов

    Reply
  38. tyfmyl

    Это, мужик, спасибо! Как и просил все ссылки на тебя при модификации отчета!

    Reply
  39. tyfmyl

    Разобрался с запросом в отчете. Самая запутанная часть была где срез последних делается от виртуальной таблицы на каждую дату. Не понятно только зачем там срез первых делается?

    Reply
  40. tyfmyl

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

    Reply
  41. kadrovik

    (37) finch, проверил — опять сложение ставок идет вместо «целых единиц» ?

    типовой отчет выдает 126 вместо реальных 84, данный отчет выдал 303…

    Reply
  42. RailMen

    (30) Были попытки создать «мега отчет»: скрестить среднесписочную с соцкарточкой и пр., добавить разрезы по стажу и т.д. Могу сказать одно: «мега отчет», если в штате несколько тысяч человек, вешает сервант, с другой стороны крайне тяжело проверять его правильность.

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

    Есть версия, которая учитывает и такой случай. Но ее пока выкладывать не планирую.

    (42) Группировку по месяцам убирать не нужно.

    (43) Какая конфигурация, платформа, списочная численность, используете ли вы сменный график работы?

    Reply
  43. azmon
    (32) Эта версия отчета не предназначена для организаций, имеющих сотрудников со сменным графиком работы.

    Есть версия, которая учитывает и такой случай. Но ее пока выкладывать не планирую.

    Думаю это нужно было указать в описании к публикации, чтобы не вводить людей в заблуждение.

    Reply
  44. shindi75

    Отчет и до сих пор не потерял актуальности. Очень хорош как база для всяческих группировок по требованиям «эффективных HR-директоров». Спасибо.

    Reply
  45. Sashka_2013

    Скачал отчет, моё мнение.

    Извиняюсь конечно но лично мне отчет вообще не понравился.

    1) интерфейс ужасно реализован, панели «летают», после запуска приходится панель настроек курсором мышки расширять что бы хоть что то увидеть

    2) оптимизация на нуле, даже за месяц отчет виснет намертво и надолго, видимо рассчитан на фирму до 2-5 сотрудников.

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

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

    Reply
  46. RailMen

    (47) Sashka_2013, давайте разбираться по порядку.

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

    Во-вторых, я уже не однократно говорил и писал, что нельзя огульно скачивать все из интернета. Ценость данной работы — в тексте и логике запроса. Это ядро. Остальное — мишура. Вы кроме мишуры как программист обязаны видеть суть. Или вы полагали скачать из интернета отчет с запросом на 800 строк, заточенный под ваши кокретные нужды?

    В-третьих, что конкретно вы любезный, хотите сказать по поводу оптимизации. Вы трасировали текст запроса? Что вас не устроило?

    Или вы так, поболтать зашли…

    Reply
  47. tazmag

    Спасибо надо порадовать кадровичку, показать новые возможности!

    Reply
  48. sps02

    Думаю нужная вещь, спасибо!

    Reply
  49. NatalyaVP

    Не формируется отчёт. Ни одной строчки не выводит. И форма всё время разъезжается.

    Reply
  50. RailMen

    (51) NatalyaVP, читайте внимательно описание: тестировалось в ЗУП 2.5.25/8.2.12.92, 2.5.37.1/8.2.14.533, на платформах версии ниже 8.2.10 не пойдет. Если Вы заинтересованны в этом отчете, то напишите письмо на PanteleevI@inbox.ru c указанием номера версии своей платформы и релиза своей конфигурации. В ответ я вышлю оценочную стоимость работ по доработке отчета под Вас.

    Reply
  51. Liily

    Если нужно посчитать среднесписочную численность с нарастающим итогом по подразделению, в котором в течении периода всех уволили. Например, считаем с января по сентябрь, а с июня в нем уже никто не числится. Можно ли как-то настроить ваш отчет чтобы месяца, когда никто не работал тоже учитывались? Сейчас выводит только по май.

    Reply
  52. NatalyaVP

    Отчёт неверно считает данные по среднесписочной численности.

    Reply
  53. RailMen

    (54) NatalyaVP, пожалуйста, привидите пример.

    Reply
  54. NatalyaVP

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

    Reply
  55. RailMen

    (53) Liily, настроить отчет можно!

    Reply
  56. RailMen

    (56) NatalyaVP, спасибо за замечание. Описанный Вами случай довольно редкий, даже в нашей практике (1500 чел). Мы обязательно найдем такие же отклонения по сотруднику в одном месяце и внимательно их проверим.

    Reply
  57. marinelle

    Отчет работает на УПП 1.3.86.3 платформа 8.2.19.83 . Данные по графикам работы «Сокращенная неделя» считает правильно. А вот уволенные в середине периода показывает 1 как будто сотрудник отработал весь месяц. Некоторых сотрудников троит или двоит… В любом случае Спасибо за Ваш труд. База есть, остальное можно и доработать.

    Reply
  58. marinelle

    (44)

    Есть версия, которая учитывает и такой случай. Но ее пока выкладывать не планирую

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

    Reply
  59. gull22

    А возможно сформировать отчет по отношению к счетам бухгалтерского учета. Типа:

    счет 20 56 чел

    счет 44 12 чел

    счет 26 22 чел?

    Reply
  60. RailMen

    Возможно

    Reply
  61. brvg

    А есть такой отчет под 8.3

    Reply
  62. RailMen

    (63) этот отчёт прекрасно работает с платформой 8.3, если запускать его в ЗУП 2.5. Если вы имели ввиду конфигурацию ЗУП 3.0 или 3.1 , то он для них не предназначен. Возможно, создам версию для ЗУП 3.х, но точных дат назвать не могу.

    Reply
  63. brvg

    Очень нужен для ЗУП 8.3

    Reply
  64. biker1052

    Скажите, может я не совсем разобрался в вопросе, возможно ли посчитать среднесписочную численность по структурным подразделениям? В скриншотах публикации нашел только расчет связаный с физ лицом. Задачу решаю под бухгалтерскую конфигурацию с модулем расчета заработной платы.

    Reply
  65. TABEZI1234

    ОТкроется ли он в ЗУП 3.1?

    Reply
  66. RailMen

    (67) выше уже ответил см. (64)

    Reply

Leave a Comment

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