Кадровые перемещения/изменения оклада сотрудников за период, ЗУП (1Сv8.1)




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

32 Comments

  1. WiseSnake

    А почему просто отчетом не сделали?

    Reply
  2. gutentag

    ИМХО неудобно/недоделано: Отсутствие вариантов формирования отчета «по всем организациям», «по всем начислениям», «по одному физическому лицу»

    Reply
  3. szhukov

    (2) По всем организациям поправлю, по всем начислениям — не уверен, что это будет удобно(подумаю вобщем). По отдельному/одному сотруднику можно сформировать — в поле сотрудник укажите по кому и все.

    Reply
  4. szhukov

    (1) Ну мне так проще было, можно и отчетом.

    Reply
  5. szhukov

    (2) Наверное не верно понял:

    Если именно по ФизЛицу, что бы увидеть все места работы работника, который несколько раз принимался на работу, то это конечно мысль… 🙂

    Reply
  6. WiseSnake

    (4) Действительно, так как вы сделали очень не удобно ИМХО.

    Мало информации…

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

    Reply
  7. szhukov

    (6) Ок, сделаю.

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

    Reply
  8. WiseSnake

    Ок. Подождем ))))

    Еще желательно сделать с использованием СКД оч.удобно будет настраивать

    Reply
  9. Spiteful

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

    Reply
  10. amb143

    +

    Reply
  11. szhukov

    (9)(10) Ок. Уже в процессе 🙂

    Reply
  12. akat65

    отчет по дням рождения сотрудников???

    Reply
  13. szhukov

    (12) 🙂

    Читаем внимательнее.

    Не в ту ветку коммент 🙂

    Reply
  14. akat65

    при печати отчета «окно табличного дока » — отчет по дням рождения сотрудников???

    Reply
  15. szhukov

    (14) Упс, сори.

    Форму скопировал, чтоб заново не набирать вот и подтянулось название… 🙁

    Пофиксил. На функционал это не влияло, но не приятно 🙂

    Отчет сейчас в переработке, обещает быть более функциональным 🙂

    Reply
  16. rasswet

    если вид расчета не выбран хотелось бы видеть по всем видам расчета, по которым в этот период были изменения с группировкой по сотрудникам.

    т.е. Смирнов -оклад, премия, надбавка:)

    Reply
  17. makcim

    Очень полезный отчет. Как обстоят дела с доработкой?

    Reply
  18. szhukov

    (17) В процессе…, текучка пока сильно отвлекает.

    Если есть пожелания, готов принять к сведению.(думаю в ближайшие дни дело двинется с места)

    P.S. Не забывайте плюсовать! 🙂

    Reply
  19. filis

    не запускается, пишет:

    {Форма.Форма(181)}: Метод объекта не обнаружен (ПолучитьЗначениеПоУмолчаниюСДополнительнымиПолями)

    ВыбОрганизация = УправлениеПользователями.ПолучитьЗначениеПоУмолчаниюСДополнительнымиПолями(ТекПользователь, «ОсновнаяОрганизация», );

    Reply
  20. szhukov

    (19) Поправил.

    Вставил код функции из типовой конфигурации в обработку.

    Reply
  21. rebuzx

    Напр.

    У сотрудника оклад 10 руб. в перемещении ввожу сотруднику с 1 по 15 число новый оклад 15 руб. По идее с 16 числа должен показаться старый оклад 10 руб, а отчёт лепит всё равно новый оклад 15 руб.

    Reply
  22. Shum23str

    Отличная обработка!

    Пригодилось!

    Вопрос к автору: а будет продолжение разработки по всем организациям?

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

    Reply
  23. Ulfhedhinn

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

    Reply
  24. Stepanstudent

    Спасибо, Пригодилось!=)

    Reply
  25. grey257

    Хорошая вещь, мне помогла. А в 8.2 работает?

    Reply
  26. szhukov

    (25) Если в сконвертированной базе (в режиме совместимости) — должна работать точно так же.

    Если у Вас все переписано на управляемых формах — то нет.

    Reply
  27. laf

    Работает, замечательно, спасибо. Искала такой. Люди, спасибо, что вы есть!

    Reply
  28. laf

    Еще бы зафиксировать смену % для доплаты по стажу, РК, Северной надбавки, …

    Reply
  29. Светлый ум

    СКД?

    Reply
  30. szhukov

    (29) Светлый ум, нет

    Reply
  31. Светлый ум

    Тогда вот, на СКД:

    http://infostart.ru/public/318450/

    Reply
  32. szhukov

    (31) Светлый ум, Не взлетит 🙂 , т.к. не то…

    Reply

Leave a Comment

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