Подготовка платежных поручений на перечисление налогов




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

32 Comments

  1. director04

    Может стоит изменить наименование файла на более понятное? Ну допустим «СозданиеПлатежныхПорученийНаУплатуНалогов»…. Да и заголовок всего раздела…

    Reply
  2. tomvlad

    (1) Насколько я помню, если длина наименования файла > 50, теряется расширение.

    Reply
  3. director04

    При выборе статьи движения денежных средств, неплохо было бы установить отбор по виду «Налоги и сборы»….

    Reply
  4. director04

    В табличную часть «Суммы к перечислению» необходимо добавить подвал с итогами.

    Reply
  5. director04

    При формировании ПП не производится заполнение полей «текст получателя» и «текст плательщика», в результате — невозможно распечатать печатную форму.

    И еще — по неизвестной причине не заполнился реквизит «Коррсчет». В общем обработка полезная, очень….

    PS: как производится рассчет суммы на перечисление . У меня сумма по табличной части «Суммы к перечислению » не совпали с Суммами по платежному поручению

    Reply
  6. Serj1C

    (2) Где теряется расширение, если длина наименования файла > 50?

    Reply
  7. gutentag

    + за идею

    Reply
  8. tomvlad

    (3) При выборе статьи движения денежных средств устанавливается отбор по виду движения «Расчеты по налогам и сборам».

    (4) В табличную часть «Суммы к перечислению» добавлен подвал, в итоге выводятся суммы платежей.

    (5) Текст получателя и текст плательщика формируются типовой функцией СформироватьАвтоЗначенияРеквизитовПлательщикаПолучателя общего модуля ФормированиеПечатныхФорм. А она работает с реквизитами организации — «НаименованиеПлательщикаПриПеречисленииНалогов». Нужно проверять заполнение реквизитов.

    (6) Если я назову файл ПодготовкаПлатежныхПорученийНаПеречислениеНалогов.epf, то раньше терялось расширение «epf». Возможно сейчас это не так.

    Reply
  9. RailMen

    Я делал нечто подобное своему клиенту.

    +

    Reply
  10. Valerich

    уж скоько раз писали в 1с сделать подобное, тем более, что в клюшках это было…

    Большой жирный плюс за то, что нашли времяэто сделать

    Reply
  11. RayCon

    (10) Я в конференции 1С ещё год назад расписал, как надо сделать. !С-ники сказали «спасибо», пообщели сделать в КОРПе. Недавно посмотрел — сделали какой-то полуфабрикат. 🙁

    Что касается самой разработки, то за групповое формирование платёжек — очевидный плюс, за незнание правил оформлления налоговых платежей — столь же очевидный минус => итоговая оценка — ноль.

    На скриншотах замечены следующие ошибки, которые приведут либо к непроведению налогового платежа банком, либо к незачислению суммы налоговой инспекцией с соответствующими последствиями по пеням и недоимкам:

    1. КБК налоговой службы начинается на 182, а вовсе не на 015 => платёж не будет зачтен налоговиками.

    2. Очередность платежа налоговых платежей — 4, а не 6 => банк не примет платежку.

    3. Статус налогоплатедьщика для пенсионных взносов не 01, а 14 => налоговики имеют право не зачесть платеж.

    4. Статус налогоплательщика для НДФЛ не 01, а 02 => налоговики имеют право не зачесть платеж.

    5. Регистрационый номер налогоплательщика в ПФР не указан => платёж не будет зачтен пенсионщиками.

    6. Для платежей внутри налогового периода используется тип платежа АВ, а не НС (это не будет считаться налоговиками за ошибку, но всё равно, можно было бы и формализовать).

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

    В заключение замечу, что задача налоговых платежей формализована далеко не полностью — ещё есть, куда совершенствоваться. Можно, например, резать КБК на сегменты (см. ту же КОРП) и в зависимости от того или иного сегмента менять назначения платежа. В частности, 14-й символ КБК определяет, что платится: налог, пеня или штраф (кстати, от этого символа также зависит и очередность платежа, которая может быть равной 3 или 4). Ну, и далее в том же духе…

    P.S. Будет желание развивать продукт, пиши в личку.

    Reply
  12. RayCon

    (11) Пардон, опечатался:

    >!С-ники сказали «спасибо», пообщели сделать в КОРПе

    1С-ники сказали «спасибо», пообещали сделать в КОРПе.

    Reply
  13. Valerich

    (11) вообще-то не я автор разработки,так что предложения наверно лучше адресовать ему 🙂

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

    Кстати, не нашел как можно узнавать (подписаться) о выходе обновлений. Кто-то может подскажет?

    Reply
  14. RayCon

    Да, и вот ещё что…

    На скришоте почему указан дебетовый оборот НДФЛ. 🙁

    (8) Не бывает «двунаправленных» статей движения денежных средств: только «однонаправленные» — либо притоки, либо оттоки. Точнее, не бывает «двунаправленных» статей ДДС, если эти статьи формируют форму №4. А если это «внутриденежные» статьи, и в форму №4 они не попадают, то они могут использоваться и как притоки, и как оттоки. Налоговые платежи — однозначно должны разбиваться на два направления:

    Оттоки: уплата налогов, сборов, пеней, штрафов, госпошлин

    Притоки: возврат налогов и сборов

    Можешь назвать файл: ПакетноеФормированиеНалоговыхППИ.epf

    Reply
  15. tomvlad

    (11) (14) Цель создания скриншотов — продемонстрировать не методику заполнения налоговых платежей, а формы диалогов. Насчет именования файла — разберусь сам. КОРП смотрел, некоторые моменты как раз оттуда. Но смысла дублировать функционал не вижу, кому будет нужно, тот приобретет более дорогой продукт.

    Reply
  16. director04

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

    Молодец! А остальным — коды открыты … поправьте.

    Reply
  17. director04

    Владислав, не мешало бы еще и прогрессор организовать…

    Reply
  18. Kruzo

    Для полной автоматизации процесса неплохо бы в назначении платежа автоматом вставлять за какой период налог.

    Reply
  19. tomvlad

    (18) При заполнении таблицы налогов, в назначение платежа дописывается период.

    Reply
  20. RayCon

    (15)

    >Цель создания скриншотов — продемонстрировать не методику заполнения

    >налоговых платежей, а формы диалогов.

    А зря. Ты всё-таки делаешь не технический инструментарий, а такой, который, при неграмотной настройке, может привести к налоговым санкциям.

    >Насчет именования файла — разберусь сам.

    >Не сомневаюсь. Но моё предложение было всего лишь продолжением разумного совета (1). Замечу, кстати, что пока ещё не разобрался. 🙂

    >КОРП смотрел, некоторые моменты как раз оттуда. Но смысла дублировать

    >функционал не вижу, кому будет нужно, тот приобретет более дорогой

    >продукт.

    Я и не призывал дублировать — я призывал ГРАМОТНО формализовать задачу, т.е. ЛУЧШЕ, чем это сделано в КОРП — все предпосылки для этого уже заложены. Просто используй свои преимущества! 🙂

    Reply
  21. y22-k

    Написал нечто похожее на семерке

    Сам хотел написать на 8ке да все времени не не было, от себя можно еще добавить функцию что бы сразу и распечатывала (для тех у кого нет банк клиента)

    а так молодец!)

    Reply
  22. СержТ

    Выбор организации и формирование ПП только по ней не работает. т.Е. все налоги которые сформированы в базе из нескольких организаций формируются на выбранную.

    Reply
  23. СержТ

    Но если организация только одна — то большой плюс. Вот если бы еще номер КБК сопровождался информацией чей это кбк (пример: ПФР накоп, ФСС НСиПЗ) хотя и без этого хорошо

    Reply
  24. ntsm

    согласна с (22) насчет нескольких организаций. Еще возник вопрос, как перенести шаблоны при копировании базы на другой комп?

    Reply
  25. Dionisij

    сделал в декабре платежки за ноябрь и за декабрь, а она декабрьские заменила с теми же номерами ноябрьские. Заметил только когда выписки начал вносить.

    Reply
  26. tomvlad

    (25) При формировании платежных поручений производится поиск ранее сформированных документов по полям «ДатаПеречисления,Организация,СчетОрганизации,Контрагент,СчетКонтрагента,СчетУчетаРасчетовСКонтрагентом,Комментарий». Если будут найдены документы, идентичные вновь формируемым по данным полям, то они будут перезаполнены. В данном случае необходимо либо изменить содержимое поля «Комментарий» в документах, сформированных ранее, либо дату платежа.

    Reply
  27. margosha-80

    Многие бухгалтера мечтали о такой обработке несколько лет.

    Reply
  28. Nadinar

    почему на печать не выводит КБК ОКАТО и.д. или я что то не так делаю???

    Reply
  29. 1Magadan

    А как использовать эту замечательную обработку в 1С 8.2?

    Появляется сообщение об ошибке:

    {Форма.Форма.Форма(184)}: Поле объекта не обнаружено (ВидОперации)

    ЭлементыФормы.СписокПлатежей.Значение.Отбор.ВидОперации.Использование = Истина;

    Reply
  30. Xeops

    Спасибо. Помогло.

    Reply
  31. Hellgga

    (29) И у меня так же…Конвертация не помогла.

    Reply
  32. tomvlad

    (31) Hellgga, в БП редакции 2.0 есть штатная обработка «Формирование платежных поручений на уплату налогов». Какой смысл использовать старую, не предназначенную для этой редакции обработку?

    Reply

Leave a Comment

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