ЗУП: Заставляем отчёт Анализ начисленных налогов и взносов (НДФЛ) обсчитывать налоговый период (год) без доработки




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

11 Comments

  1. Lukich66

    из текста статьи:

    Одна из постоянных задач, стоящих перед бухгалтерами-расчётчиками зарплаты — это контроль за своевременностью и полнотой уплаты в бюджет удержанного с сотрудников НДФЛ в бюджет



    Сомневаюсь я ,однако. Расчетчику глубоко до лампочки сколько НДФЛ заплатила «контора» в бюджет — не он это решает. Его задача правильно начислить и удержать. Бредятину по разноске перечисленного НДФЛ придумал человек далекий от жизни( как и распределение уплаченных взносов в ПФР). Когда вы рассчитали месяц ,а это с 05-15 число следующего за рассчитываемым, то начинаете выплачивать з/п. И вот тут по закону при выплате з/п вы должны перечислить НДФЛ( если я ошибаюсь пусть меня поправят). Т.О. если вы выдали Иванову,Петрову,Сидорову-5-го, платежку делаете (грубо 13% от суммы) без персоналий. И что теперь расчетчику колбасить ручками НДФЛ по каждой фамилии с помощью «а-ля» документа уплата взносов ? Учет начисленного и перечисленного НДФЛ ведут в бухгалтерии- там и сальдо на 1-е и обороты по дебету и кредиту 68.01- вот вам и ответ жизни. А наша задача при сдаче НДФЛ( чем мы сейчас и занимаемся)найти способ,как распределить суммы из БУХ в ЗиУП- ибо для страны

    неважно перечислен НДФЛ за Иванова,Петрова или Сидорова- важно в орг1-начислили(удержали) НДФЛ=100руб, з/п выплатили, а в бюджет отдали 75руб.

    Reply
  2. andrewks

    (1) Lukich66,

    1. следить за полнотой и своевременностью перечисления НДФЛ в бюджет — это прямая обязанность бухгалтеров-расчётчиков практически во всех конторах, с которыми я знаком. не знаю, может, в Ваших местах к этому относятся проще.

    2. помимо перечисления НДФЛ за прошедший месяц, существует, как известно, и другие случаи: например, перечисление НДФЛ с выплаченных за три дня до отпуска отпускных (уж извините за тавтологию), или при увольнении, и перечисление идёт по конкретным персоналиям, и это всё потом надо учесть при перечислении «общего» НДФЛ за месяц

    И что теперь расчетчику колбасить ручками НДФЛ по каждой фамилии с помощью «а-ля» документа уплата взносов ?

    по уволенным и отпускникам — да, а потом — сводный документ по пордразделению

    3. «неважно перечислен НДФЛ за Иванова,Петрова или Сидорова» к сожалению, текущая нормативка построена так, что важно — и нужно распределять, ибо идёт и в справки, и в отчётность в ИФНС

    Reply
  3. CepeLLlka

    Согласен с Andrew, у меня обработка автоматически создаёт документы по перечислению при создании платёжек на выплату..

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

    Меня больше бесит другое.. то, что при заполнении документа перечисление НДФЛ, он автоматом распределяет суммы, а не просто заполняет их исходя из задолженности за выбранный месяц.. думаю написать заполнение табличной части.. А то порой бред получается, когда в одном периоде начисляется за другой.. и он не берёт эти суммы в расчет при распределении..

    Reply
  4. Gesperid

    У нас несколько таких вариантов отчета: «2-НДФЛ», «НДФЛ по месяцам НП» и т.д.

    Вместо адовых списков месяцев у нас используется пользовательское поле выражение.

    Reply
  5. Lukich66

    (3) CepeLLlka, ну слава богу хоть еще один «нормальный» взгляд на проблему. Пока не столкнулся с формированием отчета по НДФЛ из ЗиУПы не подозревал о подобном способе издевательства. Так же сразу кинулся на обработку ТЧ,чтобы не портить конфу- но другие ??? пока мешают. В мелких организациях (до 100ч)наши любимые ж_бухи ручками за 2-3 часа наводят «порядок»- а вот там где >1.5-2тыс.чел- уперлись- говорят ,где ваша хваленая 1с?

    Reply
  6. andrewks

    (4) Gesperid, я рассматривал этот вариант, и это было бы очень хорошим решением, если бы не один момент: в наших базах обычно к моменту выплаты и перечисления НДФЛ за январь (14-15 февраля) уже, как правило, проходит куча начислений за февраль (отпускные, увольнения, и т.п.), выплата и перечисление по которым происходят отдельно (индивидуально). вот и пришлось извращаться. по крайней мере, другого способа без доработки отчёта не нашёл. если подскажете — буду благодарен

    Reply
  7. CepeLLlka

    Такое дело.. а почему отчёт то такой кривой?

    Вот перечисляем за февраль.. он ставит к перечислению все суммы что начислены за февраль.. а к примеру ндфл удержанный с суммы отпуска за следующий месяц(переходящий отпуск 19.02-05.03), он считает что нужно перечислять в марте.. Деньги то я выплачиваю сейчас.. а не в марте.. что за бред..

    Или это я мудак, и что-то не то делаю?

    Reply
  8. andrewks

    (7) CepeLLlka, данная методика не предназначена ответить на вопрос «сколько нужно перечислить НДФЛ в марте», она отвечает на вопрос «сколько ещё нужно перечислить НДФЛ за налоговый период январь-февраль, с учётом всех перечисленных промежуточных сумм (по уволенным, отпускникам и т.п.)».

    у нас (и во многих других организациях) методология такая: промежуточные суммы перечисляются и вносятся в ЗУП пофамильно (с ручным указанием, сколько и за кого перечислили). затем, когда наступает время полной выплаты за истекший месяц, бухгалтер смотрит, сколько ещё нужно доперечислить в бюджет

    Reply
  9. marija532

    Нужную информацию можно получить и без настройки отбора,

    а добавлением группировки по месяцу налогового периода

    и установкой избыточно большого периода, за который

    строится отчет.

    Тогда в самом отчете без отбора видна вся картина

    по месяцам налогового периода, и видно за какой

    сколько начислено, удержано, перечислено и осталось

    перечислить.

    Промежуточные суммы НДФЛ с какого-то из 50-х релизов

    тоже регистрируются в учете, поэтому проблем с построением

    отчета не возникает. Не приходится вносить перечисленный НДФЛ

    с них пофамильно (вручную).

    Reply
  10. smooth

    (0) А не проще в отборе период задать через МесяцНалогоПериода<=Дата1 МесяцНалогоПериода>=Дата2, чем список городить?

    Reply
  11. Масянечка

    Скажите, пожалуйста, а как этот отчет сформировать за год (без разбивки по месяцам) с разбивкой по людям? Спасибо!

    Reply

Leave a Comment

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