Резервы отпусков в Документе "Отражение Зарплаты в Регламентированном Учете" (Оценочные Обязательства)




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

17 Comments

  1. Brawler

    Используем типовой механизм расчета резервов, все устраивает.

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

    Что в типовом механизме расчета резервов не устраивает?

    Reply
  2. karpik666

    (1) Brawler, В типовой зуп расчет оценочных обязательств происходит так, отраженный в учетной политике процент умножается на сумму расходов по оплате труда и страховых взносов за каждый месяц, то есть сумма планирования может быт не точной.

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

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

    Reply
  3. karpik666

    Так, 5 человек скачало. И никто даже строчки не чиркнет: устраивает или нет.

    Reply
  4. gortol

    Добрый день

    планируется ли сделать подобное для ЗУП 3.0? (тк там беда с резервами отпусков — те их нет..((( )

    Reply
  5. karpik666

    (4) gortol, К сожалению я совсем не знаком с ЗУП 3.0, поэтому пока не планируется.

    Reply
  6. jilzzoni

    1. Почему для расчета суммы резерва используете 3 дня отпуска, а не 2,33?

    2. Учитываются ли при расчете страховых взносов пределы облагаемых баз по взносам в разные фонды?

    3. Учитываются ли нюансы начисления страховых взносов с выплат временно пребывающим иностранцам и иностранцам-ВКС?

    4. На мой взгляд, для определения сотрудника, по которому следует начислять резерв, правильнее использовать Остаток отпуска на конец периода, точнее, месяца.

    5. Вы пишете: «2. Проставить расчетную базу для резерва (оценочного обязательства) в справочники «Оценочные обязательства». В расчетную базу необходимо включить отпускные, компенсации отпуска.».

    Зачем нужно включать в расчетную базу отпускные и компенсацию отпуска?

    Вообще-то, по моему мнению, это неправильно.

    Reply
  7. karpik666

    (6) jilzzoni,

    1) На самом деле для начисления берется среднемесячное значение начисления дней отпуска по месяцам, например, положено сотруднику 36 дней в год, то значит начисляется резерв на 36/12 = 3 дня, если 28, то 2,33. Все зависит от того сколько дней отпуска назначено сотруднику.

    2) Да, при расчете страховых проверяется доход физ лица и сравнивается с предельной базой по ФСС и ПФР, по ФОМС предельной базы в этом году нет.

    3) Скорее всего нет, так как писалась давно, а беженцев ввели в ЗУП недавно.

    4) В обработке сотруднику берутся из работающих на момент начала расчета резерва. А уже по оставшимся проверяются не имеют ли они остаток отпуска с минусом, если имеют и остаток включая текущее начисление по резерву все равно <= 0, то резерв не начисляется.

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

    Reply
  8. Эсти

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

    Reply
  9. karpik666

    (8) Эсти, Видимо это какое-то изменение в инфостарте, как обычно с багами, до этого не отправлялось на e-mail. Сейчас попробовал: при выборе «Отправить» файл не отправляется на e-mail, а просто загружается. Посмотрите, может он есть в загруженных. Также при оплате можно качать этот же файл в следующий раз бесплатно. Если все-таки файла нет, напишите мне в личку вашу почту, и я вам отправлю обработку.

    Reply
  10. zexpress

    А почему у меня в базе она считает дней отпуска 4,33 ??? а не 2.33 ??? от чего это может зависеть?

    Reply
  11. karpik666

    (10) zexpress, по идее количество дней начисления резерва зависит от «Справочника виды ежегодных отпусков», там должна стоять галка «Предоставлять отпуск всем сотрудникам», далее надо смотреть отпуск, который проставлен в должностях, на которых прибывал сотрудник, эти дни нужно добавить к общему отпуску, а затем нужно смотреть на индивидуальный отпуск каждого сотрудника, находится он справочники «Сотрудники» — Ежегодные отпуска. Если там ошибок не найдете, то скорее всего дело в алгоритме, давно его не обновлял, но если нужно переделаю.

    Reply
  12. lockrQ

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

    Reply
  13. karpik666

    (12) lockrQ, здравствуйте, на текущий момент такой возможности нет, резервы начисляются по месячно

    Reply
  14. pudovaraisa

    Добрый день. При заполнении выходит ошибка

    Ошибка при вызове метода контекста (Выполнить): {(94, 147)}: Поле не найдено «ПредельнаяВеличинаБазы.РазмерПФР»

    КОГДА СтраховыеВзносыСведенияОДоходахОбороты.РезультатОборот — СтраховыеВзносыСведенияОДоходахОбороты.СкидкаОборот >= ПредельнаяВеличинаБазы.<<?>>РазмерПФР

    тестирую на зуп 2.5

    Reply
  15. churlena

    Добрый день! Нет подобной обработки для УПП?

    Reply
  16. churlena

    (15) Разобралась. Оказалось, этот блок не отрабатывает — в УПП ОбщегоНазначенияЗК.ГоловнаяОрганизация(Организация) возвращает Органиазцию без ошибок, флаг ЭтоУПП ставится в ложь, и дальше лезут ошибки.

    Попытка

    лГоловнаяОрганизация = ОбщегоНазначенияЗК.ГоловнаяОрганизация(Организация);

    ЭтоУПП = Ложь;

    Исключение

    лГоловнаяОрганизация = ОбщегоНазначения.ГоловнаяОрганизация(Организация);

    ЭтоУПП = Истина;

    КонецПопытки;

    Reply
  17. churlena

    (16) Наверное, стоит переделать проверку на тип конфигурации.

    Конечно, можно тем, у кого УПП, насильно ставить этот флаг, как я и сделала, но это неуверсально.

    Reply

Leave a Comment

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