Статистика. Форма П-4 для ЗиК 8. Приказ Росстат №566 от 01.09.2024.




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

24 Comments

  1. pavl_vs

    Численность работников округляется до 2х знаков — это обнаруживается в расшифровке; следовало бы акцентировать сей факт.

    Недоработка: суммы выодятся в рублях, а должно быть в тыс.рублей.

    Reply
  2. scanner1980

    (1) pavl_vs, исправлено.

    Reply
  3. Татуля

    спасибо большое!!

    Reply
  4. os1883

    (2)

    Добрый день.

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

    Форма в редакции:

    Приказ Росстата от 20.07.2010 № 256

    за период составления отчета более не применяется.

    А в описании сказано что отчет в форме 2012 года. Может что-то не так делаю. Не могли бы помочь?

    Reply
  5. scanner1980

    (4) os1883, попробуйте изменить период отчета или вышлите дополнительную информацию, какая версия конфигурации, какой период выбираете.

    Reply
  6. Mihandr

    Просто Красава!!! Спасибо!!!

    Reply
  7. Mister_Ugol

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

    Reply
  8. scanner1980

    (7) Mister_Ugol, начисления по подразделениям делятся корректно, численность так же должна распределятся корректно, но стоит проверить.

    Reply
  9. Mister_Ugol

    В организации есть госслужащие! Должны ли они попадать в П-4? Просто пи формировании отчета они попадают только в среднесписочную численность, а фонд зарплаты по ним не считается. В фонд попадают только рабочие должности.

    Reply
  10. scanner1980

    (9) Mister_Ugol, по правилам формирования ограничений на госслужащих нет. Проверьте настройку видов расчета.

    Reply
  11. Mister_Ugol

    В ФондНачисленнойЗарплатыПоИФиКатегориям начисления собираются по ВидЗанятости, а у госслужащих служебный договор и как я понимаю вместо ВидЗанятости, там стоит ВидДоговора. Правильно ли я понимаю?

    Reply
  12. Mister_Ugol

    (10) с суммами по госслужащим разобрался. Теперь с человеко-часами. В ЧисленностьПоКатегориям можно как-то от ПериодыРаботы.ВидЗанятости перейти к ПериодыРаботы.ВидДоговора?

    Reply
  13. scanner1980

    (12) Mister_Ugol, вид занятости — это основное место, совместительство, а вид договора — это трудовой, гпх, авторский … Это разные вещи. Либо соберите их отдельно, либо измените запрос. Могу заняться этим если скажите куда они должны попадать. И желательно какая то тестовая база, так как у меня нет госслужащих.

    Reply
  14. Mister_Ugol

    (13) все сделал. Большое спасибо за обработку!

    Reply
  15. Ever My

    Здравствуйте. Есть ли в Вашем отчете возможность деления начисленной зарплаты по подразделениям с разными ОКВЭД?

    Reply
  16. scanner1980

    (15) Ever My, Вы можете выбрать нужное вам подразделение в шапке отчета. Автоматическое деление по ОКВЭД не предусмотрено.

    Reply
  17. SmokEzor

    Подойдет ли этот отчет для ЗБУ 1.0.90.1 ?

    Reply
  18. scanner1980

    (17) SmokEzor, да

    Reply
  19. kyts

    Спасибо!

    Reply
  20. kyts

    Подскажите, пожалуйста, по какой причине может не заполняться графа 8 работников списочного состава? Все настройки по начислениям сделаны, причем графа 9 внешних совместителей заполняется.

    Reply
  21. scanner1980

    (20) все начисления берутся из регистров сведений «Основные начисления», «Дополнительные начисления» с учетом настроек каждого вида расчета. Если все настроено верно, то начисления должны попадать. Если не справитесь, то разобраться можно только с доступом к реальной базе.

    Reply
  22. silver-747

    В отчете не могу найти кнопку ЗАПОЛНИТЬ. У нас ЗУП 8.2 релиз 2.5.121.1. Добавила этот отчет в раздел Регламентирванная и финансовая отчетность

    Reply
  23. scanner1980

    (22) данный отчет предназначен только для конфигурации Зарплата и кадры государственного учреждения 1.0.

    Reply
  24. silver-747

    Жалко…

    Reply

Leave a Comment

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