Несовпадение НДФЛ начисленного и удержанного. Проблемы в программе "1С:Зарплата и кадры 7.7".




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

    В свое время ковырялся в НК и вот что оттда почерпнул:

    Естественно, что зп в последний день месяца за этот же месяц никому никогда не выдают (ее просто невозмоно рассчитать к этому сроку).Срок выплаты зп работникам обычно прописывается в трудовом договоре или кол. договоре. Например, в одной из организаций, в которых я работаю срок выплаты зп по кол. договору 19-25 число месяца, следующего за расчетным.

    В НК сказано, что при выплате зп в срок, определенный в трудовом или кол. договоре задержки зп не происходит. А значит НДФЛ удерживается втом же периоде, в котором начислен. Разница между начисленным и удержанным НДФЛ должна возникать только в том случае, когда сотрудник не получил зп в срок.

    Почему-то конфа от 1с все это не учитывает. Но данню ситуацию можно обойти — проводить ведомость выплаты зп с нужной датой, но в «правильном» периоде, т.е. в периоде, к кототрому относится выплата (если она происходит в срок). В этом случае НДФЛ удержанный равен НДФЛ начисленный в каждом периоде, даже если сотрудник принят на работу в декабре и декабрьскую зп получает в январе.

    У этого способа есть один минус, который может минусом и не быть — нет переходящего сальдо по сотрудникам, с которым так любят бухгалтера сверять ОСВ по 70 счету в бухгалтерии. Но учитывая кучу косяков, которые возникают в программе при ведении такого сальдо (особенно если выплаты производятся в целых рублях, а то и округленные до 10 — 100 рублей) это и не минус вовсе, а свериться бухгалтерам всегда есть с чем — расчетные ведомости, свод по зп ит.п.

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

    Reply
  2. gutentag

    А не проще ли было перечислить случаи возникновения расхождения по НДФЛ ❓

    Reply
  3. bb1962

    (2) А какой смысл перечислять случаи возникновения ошибки, не объясняя как их исправить? Тем более, что ошибка часто не является следствием неправильных действий самого пользователя, как в рассмотренном в статье случае в частности.

    Надо научить расчетчика видеть ошибки, и самое главное вовремя их исправлять.

    Reply
  4. Веточка

    Давно работаю с зарплатой. Для себя сделала вывод: лучше всего исправлять НДФЛ удержанный с помощью документа Исправление. Проводить исправление «задним числом», НЕ выполнять перерасчет до текущего месяца. Обычно этом делаем в ферале-марте, в момент сдачи отчетности по НДФЛ. Поправлять можно как месяц, в которм сделана ошибка, так и декабрь. И откатить изменения легко- сделать непроведенным документ Исправление. 😉 Если поправлять налоговую карточку, слишком много внимания потмо нужно уделять правильности ее заполнения. 😀

    Reply
  5. Арчибальд

    Плюс в знак неразделенной любви к зарплате 🙁

    Reply
  6. leonidt84

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

    Reply
  7. ivnik

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

    Про карточки «НКДоходы» и «НКИтоги» они понятия не имеют. По окончанию Налогового периода в среднем картина получается почти отличной, при необходимости, «кривых сотров» я «подправляю сам, при этом я ни каких карточек в ручную не исправляю.

    Reply
  8. bb1962

    (4) Можно и документом «исправление», но предложенный способ более универсальный. Записи «НДФЛ уд.» в журнале может и не быть, например, сотрудник в ноябре уволился, выплаты не было, декабрь пустой, в январе выплата. В каком месяце лучше исправить? На мой взгляд в декабре. А где взять запись? Документ «исправление» записи не создает. А уделять внимание в обоих случаях нужно одинаково. Уделять внимание вообще полезно.

    Reply
  9. bb1962

    (6) Внимательнее читайте. Описан случай, когда долга перед государством нет, а в отчетах НДФЛ есть. Если же долг есть, кто вас заставляет его исправлять? Решение принимает расчетчик. Автоматом ничего не исправляется. Если говорить об отчете, то там применительно к проверке НДФЛ есть аж три варианта расшифровки по каждому сотруднику: 1-НДФЛ, журнал расчетов по сотруднику и обработка исправления. В последнем случае кстати есть возможность контролировать наличие оплаты, скажем так, в месяцах после ошибки. И еще, исправления никуда не улетают, они видны и от них можно отказаться. Вот здесь http://infostart.ru/public/22162/ я сформулировал принципы обработки исправления, они выдерживаются.

    Reply
  10. bb1962

    (7) > перечисляют НДФЛ исчисленный

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

    Reply
  11. Веточка

    (8) Запись НДФЛ удержанный в журнале расчетов зарплаты появляется всегда при проведении документа Начисление зарплаты. Тут выплата абсолютно не при чем. Налоговую карточку вручную безболезненно править можно только в части доходов. Править НДФЛ удержанный в карточке я бы не советовала (только если край) 😉 потому что в следующем отчетном году проблем не оберешься. И в декабре следующего года будешь разбираться, почему у тебя проблемы по НДФЛ с сотрудником, у которого весь год НДФЛ идеально взымался. Надеюсь, то что написала, поможет сэкономить читающим время и нервы при сдаче отчетности по НДФЛ. 😀 Отчет уже не за горами! Удачи всем!!!! 😉

    Reply
  12. bb1962

    (11) В свое время вел переписку с разработчиками ЗиК, которые описанную в статье ситуацию ошибкой не признали. Так вот цитата из письма:

    «Ответ разработчиков:

    В данной ситуации, по окончании налогового периода имеется долг по налогу за налогоплательщиком (работником), это отражается в отчетности по форме 2-НДФл и 1-НДФЛ за 2008 год. Перенос задолженности по налогу автоматически не переносится на следующий налоговый период. В Вашей ситуации необходимо зарегистрировать долг на начало налогового периода за налогоплательщиком в форме 1-НДФЛ за 2009 год.После начисления и расчета заработной платы и налогов в январе 2009 года, сумма удержанного налога будет зарегистрирована правильно. В отчетности по форме 2-НДФЛ за 2009 год в разделе 5.7. «Сумма, удержанная при уплате налога по перерасчету с доходов прошлых лет» будет отражена сумма удержанного налога.»

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

    Reply
  13. pirat123457

    Интересная статья, сам столкнулся с расхождением НДФЛ начисл. и удержан., происходит это при переходящем отпуске с текущего года в следующий.

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

    и НДФЛ рассчитывается в Журнале двумя суммами по двум периодам, в следствии чего происходит несовпадение НДФЛ начисл. и удержанного. 🙂

    Reply
  14. Oleg_46

    Для меня очень полезная инфа.

    Reply
  15. grig_nv

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

    Reply
  16. bb1962

    (15) Прежде чем принимать такие «мудрые» решения Вы бы хоть задумались, зачем вообще существует ДВА!!! вида расчета по НДФЛ. По Вашему разработчики совсем уж дураки? Зачем вводить два вида расчета, для того чтобы потом «переписывать» один в другой?

    Reply
  17. grig_nv

    потому что: «// такова наша интерпретация п.4 ст. 226 НК РФ «, поэтому смысла привязываться к выплатам смысла я не вижу, бухи тем более.

    Reply
  18. bb1962

    (17) Законы нужно исполнять, а не интерпретировать. А смысла в исполнении закона вы не видите до поры до времени. Налоговый агент не имеет права платить за налогоплательщика налоги из собственных средств. Поэтому в общем случае НДФЛ удержанный не равен НДФЛ начисленному.

    Reply
  19. rabanik

    Спасибо!

    Reply

Leave a Comment

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