<?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='\
1) как производится поиск сотрудников ? по ФИО ????
а если однофамильцы ? а если в файле ФИО не полностью ? (например: Пупкин В.И.)
2) Имя листа вводится вручную ? не проще указать номер листа ? или даже лучше делать предварительное чтение и создать список листов для выбора (ну это уже идеальный вариант 😉 )
Обработка была выложена больше для тех разработчиков, кто ищет простой пример работы с екселем в клиент-серверном варианте, Я в свое время не нашел. Поиск по справочнику, заполнение документа и интерфейс можно переделать под свои нужды весь код обработки открыт.
Обработка полезная, пригодится, например, при переходе с ЗиК на ЗУП 3.1, чтобы, работая в период отладки в параллель, не вбивать длинные списки доплат и удержаний в ручную в ЗУПе, а переносить из ЗиК. Не хватает только режима записи (перезаписи) в уже созданный документ в случае, если что-то пошло не так, чтобы не плодить помеченные на удаление документы.
(3)Дак она открывает еще не записанный документ с данными, его можно проверить и либо провести либо закрыть без сохранения
Понял. Еще не плохо было бы переносить начало и окончание по каждому сотруднику. Я, к сожалению, пока плохо ЗУП 3.1 знаю, пытаюсь доработать, но не очень что-то получается.
(5) начало, окончание из екселя?, или по умолчанию?
(6) Из екселя, конечно. Можно было бы сделать гибко, если указана колонка «начало» (не нулевая) и «окончание», то брать из екселя, иначе ставить «по умолчанию».
(7) Поправлю, отпишусь
(8) Спасибо.
По табельному номеру (вместо ФИО), к сожалению, не работает, так как в запросе к кадровым данным используется обращение к полю «ФИО» справочника «Физ.лица», а не «Код». Хотелось бы, чтобы был этот режим, так как у нас есть полные однофамильцы.
(10) Проверил, загрузку по таб. номеру — все огонь — проверяйте еще раз, по поводу периода в разовом начислении: посмотрел что в самом документе этот период в табличной части не отображается, используется тот который в шапке, но в загрузку добавил
(11) Пришлось все-таки чуть доработать вашу обработку, а именно:
А в ексель записывать даты в формате ГГГГММДД. Теперь все работает, как надо. Еще раз спасибо.
Данная обработка заполняет невидимые колонки документа в табличной части «Начисления»?
Интересуют следующие реквизиты табличной части «Начисления»:
ГрафикРаботыНорма
ГрафикРаботы
ОбщийГрафик
Данные реквизиты заполняются автоматически при ручном выборе сотрудника, и затем прописываются в регистр расчета «Начисления».
При программном создании документа Вы их заполняете?
Конкретно эти три реквизита не заполняются
А проблем в дальнейшем с такими документами не возникает?
Боюсь, что отсутствие графика сотрудника в регистре расчета может плохо сказаться. Если он заполняется программой, то его нужно заполнять.
Я только изучаю ЗУП-3, поэтому утверждать не могу, просто решил поделиться соображениями. Сам тоже делал загрузку, правда из других источников, и уперся в эти графики. Не понял пока где в коде стандартной конфигурации они заполняются
в нашей организации разовые начисления не зависят от графика, в основном фиксированные суммы
У нас тоже фиксированные суммы. Не зависят ни от чего.
Но при проведении в регистр расчета должен писаться график сотрудника. Он в любом случае у сотрудника есть. Я боюсь, что если его не прописать, то какая-нибудь проблема вылезет потом, с расчетом среднего или ещё где.
хорошо будет время я добавлю установку графиков
Выдает обработка ошибку {ВнешняяОбработка.ЗагрузкаНачисленийИзЕкселя.МодульОбъекта(29)}: Ошибка при вызове метода контекста (Open): Произошла исключительная ситуация (ADODB.Connection): Не удается найти указанный поставщик. Вероятно, он установлен неправильно.
Ошибка при выполнении запроса к листу Лист1 ! Проверьте имя листа в книге. Что можно сделать?
(19)Возможно не установлен ексель, возможно имя листа не то казали
Имя листа указано верно, а что значит не установлен ексель?
(21)У вас серверная база?
Не работает…
(23)пятница 13)
Выдает обработка ошибку {ВнешняяОбработка.ЗагрузкаНачисленийИзЕкселя.МодульОбъекта(29)}: Ошибка при вызове метода контекста (Open): Произошла исключительная ситуация (ADODB.Connection): Не удается найти указанный поставщик. Вероятно, он установлен неправильно.
попробуйте драйвер установить?
http://www.microsoft.com/en-us/download/details.aspx?id=13255
Драйвер подключения Provider=Microsoft.ACE.OLEDB.12.0:
— Установленный Microsoft Access Database Engine 2010 Redistributable (16/12/2010) 32 и 64 — разрядные версии:
Microsoft ADE 2010 16/12/2010:
Подскажите пжлст, после перехода на ЗУП 3.1.5 РегистрСведений.ТекущиеКадровыеДанныеСотрудников заполнен не полностью ( заполнены только Физлицо, Сотрудник, Головная организация и Дата приема), видимо поэтому результат запроса пустой. Как можно обойти эту ситуацию в обработке, чтобы запрос сработал и соответственно обработка работала?
(27)как перепишу запрос, отправлю на почту
Большое спасибо. a-alinova@mail.ru
Добрый день!
Подскажите, плиз, обработка для скачивания изменена уже под 3.1.6?
Спасибо!
Не заполняет место работы… Похоже обработка не исправленная под новую версию…
(29)Прошу прощения, Вам исправленную обработку прислали?
(32) нет, видимо автор так и не исправил
Добрый день. Скачали обработку, но она не работает.
{ВнешняяОбработка.ЗагрузкаНачисленийИзЕкселя.МодульОбъекта(46)}: Ошибка при получении значения атрибута контекста (RecordCount)
КолвоСтрок = Выборка.RecordCount;
по причине:
Произошла исключительная ситуация (ADODB.Recordset): Операция не допускается, если объект закрыт.
Произошла исключительная ситуация (ADODB.Recordset): Операция не допускается, если объект закрыт.
(34) Проверьте чтобы файл екселя был закрыт
У меня на клиент серверном варианте не работало, помогло следующее:
на сервере убиваем excel (taskkill /im excel.exe /f)
открываем оснастку «Службы компонентов» (Пуск->Администрирование->Службы компонентов)
в ней раскрываем ветку Службы компонентов->Компьютеры->Мой компьютер->Настройка DCOM
справа в списке находим Microsoft Excel Application, открываем Свойства, вкладка Удостоверение, выбираем «Текущий пользователь», ОК.
Готово