[ЗУП / ЗКГУ 3.1] Загрузка данных из Excel в документы Премия, Материальная помощь, Разовые начисления, Натуральные доходы, Начисление прочих доходов, Данные для расчета зарплаты (начисления и удержания), Призы и подарки
1C-admin
25.07.2019
Принцип обмена данными из 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='\
Если в файле присутствует несколько строк по одному сотруднику, то грузится только первая строка.
Пробовал загружать в документ Данные для расчета з/п
(1) Обработка исправлена. Теперь сумма по документу будет складываться по сотруднику для документа Данные для расчета.
Полезная обработка, всё классно перенеслось, думаю, у многих премии да и зарплаты изначально считаются в Excel. Мне, правда, нужно допилить для своего вида файла Excel, а так отлично
Полезная обработка, но странно, что нет возможности подбирать сотрудников по Табельному номеру. Таб. номер в большинстве случаев является уникальным идентификатором сотрудника.
Попробовал загрузить файл с табельными номерами: они распознаются как числа. Как следствие, в форме обработки появляется разделитель групп разрядов.
(4) Спасибо за идею, подумаю над реализацией такого функционала.
(4) обработку исправил, теперь можно искать сотрудников по табельному номеру.
Добрый вечер! Скажите, а для плановых начислений добавите возможность?
Добрый день! Обнаружена ошибка при загрузке данных в документ «Материальная помощь». Провести созданный через обработку документ нельзя из-за ошибки «Поле «Налогообложение материальной помощи» не заполнено». Использую вид начисления не облагаемый страховыми взносами. Тестирую на релизе 3.1.2.444.
(8) К сожалению на этом релизе обработка не тестировалась.
Но о такой проблеме знаю, в документе материальная помощь изменили название неиспользуемого реквизита (УдалитьВидМатериальнойПомощи), при этом оставили проверку на заполнение, вот и возникает ошибка.
Выходом из ситуации добавить в код обработки выделенное жирным:
Показать
Александр, спасибо. Пригодилась! Сэкономили мне время 🙂
Спасибо, просто супер!
А скажите на клиент-серверном варианте работает?
(12) да, работает.
(13) А еще такой вопрос, получается что можно загружать только значение «Результат», или можно еще какие-то значения показателей соответствующие выбранному начислению загружать?
(14) такой возможности нет. В будущем может реализуем.
Добрый день!
Скачал обработку, огромное спасибо!
Видимо последняя версия уже изменена. Хотел попробовать изменить код написанный в сообщении 9, но в скачанной обработке функция уже изменена….
Спасибо!
Добрый день!
А с помощью этой обработки можно загрузить данные в документ «Данные для расчет зарплаты», если предполагается ввод в одном документе нескольких показателей? Т.е. например для каждого сотрудника вводится план продаж и сумма продаж.
(17) на текущий момент есть возможность загружать значение только одного показателя.
Подскажите, обработка будет работать на ЗУП КОРП 3.1.5?
(19) на 3.1.5 точно работает. На 3.1.6 пока не тестировал, но думаю будет работать.
Александр, огромное спасибо за обработку! Работает отлично. Осталось разобраться почему не может сопоставить некоторые табельные номера.
Александр, подскажите пжлст, в чем может быть причина, что часть сотрудников не находит по табельным номерам? Дубли исключены, все данные переносились в ЗУП КОРП 3.1.5 рекомендованным способом.Что нужно проверить, может есть предположения? На первый взгляд данные по сотрудникам ничем не отличаются. Файл Excel вручную не набирается, формируется в другой задаче.Хотела проверить отладчиком, но почему-то не реагирует на точку останова.
Спасибо.
(22) могу сказать только посмотрев файл. если у вас клиент-сервер, то включите режим отладку в службе.
Настроила отладку( у меня файловый вариант), убрала в Запрос.УстановитьПараметр «%», иначе видимо добавлялись символы в таб.номер и получалось дублирование. Большая часть сотрудников загрузилась, остались 6 человек, у которых общим является то, что каждый из них когда-либо увольнялся и опять принимался на работу. Табельные номера у них трехзначные, так что здесь дубли исключены. Прикрепила файл, не загружаются 596,719,760,768,791 и 924 таб.номера. После увольнения их принимали на работу на тот же таб.номер. Но это же было до переноса, еще в ЗиК 7.7.
Очень хотелось бы разобраться, потому что обработка просто замечательная, экономит кучу времени.
(24) обработка работает только с уникальными табельными номерами. Если они дублируются обработка не сопоставляет эти записи.
https://yadi.sk/i/hbFTyKNm3XGFZb
https://yadi.sk/i/-i93CiPC3XGGAy
При этом в комментарии обработка пишет по какой причине не сопоставлены данные.
Можно в запрос поиска сотрудников добавить дополнительное условие, если сотрудник не в архиве.
Александр, да, оказывается, если в ЗиКе сотрудник принимался на работу несколько раз под одним и тем же табельным номером, то после переноса создаются дубли. При помощи обработки «Поиск и удаление дублей» удалила лишнее и обработка заработала)) Огромное спасибо за обработку и помощь!
Скажите, а при начислении премий, начисляется ли ндфл и удержания?
Насколько помню, то да.
После заполнения документа суммами запускается стандартная процедура расчета.
Или на крайний случай можно перевыборами способ выплаты и все перерасчитается.
(27) Если премия относится к оплате труда, то нет — ндфл начислится в документе начисление зарплаты и взносов.