[ЗУП / ЗКГУ 3.1] Загрузка данных из Excel в документы Премия, Материальная помощь, Разовые начисления, Натуральные доходы, Начисление прочих доходов, Данные для расчета зарплаты (начисления и удержания), Призы и подарки




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

29 Comments

  1. sinitsin86

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

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

    Reply
  2. GeterX

    (1) Обработка исправлена. Теперь сумма по документу будет складываться по сотруднику для документа Данные для расчета.

    Reply
  3. hasp_x

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

    Reply
  4. IGS_1C

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

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

    Reply
  5. GeterX

    (4) Спасибо за идею, подумаю над реализацией такого функционала.

    Reply
  6. GeterX

    (4) обработку исправил, теперь можно искать сотрудников по табельному номеру.

    Reply
  7. tanya19956785

    Добрый вечер! Скажите, а для плановых начислений добавите возможность?

    Reply
  8. kukushkina-marii

    Добрый день! Обнаружена ошибка при загрузке данных в документ «Материальная помощь». Провести созданный через обработку документ нельзя из-за ошибки «Поле «Налогообложение материальной помощи» не заполнено». Использую вид начисления не облагаемый страховыми взносами. Тестирую на релизе 3.1.2.444.

    Reply
  9. GeterX

    (8) К сожалению на этом релизе обработка не тестировалась.

    Но о такой проблеме знаю, в документе материальная помощь изменили название неиспользуемого реквизита (УдалитьВидМатериальнойПомощи), при этом оставили проверку на заполнение, вот и возникает ошибка.

    Выходом из ситуации добавить в код обработки выделенное жирным:

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

    Показать

    Reply
  10. smooth

    Александр, спасибо. Пригодилась! Сэкономили мне время 🙂

    Reply
  11. ВРедная

    Спасибо, просто супер!

    Reply
  12. yakov_frolov

    А скажите на клиент-серверном варианте работает?

    Reply
  13. GeterX

    (12) да, работает.

    Reply
  14. yakov_frolov

    (13) А еще такой вопрос, получается что можно загружать только значение «Результат», или можно еще какие-то значения показателей соответствующие выбранному начислению загружать?

    Reply
  15. GeterX

    (14) такой возможности нет. В будущем может реализуем.

    Reply
  16. Tanis

    Добрый день!

    Скачал обработку, огромное спасибо!

    Видимо последняя версия уже изменена. Хотел попробовать изменить код написанный в сообщении 9, но в скачанной обработке функция уже изменена….

    Спасибо!

    Reply
  17. Zesto4ka

    Добрый день!

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

    Reply
  18. GeterX

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

    Reply
  19. alina71

    Подскажите, обработка будет работать на ЗУП КОРП 3.1.5?

    Reply
  20. GeterX

    (19) на 3.1.5 точно работает. На 3.1.6 пока не тестировал, но думаю будет работать.

    Reply
  21. alina71

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

    Reply
  22. alina71

    Александр, подскажите пжлст, в чем может быть причина, что часть сотрудников не находит по табельным номерам? Дубли исключены, все данные переносились в ЗУП КОРП 3.1.5 рекомендованным способом.Что нужно проверить, может есть предположения? На первый взгляд данные по сотрудникам ничем не отличаются. Файл Excel вручную не набирается, формируется в другой задаче.Хотела проверить отладчиком, но почему-то не реагирует на точку останова.

    Спасибо.

    Reply
  23. GeterX

    (22) могу сказать только посмотрев файл. если у вас клиент-сервер, то включите режим отладку в службе.

    Reply
  24. alina71

    Настроила отладку( у меня файловый вариант), убрала в Запрос.УстановитьПараметр «%», иначе видимо добавлялись символы в таб.номер и получалось дублирование. Большая часть сотрудников загрузилась, остались 6 человек, у которых общим является то, что каждый из них когда-либо увольнялся и опять принимался на работу. Табельные номера у них трехзначные, так что здесь дубли исключены. Прикрепила файл, не загружаются 596,719,760,768,791 и 924 таб.номера. После увольнения их принимали на работу на тот же таб.номер. Но это же было до переноса, еще в ЗиК 7.7.

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

    Reply
  25. GeterX

    (24) обработка работает только с уникальными табельными номерами. Если они дублируются обработка не сопоставляет эти записи.

    При этом в комментарии обработка пишет по какой причине не сопоставлены данные.

    Можно в запрос поиска сотрудников добавить дополнительное условие, если сотрудник не в архиве.

    https://yadi.sk/i/hbFTyKNm3XGFZb

    https://yadi.sk/i/-i93CiPC3XGGAy

    Reply
  26. alina71

    Александр, да, оказывается, если в ЗиКе сотрудник принимался на работу несколько раз под одним и тем же табельным номером, то после переноса создаются дубли. При помощи обработки «Поиск и удаление дублей» удалила лишнее и обработка заработала)) Огромное спасибо за обработку и помощь!

    Reply
  27. platonov.e

    Скажите, а при начислении премий, начисляется ли ндфл и удержания?

    Reply
  28. GeterX

    Насколько помню, то да.

    После заполнения документа суммами запускается стандартная процедура расчета.

    Или на крайний случай можно перевыборами способ выплаты и все перерасчитается.

    Reply
  29. SlavaKron

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

    Reply

Leave a Comment

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