Свод удержанных алиментов "Зарплата и Управление Персоналом 2.5"




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

48 Comments

  1. waltar

    ЗУП 2.5.14.3

    {Форма.ФормаОтчета(49,22)}: Процедура или функция с указанным именем не определена (ПолучитьМассивПараметовСКД)

    МассивПараметров = <<?>>ПолучитьМассивПараметовСКД(«ФизЛицо,Организация»);

    {Форма.ФормаОтчета(50,18)}: Процедура или функция с указанным именем не определена (ПолучитьМассивПараметовСКД)

    парамРазрезы = <<?>>ПолучитьМассивПараметовСКД(«ПериодРегистрации»);

    Reply
  2. director04

    Исправил, проверьте плиз…

    Reply
  3. waltar

    Колонка «Облагается алиментами»

    Если начисление идет за прошлый период или перерасчет прошлого периода, то данные начисления не учитываются…

    Reply
  4. director04

    (3) Дайте пример плиз, необходимо для воспроизведения

    Reply
  5. director04

    Обновил отчет. Новое:

    — в отчет попадают все предопределенные виды удержаний по исполнительным листам (ранее попадал только «Удержание по исп. листу процентом» — Код 0001)

    Reply
  6. waltar

    (4)

    Месяц начисления Апрель 2009

    Начисление за период с 01.01.09 по 31.01.09

    Reply
  7. director04

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

    Либо — подробное описание: какой документ, как оформить и как провести… ((((

    Reply
  8. director04

    Исправлена ошибка: задваивали суммы базы и НДФЛ, в случае наличия по сотруднику более одного исполнительного документа

    Reply
  9. marih

    {Форма.ФормаОтчета(63,22)}: Процедура или функция с указанным именем не определена (ПолучитьМассивПараметовСКД)

    МассивПараметров = <<?>>ПолучитьМассивПараметовСКД(«ФизЛицо,Организация»);

    {Форма.ФормаОтчета(64,18)}: Процедура или функция с указанным именем не определена (ПолучитьМассивПараметовСКД)

    парамРазрезы = <<?>>ПолучитьМассивПараметовСКД(«ПериодРегистрации»);

    Reply
  10. director04

    Виноват, пишу на нетиповой… использовал не стандартный общий модуль.

    Выложил полностью переработанную версию.

    Исправлнены ошибки, возникающие при наличии у сотрудника нескольких Исполнительных листов.

    Reply
  11. son_v

    Чмок-чмок, в обе щечки..Мне понравилось, осталось заценить бухам 🙂

    Reply
  12. director04

    (11) Это самый приятный плюсик )))))

    Reply
  13. REA

    А нельзя ли добавить адрес истца? Вообщем отчет замечательный! Плюсик.

    Reply
  14. director04

    (13) Можно…. Пожелания зарегистрированы, займусь попозжее. Сейчас работы завал.

    Reply
  15. director04

    (13) Ну вот, вроде бы добавил…

    Reply
  16. Neznayka

    Не берет физ.лиц у которых взымается фиксированная сумма по ИЛ. Или так и должно быть?

    Reply
  17. director04

    (16) Нет, так быть не должно. Сообщите плиз подробные настройки (все) для такого исполнительного листа, а лучше пришлите скриншот. hotel_ur@mail.ru. Буду разбираться

    Reply
  18. director04

    (16) Я дагадываюсь по вашей проблеме: вы используете предопределенные виды расчета? Если нет — то результат не будет попадать в отчет….

    Reply
  19. Neznayka

    8.1.14.72

    2.5.13.5

    в ИЛ стоит вид документа «исполнительный лист», в разделе «удержания» стоит «фиксированной суммой» и «размер» суммы.

    Reply
  20. director04

    (19)Ошибку зарегил. Исправлю

    Reply
  21. director04

    Поправил

    Reply
  22. director04

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

    Reply
  23. Neznayka

    есть возможность добавить столбцы номер и дата ИЛ?

    Спасибо!

    Reply
  24. director04

    (23) Это решается через настройку отчета перетаскиванием мышкой….

    Reply
  25. tanakon

    Есть возможность добавить сортировку по подразделению?

    Reply
  26. director04

    (25) Возможность есть, коды открыты. Развитие функционала данного отчета в ближайшее время не планируется.

    Reply
  27. eykhe

    Вовремя. Отлично. Плюс

    Reply
  28. jack_k

    Спасибо автору.

    Reply
  29. defend

    И все-таки не выводит физ.лица, у которых испол. лист фиксированной суммой.

    Reply
  30. марокко

    Включает не всю базу в «Облагается алиментами», например :

    1/не включил премию за предыдущий месяц

    2/ не включил почему то компенсацию отпуска

    Но отчет хороший, чуть — чуть доделать:)

    Reply
  31. HollyRoller

    Работает. Автору спасибо большое.

    Reply
  32. eryomenko

    Хороший отчет, очень пригодился для формирования свода удержанных алиментов в разрезе организаций.

    Reply
  33. Гелла

    Отчет хороший. спасибо. бухгалтер рад!

    Reply
  34. dimbos_s

    Не выводит физ. лица, у которых исполнительный лист фиксированной суммой.

    Reply
  35. director04

    (34) dimbos_s,

    Не выводит физ. лица, у которых исполнительный лист фиксированной суммой.

    Скачайте вот эту демоверсию. Проверьте, воспроизводится ошибка или нет. http://infostart.ru/public/57987/

    Reply
  36. dimbos_s

    (35)

    Прошу прощения, но о какой демоверсии идет речь? Где ее взять?

    Reply
  37. director04

    (36) dimbos_s, Сори…. Вот здесь http://infostart.ru/public/57987/

    То же самое, только по новым правилам и с печатью бланков почтового перевода

    Reply
  38. dimbos_s

    (37)

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

    Reply
  39. Baiybara

    (38) dimbos_s, Готов посмотреть вашу базу данных. Если есть желание пишите в персональном сообщении свои координаты.

    Скорее всего у вас установлены какие то отобры (может быть по виду удержания «Почтовый сбор»). В любом случае нужно смотреть базу данных.

    Основа для обработки — это регистры расчета «Удержания сотрудников организаций». Смотреть нужно там.

    Ошибки быть не должно, отчет работает в порядка 200 организаций, ошибок не наблюдалось.

    Reply
  40. MisSus

    Спасибо, Валерий, за отчет.

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

    Подскажите, как поправить этот момент?

    P.S. Хотел самостоятельно исправить, чтобы отчёт тянул данные не по МесяцуНалоговогоПериода , а по Дате, но в таблице НДФЛРасчетыСБюджетом.Обороты поля с Датой нет.

    Reply
  41. director04

    (40) MisSus, нужно править таблицы исходных данных (схема СКД).

    Более точно конечно же не помню — было довольно давно.

    Поймите меня правильно, сейчас идет подготовка к новому отчетному периоду. Более детально разбираться нет времени.

    Заранее благодарен за понимание.

    PS: Могу посоветовать специалиста, кто вам быстро поправит отчет (за небольшое вознаграждение).

    Reply
  42. NittenRenegade

    (18) почему так происходит? Сначала думал что из-за параметров виртуальной таблицы. Пробовал сформировать свои — результат тот же, убрал совсем — никакого эффекта. Данные из регистров БазаОсновныеНачисленияРаботниковОрганизаций, БазаДополнительныеНачисленияРаботниковОрганизаций для вида расчета, не являющегося предопределенным, в отчет не попадает.

    upd: не выяснил по поводу не предопределенного вида расчета, однако в настоящий момент объяснение моей ситуации найдено: расчет «Удержание по исп. листу кратно величине прожиточного минимума» не имеет базовых видов расчета, вот и всё. Да и откуда, в самом деле.

    Reply
  43. director04

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

    Предлагаю ознакомиться с демо-версией нового варианта отчета. http://infostart.ru/public/57987/

    Reply
  44. Error72

    Здравствуйте!

    До этого я пользовался отчетом «Свод начисленных алиментов». Но после обновления конфигурации стала вылетать ошибка в данном отчете, в результате чего он даже не запускается. Подскажите пожалуйста. Данный отчет подойдет, как альтернатива «моему» отчету?

    Спасибо!

    Reply
  45. director04

    (44) Error72, Ошибка возникла из-за перемещения некоторых процедур общих модулей.

    Выложил новую версию отчета. Можете скачать и пользоваться.

    Reply
  46. Error72

    (45) здравсвуйте! Можете мне на мыло скинуть, а то у меня стармани нет — не накопил еще =(

    Буду очень благодарен. А то на следующей неделе в отпуск и хочется спокойно его провести, что бы быхи не выдергивали из отпуска =(

    Reply
  47. Olive

    Добрый день! Спасибо за отчёт. Скажите, пожалуйста, как поправить, чтобы в программе (релиз 2.5.97.1) отображалась сумма в колонке «Налог на доходы». Что-то с форматами периодов регистрации…пока выясняю.

    Reply
  48. director04

    (47) Olive, Добрый день, Екатерина.

    Дело в том, что ранее НДФЛ регистрировался всегда на начало месяца (первым числом). В новых конфигурациях НДФЛ стали учитывать с точностью до дня.

    Поэтому, отчет требует программной доработки (под новые релизы).

    Reply

Leave a Comment

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