57-Т Сведения о заработной плате работников по профессиям и должностям (в ред. 18.07.2013г № 285), (в ред. 26.06.2024 № 430)




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

41 Comments

  1. M@sha

    Где сама обработка?

    Reply
  2. margo_m09

    спасибо автору)

    Reply
  3. mylogin

    А какие изменения вообще по сравнению с формой 11 года? Как работает отчет, если используются свои добавленные виды расчета. Есть возможность их настройки?

    Reply
  4. Vick2009

    (3) mylogin, Добавить свои виды расчета — не проблема. Но в диалог данная возможность не вынесена. Добавлять виды расчета есть смысл, только если эти виды расчета регистрируют Оклад или Районный коэффициент. Либо эти виды расчета не должны попадать в отчет. Все остальные виды расчетов учитываются по умолчанию.

    Reply
  5. 1c_hafizova

    В отчет попадают сотрудники, у которых больничные до родов. Их не должно быть в среднесписочной численности. Т.е. должен быть отбор по Регистру сведений «состояние работников организаций»

    Reply
  6. Vick2009

    (5) 1c_hafizova, Этот вопрос давний… и однозначного ответа на него нет! Среднесписочная численность формируется на основе стандартного отчета 1С Среднесписочная численность из конфигурации «1С:ЗиКБУ ред. 1.0»

    Reply
  7. 1c_hafizova

    У нас УПП 8.2 (8.2.16.352), в нем стандартный отчет формируется с отбором по декретникам. И еще, на нашем предприятии есть пенсионеры, которые получают квартальные выплаты, Они сидят в своем подразделении с должностью пенсионер, они по вашему отчету тоже попадают в среднесписочную численность, поэтому нужен еще отбор по должности. Мы все это сделали сами. Спасибо за отчет.

    Reply
  8. kasa

    Подскажите, а на ЗиКБу 1.0 работает? И можно ли этот отчет использовать в другом 2015 году?

    Reply
  9. Vick2009

    (8) kasa, Да! В ЗиКБУ 1.0 работает! Собственно, для нее и писалось)))

    Reply
  10. for-elenak

    В случае работы со сменным графиком, неверный расчет. Видимо, расчет по дням. А если в месяце отработано дней меньше нормы, а по часам норма, такие работники в отчет не включены. Жалко потраченные мани

    Reply
  11. Vick2009

    (10) for-elenak, Если сотрудник не отработал полную норму — оформляются невыходы. Тогда будет верно считать.

    Reply
  12. r.pronin

    норм.

    Reply
  13. Roman_Go

    День добрый. А форму от 2017 года реализовывать не планируете?

    Reply
  14. Vick2009

    (14) Здравствуйте. Добавил.

    Reply
  15. masteroff

    Для ЗУП 2.5 подходит?

    Reply
  16. Vick2009

    Думаю, должна! Если не подойдет — пишите — посмотрю!

    Reply
  17. VitusBering

    На ЗУП 2.5 не пошла ((( форма по умолчанию 2013 года и не дает менять (( при попытке заполнить — выдает программную ошибку ((

    Reply
  18. eksdak

    Подскажите как считается стаж в обработке.

    Reply
  19. bonus12345

    Выходит ошибка не добавлен Оклад По Часам Н. как исправить?

    Reply
  20. user656831_davidkina0182

    Добрый день. Выходит ошибка:{ВнешнийОтчет.РегламентированныйОтчетСтатистика57Т.Форма.ФормаОтчета2013Кв4.Форма(1084)}: Поле объекта не обнаружено (ОкладПоЧасамН)

    СпВидовНачислений.Добавить(ПланыВидовРасчета.ОсновныеНачисленияОрганизаций.ОкладПоЧасамН);

    Что с этим делать?

    Reply
  21. user861090

    Спасибо за обработку )

    Reply
  22. Богатырев Артур

    Большое спасибо за отчет!

    Reply
  23. Vick2009

    (21)

    ОкладПоЧасамН

    У сотрудников в плановых начислениях каким видом расчета присвоен основной оклад? Если не предопределенным видом расчета, то он его просто не увидит. Судя по ошибки, именно так и есть!

    Reply
  24. Vick2009

    (20)

    Поправил. Теперь данная ошибка не выходит.

    Оставьте почту, пришлю исправленный вариант.

    Reply
  25. Vick2009

    (21)

    Поправил. Теперь данная ошибка не выходит.

    Оставьте почту, пришлю исправленный вариант.

    Reply
  26. Vick2009

    (19)

    Т.к. в отчете столбец называется «Стаж работы в данной организации

    на ХХХХХ (лет, с одним десятичным знаком)» то и считается, соответственно с даты приема сотрудника по НаДатуОтчета

    Reply
  27. Vick2009

    (18)

    Погонял на демо 2.5.124.2…

    Ошибок не увидел…

    Присылайте конкретную ошибку…

    Reply
  28. Vick2009

    (16)

    Протестировал на 2.5.124.2

    Ошибок нет

    Reply
  29. user656831_davidkina0182
  30. bonus12345

    Пришлите исправленный вариант на acer4920g@mail.ru

    Reply
  31. VitusBering

    (25) vit_temp@mail.ru Спасибо!

    Reply
  32. yandukov

    Обработка в зуп 3 работает?

    Reply
  33. eksdak

    Все работает, еще вопрос отправлять надо всех сотрудников или столько сколько влезает в отчет это максимум 64? у нас сотрудников около 180 как быть?

    Reply
  34. yandukov

    (34) у меня в зуп 8.3 не работает. пишет «не установлена схема постановки данных»

    Reply
  35. Vick2009

    (33)

    Нет, ЗУП 3 работать не будет!

    Reply
  36. Vick2009

    (34)

    В самом отчете есть табличка сколько сотрудников нужно показывать во 2 разделе. Это зависит от количества отработавших полный месяц.

    Reply
  37. yandukov

    (36) Может и для 8.3 напишите?

    Reply
  38. Vick2009

    (38)

    В Зарплате 3.1, насколько я знаю, этот отчет в типовой уже идет!

    Reply
  39. yandukov

    (39)

    есть только форма. он не заполняется автоматически. нужно вручную заполнять

    Reply
  40. eksdak

    Я не имел ввиду что работает в 8.3 (я имел ввиду, что обработка работает должным образом без ошибок). Естественно на 8.3. эта обработка не запустится, ее надо переделывать.

    Reply
  41. hick2003

    Пришлите исправленный вариант на hick2003@gmail.com

    Reply

Leave a Comment

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