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




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

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