Отчет для сдачи 6-НДФЛ раздела 2 при НЕотключенной!!! галочке "Принимать исчисленный налог как удержанный" для ЗУП 2.5 и ЗБУ 1.0




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

18 Comments

  1. astra94

    Спасибо автору за отчет, но есть ошибочка — в колонке: Сумма дохода — увеличивает доход на количество строк в распределении НДФЛ. Н-р в Начислении з-пл на закладке начисление сумма всех начислений = 10000, на закладке НДФЛ 1830,55 — но распределено по 2-м источникам Доход = 1000 и субсидия 830,55, в вашем отчете будет отражено 2-ве строки

    1)доход= 10000 ндфл =1000(верно)

    2)доход=10000(задвоение дохода) ндфл=830,55(верно)

    ну и итого не идет с анализом начисленных налогов и взносов, закладка НДФЛ

    Reply
  2. Chip2003

    (1) astra94, Спасибо, за отзыв — поправил.

    Reply
  3. irisha

    Здравствуйте. А можно отчет на почту (klimova@bratsk-city.ru), а то денюжек 0,01 не хватает, а отчет такой очень-очень нужен…. Буду очень признательна.

    Reply
  4. scanner1980

    А если зарплата выплачивается разными датами, при этом например часть декабрьской выплачена в январе???

    Reply
  5. Chip2003

    (4) scanner1980, у нас всю зарплату в декабре выдали, а если нет, то вручную поправьте. Я не претендую на 100% универсальность, но в качестве помощи и сбора основной рутины — самое то! Кстати, по трудозатратам получается рутины на порядок меньше, чем причесывать регистры за все года при отключении галочки.

    Reply
  6. chmv

    1. Нет обособленных подразделений

    2. Сумма дохода неправильно считается

    Reply
  7. Chip2003

    (6) chmv

    1) Обособленные не делал — не на чем тренироваться — сами отбор добавьте в запрос.

    2) Сумма дохода неправильно считается — возможно месяц начисления не совпадает с месяцем выплаты — может потом посмотрю эту ситуацию, пока некогда.

    Reply
  8. sempaii

    Спасибо за информацию, отчет не качал, но почитал методику.

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

    1. Проставить в настройках параметра учета плановые даты выплаты аванса, зарплаты. В Вашем случае это 10 число.

    Документы «Начисление зарплаты» оформлять только последним днем месяца, тогда для записи в регистры возьмется ближайшая плановая дата выплаты — 10 число следующего месяца.

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

    • Дата документа

    • Дата выплаты дохода (на закладке Условия)

    • Дата получения дохода (на закладке Оплата – в табличной части НДФЛ)

    Reply
  9. Chip2003

    (8) sempaii, клиенты не хотят изменять дату получения дохода на вкладке «Оплата» и ставить ее, например, следующим месяцем, т.к. у них начинают расползаться типовые отчеты — приходится ее проставлять вычислением.

    Reply
  10. GeterX

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

    Reply
  11. Chip2003

    (10) GeterX, Это не баг — это фича! Я же указал в пункте 4-м, что я писал отчет под учет нашего клиента, а у него больничные межрасчетом не выплачивают, а НДФЛ рассчитан (зачем-то?!) у всех больничных. И, поэтому, я их принудительно отправил в дату выплаты зарплаты, а это уже следующий месяц, значит срок перечисления — конец следующего месяца. Если у вас не так — поправьте алгоритм отчета или вручную откорректируйте.

    Reply
  12. belchonokh

    Добрый день!

    Поправил первый запрос в отчете, что бы дата зарплаты не устанавливалась, а бралась из регистра ВзаиморасчетыСРаботникамиОрганизаций

    ВЫБРАТЬ РАЗРЕШЕННЫЕ
    ВзаиморасчетыСРаботникамиОрганизаций.ПериодВзаиморасчетов КАК ПериодРегистрации,
    НАЧАЛОПЕРИОДА(ВзаиморасчетыСРаботникамиОрганизаций.Период, ДЕНЬ) КАК ДатаВыплатыЗарплаты,
    СУММА(ВзаиморасчетыСРаботникамиОрганизаций.СуммаВзаиморасчетов) КАК СуммаВзаиморасчетов
    ПОМЕСТИТЬ ВТДатыВыплатыЗарплаты
    ИЗ
    РегистрНакопления.ВзаиморасчетыСРаботникамиОрганизаций КАК ВзаиморасчетыСРаботникамиОрганизаций
    ГДЕ
    ВзаиморасчетыСРаботникамиОрганизаций.ПериодВзаиморасчетов МЕЖДУ &НачалоПериода И &КонецПериода
    И ВзаиморасчетыСРаботникамиОрганизаций.ХарактерВыплаты = ЗНАЧЕНИЕ(Перечисление.ХарактерВыплатыЗарплаты.Зарплата)
    И ВзаиморасчетыСРаботникамиОрганизаций.СуммаВзаиморасчетов > 100000
    
    СГРУППИРОВАТЬ ПО
    ВзаиморасчетыСРаботникамиОрганизаций.ПериодВзаиморасчетов,
    НАЧАЛОПЕРИОДА(ВзаиморасчетыСРаботникамиОрганизаций.Период, ДЕНЬ)
    

    Показать

    Reply
  13. Chip2003

    (12) belchonokh, Хм… а если какой-нить крупный межрасчет будет между началом месяца и зарплатой на сумму больше 100 тыщ? )))

    Можно конечно порог повысить, а можно просто в параметры вывести &ДатаВыплатыЗарплаты1, &ДатаВыплатыЗарплаты2 и &ДатаВыплатыЗарплаты3 — и пускай 3 даты за квартал расчетчик введет перед формированием отчета.

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

    Reply
  14. AlbinaAAA

    Спасибо за отчет, помогает разобраться. Только не поняла, потом эти суммы переносить вручную в 6-НДФЛ?

    Reply
  15. Chip2003

    (14) AlbinaAAA, ну да, допиливаете базу правками документов или в екселе подгоняете (мат. помощь к отпуску например) и потом руками в 6-НДФЛ бьете — это займет у вас максимум 30 минут.

    По-другому не получится 🙂

    Reply
  16. sempaii

    (9) согласен отчет «Анализ налогов и взносов» теперь не информативен. Мы наших клиентов настраиваем все же менять даты в документах и получать 6-НДФЛ автоматом, а не заполнять вручную. Остановились на том что сейчас в Анализе все же реальная картина, фактически на конец месяца еще не произвели реальную уплату НДФЛ.

    Еще плюс в проставлении дат — 1С в ближайшем релизе добавит дату выплаты дохода в документ «Начисление зарплаты», т.е. это уже тенденция обращать внимание и корректно заполнять эти даты.

    P.S.

    Если кто еще не слышал то в ближайшем 2.5.102 релизе будет «чудо-обработка», позволяющая выстраивать документы Начисления и Выплаты. Релиз должен выйти 18 апреля. Поглядим 🙂

    Reply
  17. gev3000

    Добрый день! Работает ли данная обработка на последних релизах ЗУП 2.5?

    Reply
  18. Chip2003

    (17) gev3000, Да вроде там ничего не поменялось — никто не жаловался

    Reply

Leave a Comment

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