Штатная расстановка подразделения по тарифам и окладам




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

25 Comments

  1. dock

    замечательный отчет, если бы не…

    недочеты:

    1) для параметров свойство «Использование» стоит установить значение «всегда», а не «авто» — что бы не смущать пользователя наличием галочки.

    2) подразделение в параметрах ? обычно это отбор 🙂

    А то получается, что бы просмотреть всю штатную расстановку, требуется сформировать отчет на каждое подразделение, включая и нижестоящие (вложенные).

    ошибки:

    1) при наличии временного кадрового перевода (с заполненной датой «по») отчет начинает выводить неверную информацию — выводится информация, как будто кадровый перевод еще действует.

    2) если установить дату отчета ДО приема сотрудника на работу, то позиция ШР всё-равно считается занятой — а ведь еще не принят на работу, и в отчет не должен попадать…

    текущий способ получения кадровых данных (и оклада) слишком упрощен 🙂

    непонятно:

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

    З.Ы. за такой отчет многовато маней 🙂

    Reply
  2. AlPi

    Спасибо за подробный анонс, даже неожиданно. Наш ответ коллеге:

    замечательный отчет, если бы не…

    недочеты:

    1) для параметров свойство «Использование» стоит установить значение «всегда», а не «авто» — что бы не смущать пользователя наличием галочки. — исправлено

    2) подразделение в параметрах ? обычно это отбор 🙂 — отчет называется «Штатная расстановка подразделения по тарифам и окладам», т.е. отчет изначально разработан для анализа штатной расстановки в рамках одного подразделения. Предназначение данного отчета — контроль за корректностью штатной расстановки, а данный контроль логично и практично выполнять в рамках одного подразделения, а не в сводном списке

    А то получается, что бы просмотреть всю штатную расстановку, требуется сформировать отчет на каждое подразделение, включая и нижестоящие (вложенные).

    ошибки:

    1) при наличии временного кадрового перевода (с заполненной датой «по») отчет начинает выводить неверную информацию — выводится информация, как будто кадровый перевод еще действует. — исправлено

    2) если установить дату отчета ДО приема сотрудника на работу, то позиция ШР всё-равно считается занятой — а ведь еще не принят на работу, и в отчет не должен попадать… — проверил, замечание не соответствует действительности: при формировании отчета на дату ДО ПРИЕМА СОТРУДНИКА на работу позиция штатного расписания выводится как вакантная

    текущий способ получения кадровых данных (и оклада) слишком упрощен 🙂 — ???

    непонятно:

    замещаемый сотрудник… вообще никаких проверок ? просто если доп. реквизит заполнен, то значение выводится в отчет??? — А какие там могут быть проверки? Реквизит заполнен — выводится в отчет, не заполнен — не выводится. Данный реквизит выполняет вспомогательную функцию — видеть какого конкретно сотрудника замещает данный сотрудник на время его отсутствия (декретный отпуск и т.п.)

    Reply
  3. AlPi

    Исправленный отчет загружен.

    Reply
  4. AlPi

    Нашли и исправили ошибку, которая проявляется только, если у сотрудника был кадровый перевод с оклада на тариф (или обратно). Заменили файл.

    Reply
  5. AlPi

    Обновили на 3 версию. Еще нашли ошибку.

    Reply
  6. AlPi

    Новая версия, основные изменения:

    — как видно из нового названия отчета («Штатная расстановка организации по тарифам и окладам»), теперь он работает по всей организации с группировкой по подразделениям

    — добавлена возможность отбора по подразделению

    — добавлен контроль по виду оплаты (оклад / тарифная ставка)

    — добавлен отбор по виду оплаты позиции штатного расписания

    — исправлены некоторые ошибки

    Reply
  7. Hla

    (6) Добрый день! Временный кадровый перевод учитывается в отчете? У наших кадровиков в хотелках, чтобы временные кадровые переводы не учитывались.

    Reply
  8. AlPi

    Желание клиента для нас закон 🙂

    Новая версия внешнего отчета «Штатная расстановка организации по тарифам и окладам» (5 от 30/01/2019 г.) для ЗУП 3.1.

    Изменения:

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

    реализован отбор по видам оплаты позиции (оклад/тариф)

    реализована возможность учитывать/не учитывать временные кадровые переводы и состояния сотрудников

    исправлены найденные ошибки

    Reply
  9. Hla

    (8) Добрый день! Задвоились сотрудники со сдельной оплатой труда. В документе Начальная штатная расстановка 1 запись по сотруднику. Сдельная оплата назначена двумя видами начисления.

    Цитурую с бухэксперта «Мы рекомендуем сражу же переделать типовой вид расчета. И сделать два вида расчета.

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

    Второй вид расчета фиксирует отработанное время, сумма по нему всегда будет равна 0.

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

    Вместо сдельный заработок выберите “повременная оплаты труда и надбавки”. Выполняется ежемесячно.

    В формуле оставьте только показатель “Сдельный заработок”. На закладке учет времени поставьте доплата за уже оплаченное время. С закладки приоритет удалите все начисления если они там были указаны. Наименования я указываю обычно просто “Сдельный заработок”. Код – СДЛ.

    Копируем снова исходный вид расчета. Называем его Сдельный заработок – учет отработанного времени.

    Код СДЛВР.

    Назначение начисления – оставляем сдельная оплата труда. В формуле прописываем ТарифнаяСтавкаЧасовая * ВремяВЧасах*0, в постоянных показателях выбрать галочкой ТарифнаяСтавкаЧасовая. Для того, чтобы при назначении в плановом порядке этого начисления, мы могли указать тарифную ставку, которая будет учитываться при расчете планового ФОТ и совокупной тарифной ставки для последующего расчета стоимости единицы времени для оплаты ночных, сверхурочных и другого времени.

    Учет времени оставляем как есть. На закладке приоритет должны быть заполнены все начисления, на период действия которых отработанное время по-нашему начислению должно вытесняться. Например, отпуск и больничный.

    Далее в плановом порядке назначаем сотруднику два этих начисления.»

    Reply
  10. AlPi

    Поправили, проверьте.

    Reply
  11. Hla

    (10)Вариант с поправочками можно на tildaТОЧКАpodsСОБАКАyandexТОЧКАru

    Reply
  12. AlPi

    Выложил, нельзя повторно скачать? Если нет, напишите адрес понятней.

    Reply
  13. Hla

    (12) Стармани закончились 🙂 tilda.pods@yandex.ru

    Reply
  14. AlPi

    Отправил.

    Reply
  15. AlPi

    Добавил новую версию.

    Версия от 12/02/2019

    Изменения:

    — добавлена возможность отбора по видам взносов за занятых на работах с досрочной пенсией

    — добавлена возможность отбора по классу условий труда

    Reply
  16. Hla

    (14) недочет.

    Было изменение штатного расписания ТАРИФ поменяли на ОКЛАД. Затем документом «Изменение оплаты труда» сотруднику отменили ТАРИф и назначили ОКЛАД.

    По данной позиции штатного расписания две строки. По сотруднику занимающему эту позицию 4 строки.

    Reply
  17. Hla

    (15) пожелание — добавить итоги к «Всего ставок» по подразделениям и общий итог. А то Занято — итоги есть, а для запланировано(у вас Всего ставок) — нет.

    Reply
  18. LynxX

    Еще учесть бы сотрудников в отпуске по уходу за ребенком они ставку временно освободили, а в отчете занимают ее.

    Reply
  19. AlPi

    Доброго времени суток. Видел Ваше сообщение. Поговорю с программистами о возможности учесть Ваши пожелания.

    Reply
  20. diocon

    Добрый день!

    Отчет не выводит в пользовательском варианте поле ОкладТарифПозиции!

    1С:Предприятие 8.3 (8.3.13.1690)

    Зарплата и управление персоналом КОРП, редакция 3.1 (3.1.8.246)

    Reply
  21. AlPi

    Новая версия отчета.

    Изменения:

    Добавлен вывод описания выявленных ошибок позиций штатного расписания и сотрудников.

    Добавлено отключение выделения цветом состояний и ошибок.

    Добавлен вывод комментариев позиций штатного расписания и сотрудников. Для работы необходимо добавить дополнительные реквизиты:

    — дополнительный реквизит «Комментарий» справочника «Штатное расписание» (тип — «строка»)

    — дополнительный реквизит «Комментарий» справочника «Сотрудники» (тип — «строка»)

    Добавлен вывод замещающего сотрудника для сотрудника, который замещается другим сотрудником и находится в декретном отпуске и т.п. Для работы необходимо добавить дополнительный реквизит «Замещаемый сотрудник» справочника «Сотрудники» (тип — «ссылка на элемент справочника «Сотрудники»), если он не был добавлен ранее. При использовании данного функционала и вводе замещаемого сотрудника в отчете не будет заниматься лишняя ставка.

    Исправлены найденные ошибки

    P.S. Что касается письма с ошибкой о том, что на релизе ЗУП 3.1.8 не выводится оклад/тариф позиции, ничего конкретного сказать не могу. У меня релиз 3.1.10. Все работает нормально. На релизе 3.1.9 все тоже работало корректно. На 3.1.8 проверить не могу. Видимо есть смысл в описании отчета добавить слова о том, что отчет протестирован на версии 3.1.9 и выше, а на версии 3.1.8 и ниже работоспособность не гарантируется.

    Reply
  22. AlPi

    Новая версия отчета «Штатная расстановка организации по тарифам и окладам».

    Доработки:

    — добавлен анализ и вывод в отчет основных ошибок учета позиций штатного расписания и сотрудников

    — добавлен отбор позиций штатного расписания по наличию вакансий

    — исправлены найденные ошибки и недочеты

    Reply
  23. diocon

    Здравствуйте, вышлите пожалуйста обновленную версию отчета, почту указал в личке)

    Reply
  24. AlPi

    (23) Отправил Вам на почту.

    Reply
  25. parusi

    Здравствуйте, при добавлении отчета выдает сообщение:

    Свойство отчета «Хранилище вариантов» не заполнено.

    Сохранение (выбор) вариантов отчета будет работать в ограниченном режиме.

    Обратитесь к разработчику дополнительного (внешнего) отчета.

    Не могу настроить печать отчета из раздела Кадры-Кадровые отчеты-Штатное расписание. (нет вкладки Варианты отчета-Разместить в разделах)

    Получается печатать только из раздела Дополнительные отчеты и обработки.

    Версия ЗУП 3.1.10.78

    почта: parusi@rambler.ru

    Reply

Leave a Comment

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