<?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='\
Стандартные механизмы, насколько я помню, завязаны на объект-регистратор и таблицу движений по регистру расчетов РасчетСреднегоЗаработка (поправьте меня, если я вру). На самом деле интересно, как работает первый вариант. Вы создаете новый объект документа начисления отпуска и работаете с ним, передавая его в качестве аргумента в типовые процедуры расчета среднего заработка (и так по каждому сотруднику), я прав?
Сори, не дочитал до «Принцип работы». Спасибо за обработку.
Долго читал но не могу понять. Расчет среднего делается из Управленческого учета, документ отпуск Организаций для чего (период сотрудник итд выбрать данные если правильно понял) расчитали средний а дальше создается ли документ в управленческом учете, или управленческие расчеты пишете в бухгалтерском учете, за обработку однозначно «плюс»
GStiv,
в конечном итоге, в базе ничего не создается и ничего не записывается. По сути это просто отчёт. То есть показ пользователю каких-то данных. Почему назвал же я назвал его обработкой? Потому что программно создается/удаляется документ, а это уже изменение данных, хоть и кратковременное.
У нас отчет используется в управленческом учете — отсюда и название. Документ Начисление отпуска — это все лишь средство для получения данных. Если создаёте его вручную — потом пометьте на удаление, чтоб «не путался под ногами».
Я понял спасибо, очень должен пригодится, с управленческим учетом не работал, сейчас как раз переводим организацию на ЗУП и возникла проблемма расчета среднего, еще один вопрос, если я укажу реальный расчитанный документ отпуска организаций, он изменится после расчетов (отменит проведение, пометит на удаление итд) или останется как есть
(5) GStiv,
да, он изменится. При расчете в него по очереди подставляются сотрудники из списка, и в конце расчета документ будет записан с последним сотрудником. Лучше вам создать отдельный документ, записать его, а после расчета — пометить на удаление. Быстро создать этот документ можно скопировав уже имеющийся документ. А если это утомительно — воспользуйтесь первым вариантом заполнения обработки.
Я так понял, что рассчитывается средний только за год? Или же можно указать произвольный период расчета (например за 3 месяца)?
(7) kgdrsu,
можно указать произвольный период расчета. Будет тоже самое как если бы вы подставили даты произвольного периода в документ Начисление отпуска.
Олег, спасибо за обработку, очень пригодилась, однозначно плюс)
Вопрос только в том, нуждается ли эта обработка в дальнейшей доработке? сейчас в список собираются все сотрудники даже когда-то давно уволенные, можно также сделать отбор-группировку по подразделениям, короче усовершенствовать отборы. Я пока и сам не знаю нужно ли это, у нас в организации была разовая задача и мы ее быстро решили с помощью этой обработки. Хотелось бы услышать мнение о необходимости дорабтки.
(10) kozlovvp,
http://infostart.ru/public/83625/
я думаю её нужно доработать, получать с/з по всем сотрудникам смысла нет, так как многие уже давно уволились. Соответственно такая доработка позволит быстрее получать данные и в них не будет «лишних» людей.
Впоследствии думаю заняться этим вопросом, но сейчас пока не могу — стоят другие задачи. Также планируется на базе её сделать расчет резерва отпусков по аналогии с вот этим отчетом:
Ну у нас те же задачи, только отчет более обширный, с суммами по обязательствам, отклонениями. Сейчас сделали руками, но к началу года нужно будет сделать на базе вашей идеи отчет-обработку, по мере развития я буду выкладывать здесь
Спасибо, очень пригодилась Ваша обработка.
Спасибо, отличная обработка!
Отличная обработка!
Спасибо! Обработка очень пригодилась.
Жаль, что нет механизма расчета без временных данных. И скорость расчета низкая(. Но это уже вопрос к разработчикам ЗУП.
У себя в базе создал регистр сведений, куда каждый месяц будет добавляться средний заработок каждого работающего сотрудника. А то у меня формирование почти час занимает(
Прикольно, пригодилась
Приветствую всех. Мне очень нужна обработка.Согласна заплатить, но долго все это оформлять, может просто блиц-оплату сделать автору, а может кто-нибудь, кто уже скачал, поделиться, буду очень признательна.
почту напишите пожалуйста.
Есть мысли как это сделать без документа «Начисление отпуска сотрудникам организации»? Потому что если сотрудников больше 1000 то ждать нужно оочень долго…
(21) Feelthis, наверняка есть, но нужно изучать конфигурацию. Если вы пользователь, то рекомендовал бы запускать заранее, а если вы программист — можно сделать фоновым заданием с хранением в регистре сведений (как сделал наш коллега), либо посмотреть за счет чего можно съэкономить время.
(22) Я правильно понимаю, что результат формирования отчета скидывается в регистр сведений? А если например зарплату за предыдущий месяц пересчитали, данные по среднему уже в регистре не актуальны..
(23) Feelthis, если вы сделаете хранение результатов в регистре сведений (1), и фоновое задание (2) которое автоматически без участия пользователя будет отрабатывать, например раз в день/раз в два дня, то даже если будут какие-то перерасчеты — данные в регистре будут актуальны. Вопрос только в том чтобы реализовать это технически, это не особо сложно, и попытаться предугадать как срочно могут понадобиться эти данные.
….а есть что нибудь подобное для ЗиК?
Есть мысли как это сделать без документа «Начисление отпуска сотрудникам организации»? Потому что если сотрудников больше 1000 то ждать нужно оочень долго…
Очень хорошая обработка!!!
Говорил об этом в другой обработке.
Ставить условие на организации.
Бывает, что необходимо сформировать отчет только по 1 организации.
Навесив выборку сотрудников только по Организации ускорится работа.
Понял еще одну вещь. Большая часть подобных обработок построена на использовании Документа начисление отпуска,
или еще не нашел.
Печально.
Я уже обрадовался, что он управленческую среднюю считает…
Ну всё равно спасибо, что выложил.
Спасибо! Очень актуально!
спасибо за отчет, ломал голову тоже как сделать без создания документа… решил поискать тут,но увы. Скачаю ваш, посмотрю.
Для работы в релизе 2.5.57.1 нужно добавить в алгоритм заполнения документа — поле «ДатаВыплатыДохода», иначе расчета среднего не произойдет (вернет 0).
Скажите пожалуйста, если мне нужно сосчитать средний оклад по организации за месяц, поможет ли мне эта обработка?
Перед скачиванием хотел бы еще раз уточнить — расчет по регламентированным данным?
Добрый день! Как решили проблему с датой запрета редактирования? Создавая временный документ «Начисление отпуска в организации» , при записи документ делает движения по регистрам, но период может быть уже закрыт и выпадает отчет в ошибку » Не удалось записать: «Основные начисления сотрудников организаций»!»
Подскажите как решить эту проблему.
(36) forever-lilya, запись в закрытых периодах возможна с полными правами и специально включенной возможностью записи в закрытых периодах под полными правами (снять галку в сервис — настройка программы — ограничение доступа — применять дату запрета редактирования данных для пользователей с полными правами)
если у пользователя нет административных прав (конкретно непосредственное удаление) отчет будет работать или будет выдавать ошибку «недостаточно прав доступа»?
Подскажи, она считает среднедневной заработок за определенное количество дней или средний заработок по месяцам. Не видно на скриншоте цифры.
Моё сугубо личное мнение состоит в том, что за такой подход нужно бить железной линейкой по рукам, долго и упорно.
http://infostart.ru/public/154236/
Автор посмотрите как рассчитывается средняя например здесь
(40) Vit aka proger, судя по вашей конструктивной критике — вы здесь самоутверждаетесь. Потрудитесь пожалуйста изложить что именно вам не нравится в этом «подходе». Спасибо!
Отчет выдает средний заработок равен 0,00
Спасибо! Очень помогла времени сидеть думать не было)) . Чуть чуть пришлось доработать, убрать уволенных)) И задача была другая нужен был средний по документу «Оплата по среднему заработку»
А зачем удалять документ? Про НачатьТранзакцию(); и ОтменитьТранзакцию(); здесь что ли никто не слышал?
Добрый день. Для ЗуП 3 Планируете сделать аналог?
(44)
(45) тоже интересно
(43) выкладывай)
Добрый день!
Подойдет ли данная обработка к 1С:УПП (ред. 1.3)?
Добрый день!
Присоединяюсь к вопросам:
Подойдет ли данная обработка к 1С:УПП (ред. 1.3)?
Планируется ли написание обработки для ЗУП 3.0 — ERP 2.4?
На релизе 2.5.130.2 не работает…увы