Решение проблемы некорректного заполнения регистра "Параметры периода стажа ПФР" в ЗУП для правильного формирования СЗВ-СТАЖ




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

23 Comments

  1. Aftee

    Здравствуйте. Что именно выполняет Ваша обработка (алгоритм)? Перепроводит документы? Ведь, как Вы написали, проблема решается отменойпроведением (хотя можно просто провести, а не отменить проведение — провести) крайнего кадрового документа (в некоторых случаях + отпуск по уходу за ребенком).

    Есть проблема с правильным заполнением сотрудников, которые были в отпусках по уходу за ребенком, которая не всегда решается просто перепроведением. Точно не помню, но что-то связано с параметрами типа «ДЕТИ» или подобное, и уже тут требовалось корректировать записи в регистрах. Это как-то исправляется обработкой?

    Reply
  2. корум

    (1) код не смотрел, но кнопка на форме «делает всем хорошо».

    После перевода с 3.1.2.ххх на 3.1.4.169 и запуска обработки на тестовой базе кадровики остались довольны. Дети, ДЛДЕТИ и «летучие голландцы» отображаются как надо.

    Reply
  3. Fantasisto

    3 стармани?! Побойтесь бога!

    Reply
  4. LeontyevaEK

    Проблему с правильным заполнением сотрудников, которые находились в отпуске по уходу за ребенком на дату перехода на 3.1, не решает. Они у нас по-прежнему «работают», а не находятся по уходу за ребенком. Зря потраченные стартмани…

    Reply
  5. Program

    (4)

    нужно делать корректировку регистров. Это если штаное расписание используется и ведется история.

    документ «Перенос данных» регистр сведений «Параметры стажа ПФР», дату начала ставить начало года 2017

    Reply
  6. корум

    (0) новую версию нужно выкладывать поверх старой. В этом случае скачавшие старую версию при обновлении могут получить обновлённую, не потратив SM

    А так получается, каждое обновление за отдельные мани. Совсем уже нагло.

    Reply
  7. intellavn

    (6) честно говоря, не знал. В следующий раз так и сделаю. Приношу свои извинения….

    Reply
  8. Наталья_О

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

    Reply
  9. корум

    (8) а какая проблема сохраняется?

    В СЗВ-СТАЖ записи правильные, обработка свою роль сыграла…

    Reply
  10. Наталья_О

    (9)Нет. Не правильные. В СЗВ-стаж данные заполняются из регистра Периоды стажа, а не из Параметров. Сотрудники в 2017 году уволились, через несколько дней (а некоторые даже в тот же день!) принялись заново. Так вот, в Параметрах стажа записи есть, а в Периодах есть только до первого увольнения.

    Reply
  11. user915148

    Добрый день, подскажите эта обработка работает, если не ведется документ «Штатное расписание»

    Reply
  12. intellavn

    Да, работает….

    Reply
  13. user915148

    какая более новая обработка? скачала версию 1.1, попробовала, исправилось 199 документов. НО, многое не исправилось. Например: людей который увольняли и принимали заново, они не вошли в отчет, но в регистре Параметры стажа строка появилась, а в регистре Параметры стажа нет… А отчет кажется из другого регистра берет. и еще отпуска по уходу за ребенком не проставляет ДЕТИ, это как исправить, заходить в регистр и руками править чтобы отчет формировался?

    Reply
  14. user915148

    скажите какая более новая обработка?

    Reply
  15. intellavn

    (14) более новая — 1.1

    Reply
  16. intellavn

    (13) понимаем следующее:

    обработка возникла в следствии решения частных проблем конкретного клиента. Нашей фантазии все равно не хватит охватить все возможные косяки специалистов фирмы 1С.

    Reply
  17. user921365

    Будет ли работать данная обработка, если обновлена программа до Зарплата и управление персоналом, редакция 3.1 (3.1.5.126)?

    Reply
  18. user705334_PapuasEx3

    на 171 релизе отлично сработало, СПАСИБО! все что не сработало — это уже косяки нашего учета)))) взяли на копии обновились грубо с 169, не вдаваясь в тонкости, и все хорошо!

    Reply
  19. Solne4naya

    (8) Попробуйте в модуле ЗарплатаКадры вставить следующий код (процедура ОбновитьРегистрРассчитанныхПериодовСостояний, новый код выделен жирным и курсивом):

    Если ОписаниеРегистраВторичныхДанных.ИмяРегистра = «ПериодыСтажаПФР» Тогда
    РассчитанныеДанныеВторичногоРегистра.Сортировать(«ДатаНачала, ДатаОкончания»);
    КонецЕсли;
    
    Если РассчитанныеДанныеВторичногоРегистра.Количество() > 0 Тогда
    ЗаписатьНаборыВторичногоРегистраСостояний(ОписаниеРегистраВторичныхДанных, РассчитанныеДанныеВторичногоРегистра, КлючиОбновленныхНаборов, РежимЗагрузки);
    КонецЕсли;
    
    // По тем значениям измерений, по которым не было записей в регистре первичных данных
    // запишем пустые наборы.
    
    ЗаписатьПустыеНаборыВторичногоРегистраСостояний(ОписаниеРегистраВторичныхДанных, КлючиОбновляемыхДанных, КлючиОбновленныхНаборов, РежимЗагрузки);
    

    Показать

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

    Reply
  20. Наталья_О

    (19) Спасибо, но у клиента конфигурация на поддержке. Пришлось написать «топорную» обработку, которая просто шла по записям первого регистра и создавала записи во втором. И, кстати, у нас не удалялись старые записи, а наоборот, не создавались новые. То есть, в регистре «ПериодыСтажаПФР» были только записи самого раннего места работы.

    Reply
  21. Lariska2000

    Добрый день! А для зкгу 8.3.1.8.216 будет работать?

    Reply
  22. evn-zorin

    1С всё усложняет код своих конфигураций, а где сложно — там и ошибок полно.

    В конечном счёте страдает потребитель.

    Монополизм 1С до добра не довёл.

    Reply
  23. kns77

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

    Reply

Leave a Comment

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