Проверка кадровых данных для НДФЛ




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

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

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

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

25 Comments

  1. gutentag

    Замечание/Ошибки:

    — обработка не видит наличие лишних пробелов(справа и/ли слева) в серии и номере паспорта гражданина РФ.

    — не сообщает об улице которой нет в кладре (например Московская область)

    У меня эти ошибки вылезали при сдачи сведений о доходах сотрудников через интернет(Контур-Экстерн)

    Reply
  2. СергейКа

    Увы. Написал специально: проверка производится штатными средствами. Её предназначение немного в другом. Качество проверки зависит от релиза ЗУП, на котором проверяется.

    Reply
  3. gutentag

    (2) http://buhsoft.ru/?title=pressa/xmltest/at.php -> проверяй до опупения 🙂

    Reply
  4. СергейКа

    (3)Спасибо за сслыку, но обработка, это проверка ДО формирования. А не готовых файлов. Никак не поймете предназначения, ввязываетесь в спор 🙂

    Я абсолютно согласен, что штатные механизмы проверят не абсолютно всё.

    Но согласитесь, что если Вы имеете возможность исправить хотя бы 3/4 ошибок в обычном рабочем режиме, то легче будет при непосредственной сдаче.

    Кроме того описаннные Вами ошибки… Скорее это просто «дотошность» Контур-Экстерн. Такое у нас в налоговой принимается влёт и без вопросов…

    Reply
  5. rasswet

    а нельзя сделать проверку по всем? а то у меня база пока без доходов, я бы адреса проверил

    Reply
  6. СергейКа

    (5) Можно 🙂 Чуток позже.

    Reply
  7. СергейКа

    (5) Добавил.

    Reply
  8. rasswet

    Ошибка в серии удостоверения личности: серия документа должна состоять из двух частей, резделенных с-

    косяк. что там дальше после с?

    если запускаю с флагом где доходы а их нет то

    {Форма.Форма(185)}: Ошибка при вызове метода контекста (Выполнить): {(62, 47)}: Поле не найдено «ОсновныеНачисленияРаботниковОрганизаций.»

    И ОсновныеНачисленияРаботниковОрганизаций.<<?>>//УсловиеНаОрганизацию

    Результат = Запрос.Выполнить();

    по причине:

    {(62, 47)}: Поле не найдено «ОсновныеНачисленияРаботниковОрганизаций.»

    И ОсновныеНачисленияРаботниковОрганизаций.<<?>>//УсловиеНаОрганизацию

    Reply
  9. rasswet

    если там имеется ввиду пробел в серии, то он стоит. и ещё не понятно: в нормальном адресе ругается на возможные лат символы. нет там их.

    Reply
  10. СергейКа

    (9) Исправил. Поменял название переменной, а на изменение в условии забыл…

    теперь должно быть нормально.

    Reply
  11. rasswet

    а серия документа должна состоять из двух частей, резделенных с-

    так и осталось.

    Reply
  12. СергейКа

    (11) Это не ошибка обработки. Это стандартное сообщение. Выводится в следующем случае:

    Если код документа 1 (паспорт СССР и свид о рожд.), то серия должна делиться символом «-«.

    Reply
  13. rasswet

    ок, понял. но всё равно в таб части сообщение не полностью. символов не хватает в свойствах ячейки чтоли?

    Reply
  14. СергейКа

    (9) Есть там латинские буквы 🙂

    Если честно, это ошибка типовой конфигурации.

    В модуле «РегламентированнаяОтчетность» есть функция СтрокаНаписанаПоРусски(), в которой проверяется наличие «не русских» символов. Причём список допустимых заносится по коду символа. В этом списке почему-то нет символа «N», хотя в классификаторе он присутствует. Эта ошибка с самой первой версии ЗУП тянется и никак не исправят. Поэтому после проверки адреса мы на такие сообщения не обращаем внимания 🙂

    (13) Что значит не полностью? На длину строки в таб части ограничение 100 символов. Должны все сообщения помещаться… А если на форме не видно, то для этого она растягиваться может 🙂

    Reply
  15. rasswet

    (14) там 120 символов, примерно подсчитал. это раз.

    а вот вторых, как ты думаешь, я не догадался растянуть форму твою? обижаешь…

    ошибка с символом «N» для твоего отчета решается легко. удивляюсь как ты не зашарил. скопируй себе эту процедуру, добавь символ и используй правильную.

    просто игнорить это не правильно, ибо реально могут быть ошибки и пропустишь.

    правь)) я бы сам сделал, делать то нефик, но ты автор..так что))

    Reply
  16. СергейКа

    (15) Количество символов в колонке ошибке поставил неограничено.

    Уж простите, но копировать процедуру проверки ПОКА не буду по следующим причинам:

    1) Получится что копировать и изменять надо ВСЕ процедуры проверки, так как это не единственная ошибка в типовой. А для этого надо их (ошибки) отловить. 2) Требовалось МАКСИМАЛЬНО использовать штатные механизмы.

    3) Я надесь, что такое в типовых всё же поправят 🙂

    Reply
  17. rasswet

    ну раз не единственная..

    ок.

    Reply
  18. СергейКа

    16 + Опять же, имеющегося функцинала хватит для сдачи отчетности практически на 99%. ставшееся можно поправить и другими средствами.

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

    Reply
  19. Fakel

    работает нормально даже бухгалтера радуються!!! МОЛОдцы парни

    Reply
  20. RailMen

    «Виртуозный» у тя запрос ТекстЗапросаСДоходами=… 🙂

    Reply
  21. RailMen

    В функции ПолучитьСписокРаботников() в запросах не участвует таблица РС «РаботникиОрганизаций» — хотя, если следовать наставлениям курса «Решение расчетный задач», получить ТЗ актуальных сотрудников можно тока через нее. Ну впрочем логика мне ясна — все и так РАБОТАЕТ :):):)

    Reply
  22. СергейКа

    (21) Фишка не в том, что бы получить АКТУАЛЬНЫЙ список работников. Есть много различных вариантов, когда физлица получавшие доход в РС «РаботникиОрганизаций» вообще присутствовать не будут.

    А чем запрос с доходами не понравился?

    Reply
  23. RailMen

    Не-е, это я так 🙂

    Любой работающий как надо запрос мне нравится!

    (но я бы сделать чу-у-уть подругому)

    Reply
  24. СергейКа

    Есть у меня несколько запросов по ЗУП, вообще «безумных». Писать как делают в 1С — блоками, а потом состыковывать — неудобно для тестирования. Есть, например, с использованием 3 ВТ и 6 вложенных … 🙂

    Reply
  25. mameev@beliyzamok.ru

    Спасибо. Работает так же в УПП.

    Reply

Leave a Comment

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