ЗУП: Расчетные листы с Окладом (для 8.1 и 8.2)




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2025-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='\

36 Comments

  1. girlochka

    СУПЕР!

    Reply
  2. BRT

    плюс авансом за идею.

    Reply
  3. Ulfhedhinn

    (2) Идея не моя и она не нова. В ЗиК оклад например всегда был в расчетках, в первых редакциях ЗУПа он вроде тоже присутствовал, да и на инфостарте подобные разработки уже были, только авторы их не поддерживают и к сожалению ни одна из них в последних редакциях ЗУПа не работает…

    Reply
  4. girlochka

    в зике оклад был отдельным реквизитом. просто было вытащить.

    надеемся, что эта разработка будет жить 🙂

    Reply
  5. mjane

    на УПП не заработало(

    Reply
  6. echo77

    При таком построении набора данных, вы всегда будет иметь во всех расчетных листках оклад на &КонецПериода, т.е. при формировании расчетных листков за несколько месяцев, окажется что во всех листках у сотрудника одинаковый(последний оклад)

    Reply
  7. Ulfhedhinn

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

    Reply
  8. tebedimon

    Спасиб! …а может подскажите что-нить по реализации задачи: в одной канторе выплаты з/п и авансов осуществляются через «одно место» — аванс за предыдущий месяц дают до 10 числа текущего месяца, а зарплату (за пред месяц) — в 20 числах. Как реализовать, что бы аванс (к примеру, выплаченный в апреле за март) попадал в расчетный листок марта?

    Reply
  9. Ulfhedhinn

    (8) вот так сразу не подскажу, нужно внимательно смотреть и думать, на что времени у меня сейчас нет…

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

    Reply
  10. Ambakollajder

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

    Reply
  11. Lis2007

    Спасибо!

    Именно то что надо!

    Reply
  12. AlexMAM

    Спасибо. Пригодится. А можно ли добавить проценты по начислениям?

    Reply
  13. cerg110

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

    Reply
  14. РазДва

    Спасибо. Пригодилась. В самый нужный момент

    Reply
  15. найма

    Отличная обработка. Плюсую с удовольствием

    Reply
  16. nemetall

    (8) tebedimon, У меня была такая ситуация, что клиенты (не в 1С) делали выплату на конец месяца ЯКОБЫ ВСЮ ЦЕЛИКОМ. И это писали и печатали в Расчетниках людям. А потом зарплата по кусочкам поступала на их счета. и они жаловались при этом на то, что не видят реально задолженности перед человеком. Парадоксальная ситуация… При этом разносить выплату как нужно отказывались.

    Вот думают, переходить или нет на 1С 😀

    Мне кажется, некоторые товарищи (пользователи) по-настоящему безумны. И не стоит идти на их провокации.

    Reply
  17. guzelia

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

    Меня еще просили вытащить процент производственной премии в расчетку. Не думала что так сложно будет! Замучилась копаться в СКД и в запросе процедуры общего модуля НастроитьПостроительЗапросов(ПостроительОтчетов, ВидРасчетногоЛистка). Пока безрезультатно. Может кто сталкивался, как это можно сделать?

    Reply
  18. Bolik13

    Спасибо. Пригодилось.

    Reply
  19. РазДва

    Еще раз спасибо большое

    Reply
  20. ГердаКай

    Спасибо огромное за отчет. Очень нужны были оклады и тарифные ставки в расчетных листах. Доработали по себя, но идея очень хорошая.

    Reply
  21. znatok123

    Cпасибо! Перерыла весь Интернет, но не нашла ничего больше! Здорово, что есть такая обработка!!!

    Reply
  22. Atal

    Было бы здорово если бы добавлено еще КТУ . А так чесный плюс, на УПП 1.3 работает.

    Reply
  23. nu_fguz_buh

    В ЗиКБУ (8.2.15.294) , редакция 1.0 (1.0.37.1) выдает ошибку:

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

    ПостроительОтчетов.Текст = ТекстПостроителя;

    по причине:

    {(396, 54)}: Неверные параметры «Перечисление.ХарактерВыплатыЗарплаты.Дивиденды»

    КОГДА Взаиморасчеты.ХарактерВыплаты = ЗНАЧЕНИЕ(<<?>>Перечисление.ХарактерВыплатыЗарплаты.Дивиденды)

    Reply
  24. Ulfhedhinn

    (24) в ЗКБУ отчет действительно не работает, структура ЗУПа и ЗКБу в некоторых местах всетаки различается, чуть позже выложу отдельную версию для нее. Если есть навыки конфигурирования, то можно легко добавить в бюджетную расчетку оклад. Из моего отчета нужно взять в СКД запрос «Оклады», добавить его в СКД бюджетной расчетки, добавить связь по сотруднику и организации, в вычисляемых полях добавить МАКСИМУМ(Оклад), и в макете прописать новое поле.

    Reply
  25. ad-lib

    Сумму оклада тянет из регистра сведений?

    Reply
  26. Ulfhedhinn

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

    Reply
  27. znatok123

    Работает с окладом, но не работает с часовой тарифной ставкой:( Подскажите, пож-та, как доработать???

    Reply
  28. Ulfhedhinn

    (28) Тарифная ставка у вас задана через тарифные разряды? Тогда нужно в моем запросе по окладам добавить вложенный запрос по регистру сведений «Размеры тарифных разрядов». На следующей неделе посмотрю и может быть сделаю, если не забуду.

    Reply
  29. znatok123

    Да, часовая ставка привязана к тарифному разряду. Если у вас будет минутка — буду благодарна!

    Reply
  30. helenkash

    Спасибо за отчет! Но у меня неправильно формируются вычеты на детей. Не суммируются, если их несколько. Нельзя ли исправить?

    Reply
  31. znatok123

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

    Reply
  32. unsimple

    Спасибо за отчет!

    Reply
  33. StalkerAkella

    автору респект

    Reply
  34. KaiNNight

    Спасибо за проделанную работу. У самого не вышло сделать…

    Reply
  35. alo2012

    Здравствуйте, отчет скачан. ЗУП типовая.(2.5.63.1). При формировании с «Подробно» ошибка-Метод объекта не обнаружен(ПолучитьСведенияОВидеРасчетаСхемыМотивацмм).

    {ВнешнийОтчет.РасчетныеЛисткиОрганизаций.МодульОбъекта(928)}: Метод объекта не обнаружен (ПолучитьСведенияОВидеРасчетаСхемыМотивации) СведенияОВидеРасчета = РаботаСДиалогамиПереопределяемый.ПолучитьСведенияОВидеРасчетаСхемыМотивации(СведенияОВидахРасчета, ВидРасчета, «ПриРасчете»);

    Не подскажете как можно исправить?

    Reply
  36. tazmag

    Так намного удобнее стало!

    Reply

Leave a Comment

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