Передача данных персонифицированного учета в ПФР с добавленным сравнением исчисленных и уплаченных взносов за год




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

19 Comments

  1. LKS

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

    Reply
  2. artbear

    (0) Чем вариант http://infostart.ru/public/80578/ отличается от сабжа?

    Если это обновление, то нельзя создавать специальную публикацию для этого.

    если нет, жду развернутых пояснений по разнице.

    Иначе одну из разработок удаляй сам или удалю я!

    Жду ответа.

    Reply
  3. Looking

    Эти варианты абсолютно разные, вариант http://infostart.ru/public/80578/ решает гораздо более узкую задачу — отображает информацию по сотрудникам, которые либо по каким-то причинам не попали в пачки при автозаполнении, либо были удалены пользователями из пачек принудительно, в итоге чтобы это выяснить человеку со стороны достаточно нажать кнопку «Заполнить взносы» и вуаля — список людей, которые должны быть в пачках, но их нет — как на ладони. Но это речь об анализе только второго полугодия.

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

    Reply
  4. artbear

    (3) Не совсем согласен, ты же оставляешь в новой разработке старый функционал, поэтому я и считаю это развитием/обновлением 🙁

    Убери предыдущую разработку и вопрос будет снят.

    Reply
  5. Looking
    artbear пишет:

    (3) Не совсем согласен, ты же оставляешь в новой разработке старый функционал, поэтому я и считаю это развитием/обновлением

    Убери предыдущую разработку и вопрос будет снят.

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

    Reply
  6. victuan

    Всё это конечно хорошо. Но востребованней была бы обработка, которая вытягивала бы данные об уплате не из файла «_1_ИСХОДНАЯ_12010.pf», а из XML ранее выгруженного из ЗИК.

    Тут дело в чем. Многие выгрузку из ЗИК доправляют в сторонних программах от ПФР и выходной файл в итоге (в плане распределения оплат) может получиться отличным от подготовленного в ЗИК. Это во-первых.

    Во-вторых, такая обработка пригодится в будущем — когда очередной релиз ЗИК, наконец, дозреет до хранения распределения оплат в базе 1С и можно будет загрузить из XML-ов распределение оплат за «старые» периоды.

    Думаю, меня многие в этом поддержут.

    Reply
  7. victuan

    Да, и *.pf можно потерять, а xml хранится надежнее.

    Reply
  8. Looking
    artbear пишет:

    (3) Не совсем согласен, ты же оставляешь в новой разработке старый функционал, поэтому я и считаю это развитием/обновлением

    Убери предыдущую разработку и вопрос будет снят.

    Поступил проще — убрал из этой разработки старый функционал по причине их взаимонезависимости, теперь в разработке по сравнению исчисленных и уплаченных взносов за год нет функионала сравнивающего сумму взносов в пачках со сводной таблицей сумм взносов.

    Reply
  9. Looking
    victuan пишет:

    Всё это конечно хорошо. Но востребованней была бы обработка, которая вытягивала бы данные об уплате не из файла «_1_ИСХОДНАЯ_12010.pf», а из XML ранее выгруженного из ЗИК.

    Тут дело в чем. Многие выгрузку из ЗИК доправляют в сторонних программах от ПФР и выходной файл в итоге (в плане распределения оплат) может получиться отличным от подготовленного в ЗИК. Это во-первых.

    Во-вторых, такая обработка пригодится в будущем — когда очередной релиз ЗИК, наконец, дозреет до хранения распределения оплат в базе 1С и можно будет загрузить из XML-ов распределение оплат за «старые» периоды.

    Думаю, меня многие в этом поддержут.

    абсолютно согласен, конечно-же это и универсальнее и применимо в большем числе случаев, у самого пока нет возможности такое написать, если кто-то сделает и выложит буду рад «плюсануть» автору

    Reply
  10. timurei

    //В итоге для сотрудников уволенных в течение 2010г. «Итого уплачено» может получаться больше чем «Итого начислено».

    может «Итого начислено» сделать равным «Итого уплачено» а остальную сумму распределить пропорционально между оставшимися(работающими сотрудниками)???

    Reply
  11. Kruzo

    Неплохо бы этот отчет скрестить с http://infostart.ru/public/80677/. Брать данные из XML файлов с пачками СЗВ

    Reply
  12. bnk72

    Отчет понравился. Правда, убедилась, что *.pf вещь очень ненадежная. Например, у нас бух отчетность 1 полугодия делал в резервной копии (так как монопольно это делается куда быстрее), но перенести *.pf даже при условии что ту базу мы сохранили, тупо копированием *.pf в текущуую не получилсь. Не поняла даже почему. Кто знает — подскажите, не разбиралась ранее с форматом). Обработку с XML находила, но как-то мне не понравилась, looking -обработка показалась понятней и проще для пользователя. Поэтому прекрутила к нему анализ начального сальдо при формировании пачек 2 полугодия, отчет оставила тот же.. Не сочтите за плагиат, в наших условиях (работаем с несколькими фирмами и 1 полугодие сдавали нестандартно: закрывали оплаты уволенным и временно неработающим в предположении, что в след. периоде сотрудников без стажа не пропустит ни одна программа ПФР) стандартная 305 подтягивала уволенных и «дооплачивала» им сверх начисленного, а времени не остается… Если кто в подобной ситуации, можете попробовать http://infostart.ru/public/81036/

    Надеюсь, looking будет не в обиде…

    Reply
  13. Looking
    bnk72 пишет:

    Отчет понравился.

    отчего-то не вижу Вас в плюсомёте 😀

    Поэтому прекрутила к нему анализ начального сальдо при формировании пачек 2 полугодия, отчет оставила тот же.. http://infostart.ru/public/81036/

    Надеюсь, looking будет не в обиде…

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

    Советую взглянуть на http://infostart.ru/public/80953/ от victuan, возможно это то что Вам нужно

    Reply
  14. bnk72

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

    Reply
  15. mfpi

    (6) victuan,

    Так оно и получается, пришлось переделать в сторонней программке, так как сотрудники, уволенные в 1 квартале 10-года размазывались в течение всего года, а Зик не давала выгружать корретировочные и теперь. когда все было поправлено ручками — не совпадает с выгрузкой ЗиК. И так стало непонятно: остатки по 10 году закрываются или не звкрываются в 11 году. Так как письмом ПФР было сказано все что уплачено в 11 так и падает в 11, хотя платежи могут быть за 10 год.

    Reply
  16. victuan

    (15)Попробуй мою обработку, я в ней реализовал эти хотелки

    http://infostart.ru/public/80953/

    Reply
  17. iw6

    нужная вещь

    Reply
  18. Konstantin_sgt

    хорошая штука

    Reply
  19. iw6

    Спасибо за программу, очень помогает в работе.

    Reply

Leave a Comment

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