Налоговая ведомость по страховым взносам v1.08




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2018-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='\

33 Comments

  1. Akv@rel

    А на УПП будет работать?

    Reply
  2. kondrp

    (1). Проверял на типовой УПП 1.2.27.1 — Работает.

    Reply
  3. Ирка

    При оплате по договорам подряда выдает деление на 0 🙁 БазаСтраховыхВзносов не всегда равна «БазаФСС», для ДГПХ БазаФСС = 0

    Reply
  4. igor-pn

    Немножко скорректировал, чтобы не было деления на ноль. У нас в ЗУПе выдает такую ошибку

    Reply
  5. Ирка

    Ошибку выдает у тех, у кого начисления только по ДГПХ. В справочнике ДоходыПоСтраховымВзносам есть реквизиты ВходитВБазуФОМС, ВходитВБазуФСС, ВходитВБазуПФР. Надо их попробовать прикрутить к отчету и показать отдельно базы по ПФР и ФСС.

    Большое спасибо за отчет.

    Reply
  6. lusilda

    Подскажите на 2.5.19.3 не будет работать?

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

    Reply
  7. kondrp

    (6) На 2.5.19.3 не проверял, но думаю, что должна. По крайней мере структура регистров в 2.5.20.3 осталась та же.

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

    Reply
  8. vsmirnov6

    У нас две базы 2.5.20.3, все SQL, так в одной все ОК, а другая ругается «деление на 0»

    Reply
  9. kondrp

    (8) Сегодня вечером выложу исправленный отчет с новыми возможностями.

    Ошибка деления на ноль там уже исправлена

    Reply
  10. RailMen

    ЗиУП 2.5.19.3.

    Отчет не сформирован!

    Деление на 0…

    🙁

    Reply
  11. kondrp

    (10) Ошибка деления на ноль исправлена. Новый вариант отчета v1.06 уже выложил

    Reply
  12. RailMen

    Отчет сильный. Однако как можно объяснить то, что у меня в документе «Начисление страховых взносов»:

    Иванов оклад 42000, премия 3000. База для расчета взносов: 45000.

    Суммы взносов: ФСС=1 305,00 ; ФСС несчастные = 90,00 ; ФФОМС=495,00 ; ТФОМС = 900,00 ; ПФР нак =0; ПФР страх =9 000,00

    А в твоем отчете сумм взносов нету совсем???

    Reply
  13. RailMen

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

    Reply
  14. kondrp

    (13) Я больше привык работать с данными регистров накопления. Брать данные из документа имеет смысл, только если они больше никуда не записываются (как, например, в случае с проводками). Здесь же все данные хранятся в регистрах расчета «Осн.начисления», «Доп.начисления», регистрах накопления «СтраховыеВзносыСведенияОДоходах», «СтраховыеВзносыИсчисленные».

    Reply
  15. kondrp

    (12) Если в отчет суммы взносов не попали, нужно посмотреть есть ли там суммы баз для взносов. Если есть, то это возможно ошибка отчета, если нет, то это возможно Ваша ошибка, т.к. нет движений в регистрах накопления «СтраховыеВзносыСведенияОДоходах», «СтраховыеВзносыИсчисленные».

    Reply
  16. RailMen

    В том то и дело, что в документе «Начисление страховых взносов» по Иванову заполнены закладки «Основные начисления», «Дополнительные начисления» и, конечно, «Взносы» теми суммами, которые я описал в (12).

    Более того, такие суммы есть в регистрах расчета.

    Данные конечно лучше брать не из документа, а из регистров накопления «Страховые взносы исчисленные» и «Учет доходов для исчисления страховых взносов» (в конфигураторе называется «СтраховыеВзносыСведенияОДоходах»), по которому документ ДЕЛАЕТ движения. Короче отчет у меня формируется не корректно , хотя все записи регистров совпадают с данными таб частей документа. Впрочем может это только у меня ))) ЗиУП 2.5.19

    Reply
  17. kondrp

    (16) На моих данных (в базе более 3000 сотрудников) ошибка, как я не старался, не воспроизводится. В данном случае, не имея на руках для тестирования Вашу базу данных, могу только порекомендовать проверить отдельно как формируется каждый вложенный запрос этого отчета в консоли запросов. Если обнаружится, что это ошибка отчета, то я ее обязательно поправлю.

    Reply
  18. RailMen

    а релиз ЗиУП какой у тебя?

    Reply
  19. RailMen

    у меня 1,5тыс чел. половина не формируется

    Reply
  20. kondrp

    (18) 2.5.20.3.

    Reply
  21. kondrp

    (19) А есть ли у этой половины какие-либо особенности, может инвалиды или договора подряда, ЕНВД ?

    Reply
  22. RailMen

    нет никаких особенностей. ЕНВД разумеется нет, инвалидов всего 34 человека.

    Reply
  23. kondrp

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

    Reply
  24. RailMen

    Оки 😀

    Reply
  25. RailMen

    Работал в воскресенье 14 февраля((( НО ТАКИ обновился до 2.5.20!!!

    Хотите верьте, хотите нет — но отчет теперь формируется !!!!!!!!!!!!!

    Reply
  26. 1cNike

    Хороший отчет, но по требованию расчетчиков пришлось немного доработать. Базы для расчета взносов ФСС и прочего различаются, например, на выплаты по договорам (в базу по ФСС эти начисления не входят, но входят в базу по прочим страховым взносам)

    Reply
  27. kondrp

    (25) Охотно верю.

    Reply
  28. kondrp

    (26) Спасибо за участие. Обязательно посмотрю в чем может быть ошибка.

    Reply
  29. smooth

    Если бы отчет отлавливал не резидентов и была база ФСС — цены б ему не было!

    Reply
  30. kondrp

    (29) Базу ФСС обязательно сделаю, а вот насчет нерезидентов — вопрос: в каком виде их нужно отлавливать ? Просто добавить группировку «Резидент»/»Нерезидент» ?

    Reply
  31. smooth

    (30) Нет не просто. Доход не резидентов должен искл. из базы.

    И еще: я так понял регрессия в отчете не учитывается. Так?

    Reply
  32. nigger

    Релиз 2.5.31.4. Идет задвоение при оплате больничных листов, если по новому алгоритму начисляется 1000 с 2011 года, ведомость показывает 2000.

    Reply
  33. Enerjaizer

    Версия 2.5.33.6 задваивает колонку «Начислено по своду», например,

    оклад 5000, ставит 10000,

    оклад 6500, ставит 13000

    И желательно добавить сохранение настройки, а так отчет просто супер!

    Reply

Leave a Comment

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