Оборотная ведомость по передаче данных в ПФР для ЗиК 77




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

8 Comments

  1. rimma_n

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

    Reply
  2. awbyk

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

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

    Reply
  3. gala2009

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

    Reply
  4. gala2009

    тогда как в 8 увидим остатки

    Reply
  5. awbyk

    (3)Да, это так. Информация для начального сальдо подбирается по документам «Данные, переданные в ПФР».

    Оценить обработку достаточно плюсиком.

    (4)Что-то похожее для 8: http://infostart.ru/public/202135/

    Reply
  6. kurvik

    Очень полезный отчет.Надеюсь, что сальдо по сотруднику он считает с учетом корректировочных пачек, переданных в ПФР и отражает те сведения, которые были переданы и приняты в ПФР реально.Сейчас Бухгалтера не видят истинной картины по сотруднику, а данный отчет поможет бухгалтерам действительно получать все сведения по сотруднику.Много было вопросов по этому поводу, особенно по уволенным.Молодец.Будем смотреть на практике.Однозначно плюсую.

    Reply
  7. 2011b11

    Спасибо автору за обработку. Умница, главное вовремя и надеюсь, что мы быстро сдадим отчетность в наш пенсионный фонд, у нас текучка, наши инспектора разные и требования у них разные, кто помогает исправлять, а кто не хочет этого делать, вот и приходится по два, три раза бегать в пенсионный фонд для сдачи отчетности. Ещё раз большое спасибо автору за облегчение работы простых бухгалтеров!

    Reply
  8. dekart58

    Если в модуле формы после строки 12558 вставить такой кусочек кода (см. ниже) — эта полезная штука будет работать и для пачек предыдущих периодов.

    Для а=1 По Пачки.КоличествоСтрок() Цикл

    Пачки.ПолучитьСтрокуПоНомеру(а);

    Если ((СокрЛП(Пачки.Форма)=»СЗВ-6-2″) или (СокрЛП(Пачки.Форма)=»СЗВ-6-1″)) Тогда

    Сообщить(» «+Пачки.Номер+» «+Пачки.Форма+» «+Пачки.КатегорияЗЛ);

    ТабСоставПачки = Пачки.СоставПачки;

    ТабСоставПачки.ВыбратьСтроки();

    Пока ТабСоставПачки.ПолучитьСтроку()=1 Цикл

    ТабОборот.НоваяСтрока();

    ТабОборот.Сотрудник = ТабСоставПачки.Сотрудник;

    ТабОборот.ИсчисленоСтраховаяТек =ТабСоставПачки.ИсчисленоСтраховая;

    ТабОборот.УплаченоСтраховаяТек =ТабСоставПачки.УплаченоСтраховая ;

    ТабОборот.ИсчисленоНакопительнаяТек =ТабСоставПачки.ИсчисленоНакопительная ;

    ТабОборот.УплаченоНакопительнаяТек =ТабСоставПачки.УплаченоНакопительная ;

    КонецЦикла;

    КонецЕсли;

    КонецЦикла;

    Reply

Leave a Comment

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