Расчетные листки (с расшифровкой по регистратору)




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

24 Comments

  1. valygar

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

    Reply
  2. RailMen

    Если я правильно понял, то смысл написаного сводится к тому, что щелкаем мышью по детальной записи «СУММА» и открывается регистратор.

    Мои руки в таких случаях брали и создавали доп. колонку в форме отчета

    «РЕГИСТРАТОР», что бы мона было все это распечатать бухам. Может все дело в моих шулудивых руках???…

    P.S. Типовой «РЛРО» — кака! Ты молодец. Но мона было сделать и поинтересней! Ждем обновлений!

    Reply
  3. valygar

    Добавлена возможность рассылки сформированных РЛ. Для этого на форме добавлена кнопка «Отправить». Данные для почтового клиента берутся из справочника Учетные записи электронной почты (перед рассылкой необходимо выбрать нужную учетную запись).

    Каждый расчетный листок сохраняется в формате XLS95 и отсылается по адресу указанному у сотрудника в справочнике Физические лица.

    Адрес ищется по 2 видам контактной информации: предопределенному «Служебный адрес электронной почты физического лица» и по созданному (у нас в организации, может кто тоже использует) «Адрес электронной почты для рассылки».

    После рассылки чистит темповую директорию от сохраненных файлов.

    Reply
  4. lenaonly

    А как открывается? Неизвестный формат файла…

    Reply
  5. valygar

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

    Тот тоже можно открыть, если приписать к файлу расширение .erf

    Reply
  6. xw7x

    http://infostart.ru/projects/4508/ вот мой вариант и кажется на много лучше. смотрите судите.

    Reply
  7. NtS

    не запускается, пишет что данный файл не является внешним отчетом, ЗУП 2.5.17.8

    Reply
  8. cim

    А можно переделать отчет под релиз 2.5.18.2?

    Расчетчики очень уж привыкли к этому отчету. 🙁

    Reply
  9. artbear

    (3) 1. Цитата «Подробности в 3-м комментарии» — закинь содержимое коммента в запись в блоге и пользователям не придется искать 3-й коммент.

    будет легко видеть, когда и что ты менял.

    .

    2. Из описания совершенно не понятно, для какой конфы.

    все-таки ЗУП? в БП также есть отчет с таким названием 🙂

    В КА и УПП кто-нибудь проверял?

    Reply
  10. artbear

    (6) Очень некорректное сравнение, здесь четкая доработка в плане добавления очень удобной фичи, которая до сих пор отсутствует в типовом отчете.

    У тебя этого нет.

    Reply
  11. valygar

    Поправил работу обработки для версии ЗУП 2.5.20.3

    Reply
  12. tslk

    Если в настройках указать период например год и сотрудника (уволен например 31.09.2009) и имеющего сальдо на конец октября, то расчетки выведутся только до октября, а выплаты произошедшие в ноябре декабре в расчетках не будет.

    Reply
  13. valygar

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

    Reply
  14. Anna_Vl

    Спасибо, скачала отчет. Но при его запуске появляется ошибка:

    {Форма.ФормаОсновная(111)}: Метод объекта не обнаружен (ЗаполненРегламентированныйПроизводственныйКалендарь).

    В чем может быть причина?

    Reply
  15. valygar

    а вы в какой конфигурации запускаете?

    Reply
  16. Anna_Vl

    1.5.28.1

    Reply
  17. nadi3009

    Пишет метод объекта не обнаружен(заполнен регламентированный производственный календарь) 😮 что это???

    Reply
  18. maxtomsk

    для конфигурации Зарплата и Управление Персоналом, редакция 2.5 (2.5.35.3) версии 8.2

    не работает, выдает кучу ошибок по тексту модуля (перенесены процедуры в другие модули)

    Reply
  19. Валентина

    Отличный отчет спасибо огромное автору

    чтобы работала в 8.2 чуть чуть подправила

    1 ошибка

    {Форма.ФормаОсновная.Форма(111)}: Метод объекта не обнаружен (ЗаполненРегламентированныйПроизводственныйКалендарь)

    Если ФормированиеПечатныхФорм.ЗаполненРегламентированныйПроизводственныйКалендарь(НачалоПериода, КонецПериода) тогда

    Исправление

    ФормированиеПечатныхФорм.заменить на ФормированиеПечатныхФормЗК.

    2 ошибка

    {ОбщийМодуль.ТиповыеОтчеты.Модуль(751)}: Метод объекта не обнаружен (ПолучитьПараметрыИсполненияОтчета)

    ПараметрыИсполненияОтчета = ОтчетОбъект.ПолучитьПараметрыИсполненияОтчета();

    Исправление в Модуле объекта создать функцию

    Функция ПолучитьПараметрыИсполненияОтчета() Экспорт

    СтруктураНатроек = Новый Структура(«МинимальныйПериодОтчета», «Месяц»);

    Возврат СтруктураНатроек;

    КонецФункции

    3 ошибка

    {ВнешнийОтчет.РасчетныеЛисткиОрганизаций.МодульОбъекта(1115)}: Метод объекта не обнаружен (ОписаниеПериода)

    СтрокаНачисленияУдержания.НачисленияУдержанияПериодНачисления = УправлениеОтчетами.ОписаниеПериода(Начисления.Строки[Сч].ПериодДействияНачало, Начисления.Строки[Сч].ПериодДействияКонец);

    Ипсравление

    во всём модуле заменить

    УправлениеОтчетами. на УправлениеОтчетамиЗК.

    Reply
  20. Валентина

    При выборе работника тоже ошибка исправляется

    заменой ПроцедурыУправленияПерсоналом. на ПроцедурыУправленияПерсоналомПереопределяемый.

    Reply
  21. SergTH0000

    класс спасибо

    Reply
  22. SergTH0000

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

    Reply
  23. mariyanna

    Огромное спасибо!!

    Reply
  24. Nastyok_Kur

    ну что я могу сказать: на упп 1.3.22 не работает — кроме начального сальдо и конечного сальдо никакие данные не выводятся в отчет. Видимо структура метаданных не та… МОжет подскажете, что подшаманить можно, чтоб заработало на упп 1.3.22 или может кто подскажет, где можно взять аналог, работающий для упп 1.3.22?…. Заранее огромное спасибо!!!

    Reply

Leave a Comment

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