Статистика T-57 (форма 2009 г.)




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

30 Comments

  1. Boroda

    Спасибо! Молодец! Только вот небольшое замечаньице: стаж в разделе II теперь считается не общий или страховой, а стаж работы на предприятии.

    Reply
  2. poligon

    Спасибо!

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

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

    Reply
  3. Elena_Mosh

    (1) точно? проверила еще раз — стаж страховой печатается, т.е. тот, котрый указан у сотрудника в поле «Страховой стаж»

    Reply
  4. Elena_Mosh

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

    Reply
  5. Elena_Mosh

    (1) извините, я думала, что печатает не страховой, а нужно страховой — точно, нужно на предприятии, не доглядела, сейчас исправлю:)

    Reply
  6. Phel

    У нас есть ещё категории НаучныеИПедагогические — пришлось добавить к вашим, и военнослужащие, поэтому когда вы проверяете ПриказОПриеме.ВидРаботы выдает ош, лучше использовать Сотрудник.ОсновнойЭлемент для выявления внутр. совместителей

    Reply
  7. Elena_Mosh

    (6) не знаю, у нас есть внутренние совместители — никаких ошибок не выдало. Может, напишите код ошибки?

    Reply
  8. Phel

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

    Если Сотрудник.ОсновнойЭлемент<>Сотрудник

    Продолжить;

    КонецЕсли;

    если у вас нет военных, то вам это и не мешает и все будет нормально

    Reply
  9. Elena_Mosh

    (8) точно:( я про это знала, но военных нет и из памяти выветрилось:( я так понимаю, вы уже переделали, а через 4 дня отчет уже будет неактуален — закончится срок сдачи:( если еще кто-то попросит, переделаю, спасибо за подсказку:)

    Reply
  10. poligon

    (4) Категории сотрудников остались с прошлых лет:

    Научные и научно-педагогические работники

    Прочие служащие

    Рабочие

    Руководители

    Специалисты

    РабочиеОсновные

    РабочиеВспомогательные

    РуководителиАдмин

    СпециалистыАдминистр

    Из них используются: Прочие служащие, Руководители, Специалисты, РабочиеОсновные, РабочиеВспомогательные

    Reply
  11. poligon

    (4) Получается, что только «рабочие» у нас нестандартные

    Reply
  12. hwwnw

    я извиняюсь может я чего то непонемаю…

    поставил отчет ваш экономисты принесли мне данный и говорят что у них Работников гораздо больше отработавших полный месяц 324 а отчет показывает 190 почему то… может условия непрвавельное которое осущетвляет проверку по дням ? если и такие кто отработал в месяц 23 дня из 22 дней что можно с этим сделать ?

    Reply
  13. Elena_Mosh

    (11) посмотрите расшифровку — там есть список отработавших полностью, пусть кадровики хотя бы одного человека не попавшего в список, дадут, посмотрите, почему не попал, кто в месяц 23 из 22 — должны попадать — в отчете условие что если рабочих дней больше, чем отработанных, тогда не включать. В отработанные дни попадают оплата по табелю (окладу, дням, часам) + командировки

    Reply
  14. hwwnw

    просто есть такие кто отработал больше чем 22 дня тоесть 23 дня переработки и они туда не попадают ((( почему то…

    или так и должно быть ?

    Reply
  15. Elena_Mosh

    (14) должны вообще-то, условие в отчете не на равно:

    Если ТЗОтработавших.РабочихДней > ТЗОтработавших.ОтработаноРабочихДней Тогда

    ТЗОтработавших.УдалитьСтроку();

    КонецЕсли;

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

    Reply
  16. hwwnw

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

    Reply
  17. Phel

    в «справочно», там где полностью отработавшие попадают внешние совместители. Нужно в «среднесписочной», когда формируете СписокСотров сразу убрать НеОсновных

    Reply
  18. Phel

    (16) «дне больше работниками не которым» трудно вообще понять о чем речь

    Reply
  19. Elena_Mosh

    (17) да, если шел выбор не по всем, а по подразделению — было такое:( исправила, отчет перезалила

    Reply
  20. Boroda

    (3) Я и говорю, что страховой. А надо — стаж работы на предприятии (посмотрите саму таблицу II в приказе). Это не одно и то же. У сотрудник стаж страховой может быть 20 лет, а на данном предприятии всего 2 года.

    Я, например, скорректировал ваш модуль, добавив функцию:

    ///=========================================================­================================

    Функция ОпределитьСтаж(Человек)

    НаДату = КонМесяца(ДатаКон);

    СтажПредпр = глСтажРаботыНаПредприятии(Человек,НаДату);

    // маловероятно, конечно, но всё ж…

    Если ПустоеЗначение(СтажПредпр) = 0 Тогда

    Стаж = глРазложить(СтажПредпр,» «);

    Годиков = Стаж.ПолучитьЗначение(1);

    Месяцев = Число(Стаж.ПолучитьЗначение(3));

    МесВДесятке = Окр((Месяцев*10)/12,0);

    Стажж = «»+Годиков+».»+МесВДесятке+»»;

    Иначе

    Сообщить(«А «+Человек+» работает на предприятии??»);

    Стажж = «Н»

    КонецЕсли;

    Возврат Стажж;

    КонецФункции // ОпределитьСтаж

    Reply
  21. Boroda

    (2) Господи, какие проблемы-то?! У меня тоже вспомогательныеи основные. Замените в модуле «Рабочие» на «Рабочие основные» и «Рабочие вспомогательные», если понимаете, конечно, где и что надо менять. Ну, и перечисления соответствующие вставьте…. И всё будет работать нормально.

    Reply
  22. Elena_Mosh

    (20) я уже тоже исправила:)

    Reply
  23. Lapitskiy

    У меня в сумму надбавок попадает оклад, и сумма всего получается больше, на сумму оклада….

    Reply
  24. Elena_Mosh

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

    Reply
  25. Lapitskiy

    Да есть.

    И получается, что оклад/тариф попадает и в 9 колонку, и в 11. соответственно, в колонке 8 сумма больше на величину оклада. И это я проверил на 2 разных базах.

    Reply
  26. Elena_Mosh

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

    Reply
  27. Lapitskiy

    Ну я-то исправил у себя: там, где идет выборка Надбавок, я вставил проверку на основной вид заработка, командировку и т.п., как строчками выше. И все.

    Reply
  28. valde

    А нет новой формы от 20 июля 2011 года?

    Reply
  29. Elena_Mosh

    к сожалению, все — перешла на 8:( так цифры можно взять отсюда и забить в новую форму — это же не каждый месяц делать

    Reply
  30. bnk72

    Спасибо, пригодилась. Не знала с какой стороны подойти, да еще «надо было еще вчера», а тут все готово. Немного 6 графу сгруппировали по-новому, а в остальном — отличие 2013 от 2009 в паре слов…

    Reply

Leave a Comment

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