Расчетные листки для ЗУП 2.5 из ЗУП 2.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='\

38 Comments

  1. gutentag

    Замечаний нет, т.к. особых премуществ перед «встроенной обработкой в типовую ЗУП 2.5» — не сильно замечено.

    А пожелания есть:

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

    — остальные пожелания см. http://infostart.ru/projects/82/ пост (15) — (16)

    Reply
  2. ignor

    Исправлена ошибка которая выражалась если человек был дважды совместителем, то строки начислений задваивало╤

    Reply
  3. ignor

    Исправлена ошибка должность и подразделение бралось из справочника сотрудники сейчас берется из регистра сведений работники организаций

    Reply
  4. RonKa

    Удобно, так как листок занимает гораздо меньше места на странице, чем в типовом варианте.

    Reply
  5. RonKa

    Так, с релизом ЗУП 2.5.13.5 отчет не работает, ошибка в НДФЛ

    Reply
  6. ignor

    У меня пока данный релиз не установлен, а как в чём выражена ошибка?

    Reply
  7. Darhan007

    обработка очень нужна но не как не скачать(

    Reply
  8. ignor

    Почему не скачать. Проверил всё качается. Укажите мыло пришлю

    Reply
  9. ignor

    Может вы плюс забыли добавить 🙂

    Reply
  10. RonKa

    Новый вариант работает. 🙂 Спасибо.

    Reply
  11. ignor

    Ну и славненько

    Reply
  12. RandomDV

    Отчет нормальный (лучше чем типовой версии 2.5.13.5), только есть глюк — не для всех сотрудников выводятся Таб.номер и должность!

    Код запроса очень большой, отлаживать тяжело…

    Автор, может уж глянешь?

    Reply
  13. ignor

    Я бы с удовольствием глянул, но тут как в случае с сообщением RonKa пока не посмотришь базу с проблемой не разберёшься. Она базу не присылала, но до тех пор пока я у себя не обновился я не мог понять что не работает. Если бы у меня в базе было «не для всех сотрудников выводятся Таб.номер и должность!» я бы разобрался наверное, но у меня такой проблемы нет. Если вы выложите куда-нибудь базу и пришлёте адрес выложенной базы мне на мыло lamer19@ya.ru и пример сотрудника которого смотреть, то я обещаю вам посмотреть.

    Reply
  14. Olga_bpz

    Запустила обработка под УПП 1.2.22.3

    Работает, НО если период задать 2 месяца в расчетном листке все строки начислений, удержаний, выплат удваиваются, за интервал 3 месяца — утраиваются и т.д.

    По одному месяцу всё ок

    Reply
  15. Olga_bpz

    (13) В УПП должности и табельные номера теряются, если работник уволился, месяц не работал и снова устраивается с середины месяца.

    А если работник устроился на работу впервые и не с 1 числа месяца, то по нему расчетный лист в первый месяц работы не формируется.

    (Проверяла на УПП 1.2.22.3, может в ЗУП все работает :))

    Reply
  16. RandomDV

    Тестирование проводил на типовой демо базе ЗУП 2.5.13.5

    Reply
  17. ignor

    (14) Да я уже в курсе как доберусь до машины с 1С с отладчиком исправлю

    Reply
  18. RandomDV

    Огромное спа, буду с нетерпением ждать обновления…

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

    Reply
  19. ignor

    (12,18) Табельные пока не смотрел, (14) Исправил обновил

    Reply
  20. ignor

    (18) Поправил табельные. Поясню немножко по проблеме с табельными и структуре запроса. Табельный берется из того же запроса который выбирает оклад. В коде оно выглядит так

    МасивОкладов=Новый Массив;

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

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

    //вот эти две строки надо было добавить

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

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

    ЗапросРЛ.УстановитьПараметр(«ВидРасчета»,МасивОкладов);

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

    Так же исправлена ситуация со следующим удвоением записей

    Если у человека был сначала один вид расчета в качестве основного начисления, а потом его не прекращая установили другой вид расчета в качестве основного начисления, например

    стоял оклад по дням, поставили оклад по часам, то записи удваивались. Это исправлено. В идеале конечно же запрос надо дорабатывать, то есть делать ешё более мощным. На сегодняшний день есть ошибка с удвоением записей в случае когда есть ошибка в кадровых документах, а именно не уволив одного сотрудника, приняли его же на работу. Когда руки доберутся исправлю.

    Reply
  21. vanchis

    В новой версии некорректно выводится период в разделе 4 «Выплачено» расчетного листка. И будет вообще здорово, если появится расшифровка строк по документу-основанию. А так, вроде все работает, спасибо.

    Reply
  22. ignor

    (21) А что вы вкладываете в «расшифровка строк по документу-основанию»?

    Reply
  23. vanchis

    подобно системе «Зарплата и Кадры 7.7», можно открыть документ, челкнув по тому или иному начислению в расчетном листке, который является основанием для этого начисления

    Reply
  24. RonKa

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

    Если нужно, опишу ошибку подробнее.

    Reply
  25. ignor

    (24) Опишите

    Reply
  26. Emmie

    Вопрос от чайника:

    Работаю в ЗУП 2.5. Не устраивает форма расчетного листка. А именно то, что там в разделе «Выплачено» проставляются данные документа «ЗарплатаКВыплате», да и то без даты. Хотелось бы, чтобы пропечатывались данные пп или рко или на худой конец дата документа. Ведь РЛ делается не для бухгалтера, а для сотра, которому пофиг док «ЗарплатаКВыплате», ему надо посмотреть, когда это он такую сумму получил. Можно ли это реализовать? Просмотрела много обработок. Нигде нет такого расчетного листка. Помогите, плз.

    Reply
  27. ignor

    (26) Помог

    Reply
  28. Emmie

    (27) Еще раз огромное спасибо 🙂

    Reply
  29. energiser

    А вычеты не проставляются в отчете?

    Reply
  30. gif

    {ВнешнийОтчет.РасчетныеЛисткиОрганизаций(12)}: Поле объекта не обнаружено (ОсновнаяДатаНачалаОтчетов)

    Запрос.УстановитьПараметр(«Настройка» , ПланыВидовХарактеристик.НастройкиПользователей[Настройка]);

    Reply
  31. mvd2

    спасибо огромное автору

    Reply
  32. leshachkudo

    Спасибо!

    Reply
  33. vovkakursk

    Спасибо!

    Reply
  34. kvp

    1.Сначала вышла ошибка:

    {ВнешнийОтчет.РасчетныеЛисткиОрганизаций(12)}: Поле объекта не обнаружено (ОсновнаяДатаНачалаОтчетов)

    Запрос.УстановитьПараметр(«Настройка» , ПланыВидовХарактеристик.НастройкиПользователей[Настройка])

    Это закомментировала, выходит следующая:

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

    ВременныйТабличныйДокумент.Область(НомерСтроки, 2, НомерСтроки, 2).Текст = УправлениеОтчетами.ОписаниеПериода(ВыборкаСтрокРасчетногоЛистка.ПериодДействияНачало, ДатаОкончанияПериода);

    2. Отбор по подразделению не работает

    Reply
  35. kvp

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

    Reply
  36. PatriziaRossi

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

    пишет что данный отчет не может быть прочитан текущей версией программы

    Reply
  37. ignor

    (36) Helga11111, Сконвертируйте открыв в конфигураторе. В вашем случае дело не в релизе конфигурации, а в релизе платформы

    Reply
  38. ignor

    Данное сообщение для тех кто до сих пор качает данную обработку:

    Дело в том что во-первых данная обработка писалась когда только-только вышла редакция 2.5. Потом не смотря на обновление редакции 2.5 обработка очень быстро перестала поддерживаться в актуальном состоянии (это же каждый релиз надо проверять, а нет ни времени ни мотивация). Предлагаю Вам бонус. Если Вы скачали данную обработку, то вероятнее всего Вам нужно большее количество расчетных листков на один лист. Во всяком случае такую задачу решал я делая обработку. Но как водится решение которое я использую сейчас оказалось гораздо проще. Глаза бояться, а руки пакостят 🙂

    При разборе полетов отчета построенного на СКД, именуемого в редакции ЗУП 2.5 как «расчетные листки организации» выявлено что в модуле отчета есть процедура «РазбитьТабличныйДокументПоСтраницам».

    Именно эта процедура отвечает за количество листков на одном листе.

    В этой процедуре есть конструкция языка

    ТабличныйДокументДляПроверки.АвтоМасштаб = Истина;

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

    В моем случае требуемым масштабом печати было 67 процентов.

    //ТабличныйДокументДляПроверки.АвтоМасштаб = Истина;

    ТабличныйДокументДляПроверки.АвтоМасштаб = Ложь;

    ТабличныйДокументДляПроверки.МасштабПечати = 67;

    Reply

Leave a Comment

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