Статистика Форма 57-т (2013г)




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

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

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

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

41 Comments

  1. bukel

    Добрый день!

    Как реализовано заполнение граф 9, 10, 11 в Разделе 2?

    Reply
  2. MurmurSoul

    Скачала, попробовала заполнить. По большей части людей не заполнился заработок. Я так понимаю проблема связана с тем, что начисления происходят не по плановым начислениям, а разовыми начислениями.

    Reply
  3. tanyas7

    (1) bukel,

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

    в графу 10- районный коэфф.

    в гр 11- остальные, не вошедшие в гр 9 и 10 начисления

    Reply
  4. tanyas7

    (2) MurmurSoul,

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

    Reply
  5. MurmurSoul

    А какой-то настройки нет? Какие виды начислений брать и какими считать? А то мы получается вообще выпадаем

    Reply
  6. MurmurSoul

    У нас не заполнились соответственно графы 8-11. И да, виды начислений мы добавляли сами. Получается для нас вообще отчет работать не будет?

    Reply
  7. tanyas7

    я выше написала какие начисления в какую графу попадают.

    Reply
  8. tanyas7

    (6) MurmurSoul,

    да, это надо прописывать в конфигураторе

    Reply
  9. Dvorson

    (8) tanyas7, Что значит «прописывать в конфигураторе»? Те виды начислений, которые не являются конфигурационными, не попадают в ваш вариант формы? Или все же попадают в 11 графу?

    Reply
  10. Al_LM

    какую функцию выполняет пометка «Выводить всех» в верхнем правом углу?

    Reply
  11. Dvorson

    Во второй раздел не должны попадать все сотрудники, в первом разделе справа есть таблица — сколько должно попадать. Причем выборка производится случайным образом через определеный интервал и максимум 64 человека.

    Разработчик добавил возможность вывода всех (для отладки и проверки корректности занесенных данных по сотрудникам.

    Reply
  12. tanyas7

    (11) Dvorson,

    Да, Вы правы, спасибо за ответ

    Reply
  13. Лануси4ка

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

    Reply
  14. Al_LM

    Как подсчитывается кол-во сотрудников отработавших месяц полностью? у меня большие сомнения, что из 2000 сотрудников вышло всего 500.

    Reply
  15. tanyas7

    (14) brize,

    Из общего количества сотрудников исключаются сотрудники несписочного состава (совместители, работающие по договорам гпх и тд) и те сотрудники, у кого были в текущем месяце б/л, отпуска (ежегодный, дополнительный отпуск, отпуск за свой счет, по беременности и родам, учебный, по уходу за ребенком до 1,5 и 3 лет), оплата по среднему заработку; а также принятые, уволенные и перемещенные на др. должность сотрудники.

    Reply
  16. tanyas7

    (13) Лануси4ка,

    я не в курсе, может быть и должно быть. будет время — добавлю

    Reply
  17. tanyas7

    Добавлено краткое наименование организации в скобках на титульном листе

    Reply
  18. Лануси4ка

    (16) tanyas7,

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

    Reply
  19. Al_LM

    (15) tanyas7, а разве сотрудники, перемещенные на др должности не включаются?

    Reply
  20. MurmurSoul

    А возможности редактировать данные в самом отчете так же не предусмотрено?

    Reply
  21. tanyas7

    (19) brize,

    сотрудник должен отработать на одной должности весь месяц

    Reply
  22. tanyas7

    (20) MurmurSoul,

    как обычно: Таблица -> Вид-> Редактирование

    Reply
  23. MurmurSoul

    (22) tanyas7, спасибо

    Reply
  24. lockrQ

    Подскажите, почему не заполняется информация в «Справочно», все графы пустые и соответственно Раздел 2 не заполняется!

    Reply
  25. tanyas7

    (24) lockrQ,

    Скорее всего у вас в справочнике «Должности» не заполнена «Категория статистического учета»

    Reply
  26. lockrQ

    Да, действительно! Спасибо за быстрый ответ.

    Reply
  27. M@sha

    Для конфигурации ЗиКБУ пробовали?

    Reply
  28. tanyas7

    (27) M@sha,

    нет, у меня нет этой конфигурации

    Reply
  29. bukel

    Возможен ли отбор по подразделению?

    Reply
  30. tanyas7

    (29) bukel,

    нет, зачем это надо?

    Reply
  31. lulufa

    возможна ли выгрузка в xml?

    Reply
  32. bukel

    (30) tanyas7,

    Есть необходимость сдавать по обособленным подразделениям.

    Reply
  33. tanyas7

    (31) lulufa,

    к сожалению, такой возможности нет

    Reply
  34. scanner1980

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

    Если сохранить форму в регламентированных отчетах, то при повторном открытии месяц изменяется на ХХХХ.

    Reply
  35. Татьяна_69

    спасибо!!!!!!!!!!!!!!!

    Reply
  36. scanner1980

    (27) M@sha, работает но с небольшими поправками

    Reply
  37. tanyas7

    (34) scanner1980,

    Спасибо за замечание, не проверяла это.. Делала через внешние отчеты

    Reply
  38. margo_m09

    (28) tanyas7, а можете добавить еще и отбор по подразделению) очень нужно(

    Reply
  39. margo_m09

    (32) bukel, как вы решили проблему при сдачи по обособленным подразделениям?

    Reply
  40. trans63

    Присоединяюсь к вопросу про Обособленные подразделения…

    Подскажите пожалуйста, как быть?

    Спасибо!

    Reply
  41. tanyas7

    (40) trans63, В основной форме, где выставляется период отчета, в поле «Организация» не выбирается обособленное подразделение?

    Reply

Leave a Comment

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