Средний заработок. Расчет среднего заработка для списка сотрудников. Управленческий учёт. Для типовых баз ЗУП 8.2




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

50 Comments

  1. KAPACEB.AA

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

    Reply
  2. KAPACEB.AA

    Сори, не дочитал до «Принцип работы». Спасибо за обработку.

    Reply
  3. GStiv

    Долго читал но не могу понять. Расчет среднего делается из Управленческого учета, документ отпуск Организаций для чего (период сотрудник итд выбрать данные если правильно понял) расчитали средний а дальше создается ли документ в управленческом учете, или управленческие расчеты пишете в бухгалтерском учете, за обработку однозначно «плюс»

    Reply
  4. mrdug

    GStiv,

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

    У нас отчет используется в управленческом учете — отсюда и название. Документ Начисление отпуска — это все лишь средство для получения данных. Если создаёте его вручную — потом пометьте на удаление, чтоб «не путался под ногами».

    Reply
  5. GStiv

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

    Reply
  6. mrdug

    (5) GStiv,

    да, он изменится. При расчете в него по очереди подставляются сотрудники из списка, и в конце расчета документ будет записан с последним сотрудником. Лучше вам создать отдельный документ, записать его, а после расчета — пометить на удаление. Быстро создать этот документ можно скопировав уже имеющийся документ. А если это утомительно — воспользуйтесь первым вариантом заполнения обработки.

    Reply
  7. kgdrsu

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

    Reply
  8. mrdug

    (7) kgdrsu,

    можно указать произвольный период расчета. Будет тоже самое как если бы вы подставили даты произвольного периода в документ Начисление отпуска.

    Reply
  9. kozlovvp

    Олег, спасибо за обработку, очень пригодилась, однозначно плюс)

    Reply
  10. kozlovvp

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

    Reply
  11. mrdug

    (10) kozlovvp,

    я думаю её нужно доработать, получать с/з по всем сотрудникам смысла нет, так как многие уже давно уволились. Соответственно такая доработка позволит быстрее получать данные и в них не будет «лишних» людей.

    Впоследствии думаю заняться этим вопросом, но сейчас пока не могу — стоят другие задачи. Также планируется на базе её сделать расчет резерва отпусков по аналогии с вот этим отчетом: http://infostart.ru/public/83625/

    Reply
  12. kozlovvp

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

    Reply
  13. LynxX

    Спасибо, очень пригодилась Ваша обработка.

    Reply
  14. camomile

    Спасибо, отличная обработка!

    Reply
  15. I_Aleksa

    Отличная обработка!

    Reply
  16. IrinaYr

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

    Reply
  17. Armando

    Жаль, что нет механизма расчета без временных данных. И скорость расчета низкая(. Но это уже вопрос к разработчикам ЗУП.

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

    Reply
  18. Trofimov_M

    Прикольно, пригодилась

    Reply
  19. Merlin12042009

    Приветствую всех. Мне очень нужна обработка.Согласна заплатить, но долго все это оформлять, может просто блиц-оплату сделать автору, а может кто-нибудь, кто уже скачал, поделиться, буду очень признательна.

    Reply
  20. mrdug

    почту напишите пожалуйста.

    Reply
  21. Feelthis

    Есть мысли как это сделать без документа «Начисление отпуска сотрудникам организации»? Потому что если сотрудников больше 1000 то ждать нужно оочень долго…

    Reply
  22. mrdug

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

    Reply
  23. Feelthis

    (22) Я правильно понимаю, что результат формирования отчета скидывается в регистр сведений? А если например зарплату за предыдущий месяц пересчитали, данные по среднему уже в регистре не актуальны..

    Reply
  24. mrdug

    (23) Feelthis, если вы сделаете хранение результатов в регистре сведений (1), и фоновое задание (2) которое автоматически без участия пользователя будет отрабатывать, например раз в день/раз в два дня, то даже если будут какие-то перерасчеты — данные в регистре будут актуальны. Вопрос только в том чтобы реализовать это технически, это не особо сложно, и попытаться предугадать как срочно могут понадобиться эти данные.

    Reply
  25. flash82

    ….а есть что нибудь подобное для ЗиК?

    Reply
  26. Foxux

    Есть мысли как это сделать без документа «Начисление отпуска сотрудникам организации»? Потому что если сотрудников больше 1000 то ждать нужно оочень долго…

    Reply
  27. Girl_Tat

    Очень хорошая обработка!!!

    Reply
  28. BRT

    Говорил об этом в другой обработке.

    Ставить условие на организации.

    Бывает, что необходимо сформировать отчет только по 1 организации.

    Навесив выборку сотрудников только по Организации ускорится работа.

    Понял еще одну вещь. Большая часть подобных обработок построена на использовании Документа начисление отпуска,

    или еще не нашел.

    Печально.

    Reply
  29. SoulPower

    Я уже обрадовался, что он управленческую среднюю считает…

    Ну всё равно спасибо, что выложил.

    Reply
  30. Nusa

    Спасибо! Очень актуально!

    Reply
  31. kirill_11

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

    Reply
  32. kabanoff

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

    Reply
  33. Гость

    Скажите пожалуйста, если мне нужно сосчитать средний оклад по организации за месяц, поможет ли мне эта обработка?

    Reply
  34. pilotfitz

    Перед скачиванием хотел бы еще раз уточнить — расчет по регламентированным данным?

    Reply
  35. forever-lilya

    Добрый день! Как решили проблему с датой запрета редактирования? Создавая временный документ «Начисление отпуска в организации» , при записи документ делает движения по регистрам, но период может быть уже закрыт и выпадает отчет в ошибку » Не удалось записать: «Основные начисления сотрудников организаций»!»

    Подскажите как решить эту проблему.

    Reply
  36. pilotfitz

    (36) forever-lilya, запись в закрытых периодах возможна с полными правами и специально включенной возможностью записи в закрытых периодах под полными правами (снять галку в сервис — настройка программы — ограничение доступа — применять дату запрета редактирования данных для пользователей с полными правами)

    Reply
  37. naskat

    если у пользователя нет административных прав (конкретно непосредственное удаление) отчет будет работать или будет выдавать ошибку «недостаточно прав доступа»?

    Reply
  38. Casek2012

    Подскажи, она считает среднедневной заработок за определенное количество дней или средний заработок по месяцам. Не видно на скриншоте цифры.

    Reply
  39. Vit aka proger
    При первом варианте автоматически создается документ Начисление отпуска сотрудникам организации с номером «Временный» на текущую дату. Если документ с подобным номером найден — обработка берет его. Если не может создать документ — предлагает воспользоваться уже созданным. После окончания работы документ удаляется.

    Моё сугубо личное мнение состоит в том, что за такой подход нужно бить железной линейкой по рукам, долго и упорно.

    Автор посмотрите как рассчитывается средняя например здесь http://infostart.ru/public/154236/

    Reply
  40. mrdug

    (40) Vit aka proger, судя по вашей конструктивной критике — вы здесь самоутверждаетесь. Потрудитесь пожалуйста изложить что именно вам не нравится в этом «подходе». Спасибо!

    Reply
  41. kapakusaka

    Отчет выдает средний заработок равен 0,00

    Reply
  42. Serega-77

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

    Reply
  43. Picikato

    А зачем удалять документ? Про НачатьТранзакцию(); и ОтменитьТранзакцию(); здесь что ли никто не слышал?

    Reply
  44. wes1977

    Добрый день. Для ЗуП 3 Планируете сделать аналог?

    Reply
  45. forever-lilya

    (44)

    Reply
  46. forever-lilya

    (45) тоже интересно

    Reply
  47. forever-lilya

    (43) выкладывай)

    Reply
  48. atsar

    Добрый день!

    Подойдет ли данная обработка к 1С:УПП (ред. 1.3)?

    Reply
  49. ivamailh

    Добрый день!

    Присоединяюсь к вопросам:

    Подойдет ли данная обработка к 1С:УПП (ред. 1.3)?

    Планируется ли написание обработки для ЗУП 3.0 — ERP 2.4?

    Reply
  50. trn

    На релизе 2.5.130.2 не работает…увы

    Reply

Leave a Comment

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