<?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. {ВнешняяОбработка.ВыгрузкаФизЛиц.МодульОбъекта(81)}: Преобразование значения к типу Булево не может быть выполнено
СтрНастрПараметров.Значение = ?(ВыгружатьТолькоРаботающихФизлиц,1,2);
(это если ВыгружатьТолькоРаботающих стоит Нет)
2. Не указано имя файла с правилами обмена (Имя файла правил)
3. При попытке соединения с COM-сервером произошла следующая ошибка:
{Обработка.УниверсальныйОбменДаннымиXML.МодульОбъекта(13885)}: Ошибка при вызове метода контекста (Connect): Произошла исключительная ситуация (V83.COMConnector.1): Идентификация пользователя не выполнена
Неправильное имя или пароль пользователя
При этом под используемым пользователем настроен обмен между базами, т.е. он проверенный.
Дополнение.
Авторизацию исправил — моя ошибка в имени базы была.
А вот первая ошибка — это ошибка обработки. ВыгружатьТолькоРаботающихФизлиц — в этой переменной возвращается строка и к типу Булево не преобразуется.
(1)
СтрНастрПараметров.Значение = ?(ВыгружатьТолькоРаботающихФизлиц,1,2);
(это если ВыгружатьТолькоРаботающих стоит Нет)
Исправил и обновил обработку.
Для тех кто раньше загрузил нужно в модуле объекта заменить строку 72
ВыгружатьТолькоРаботающихФизлиц = РегистрыСведений.ДополнительныеСведения.Получить(Отбор).Значение;
на строку
ВыгружатьТолькоРаботающихФизлиц = ?(РегистрыСведений.ДополнительныеСведения.Получить(Отбор).Значение=Неопределено,Ложь,РегистрыСведений.ДополнительныеСведения.Получить(Отбор).Значение);
какая-то «особенность» платформы для ресурса с типом Характеристика.ДополнительныеРеквизитыИСведения возвращать для булевого типа ресурса Ложь = Неопределено
(1)
Это не ошибка. На обмен это не влияет.
Это «особенность» обработки «УниверсальныйОбменДаннымиXML». Убрал чтобы не смущала.
(1)
{Обработка.УниверсальныйОбменДаннымиXML.МодульОбъекта(13885)}: Ошибка при вызове метода контекста (Connect): Произошла исключительная ситуация (V83.COMConnector.1): Идентификация пользователя не выполнена
Неправильное имя или пароль пользователя
При этом под используемым пользователем настроен обмен между базами, т.е. он проверенный.
У меня это не проявляется. Какой длины логин и пароль? Как вы проверяли? Заходили под ним в базу приемник?
Попробуйте создать нового и задать его в параметрах обмена для Организации.
(2)
Это доработал. Смотрите выше.
Спасибо, мое сообщение было чуть раньше, чем Ваш ответ. Теперь порядок!
Что я не понял. Подключил к ЗУПу. Но при вызове не появляется никаких настроек, типа путь, пользователь к БД-приемнику.
Просто «Обработка выполняется» и потом окно закрывается.
Если попытаться открыть обработку как внешний файл, то «Нарушение прав доступа», хотя права администратора и есть право открытия внешних обработок.
ЗУП 3.1.7.106. Платформа 8.3.10.2667
В БП просто открывается форма с выбором сотрудников.
(6) Все понял. Все нашел. Вопрос снимается
(6) Но вместе с тем хотелось бы чуть по-другому.
1. Встраиваем в ЗУП
2. Открываем из «Дополнительных обработок» и подбираем кого надо и выгружаем. Либо обработка запускается по расписанию. А то сейчас она сразу запускается, а если хочешь какого-то выбора, то надо открывать внешний файл.
(8)
Цель создания обработки — автоматическая выгрузка по расписанию, а не ручная выгрузка.
Ручная выгрузка добавлена как доп. сервис для тестирования.
Это реализация в БСП такая, что для доп. обработок, выполнение которых можно настроить по расписанию форма не открывается,
если открыть ее из списка доп. обработок.
Поэтому чтобы форма с ручной выгрузкой открылась нужно открывать как внешний файл.
Или делать отдельно две обработки одну для ручной выгрузки, вторую для запуска по расписанию.
Я решил объединить все в одну.
(9) Ясно-понятно. Маленькая просьба, негоже пароль показывать. Исправьте.
И второе, на Linux нет com объектов. Не хотите сделать обмен через веб сервис? Если сделаете, то пришлите, плиз.
При нажатии на кнопку «Установить доп сведения (для задания параметров обмена)». Форма настройки не выводиться. Выдает сообщение «Готово». А что готово я еще ничего не настроила.
Клиент-серверный вариант ЗуП 3.1.8.155.
Платформа 8.3.13.1513
(12)
По кнопке «Установить доп сведения (для задания параметров обмена)» в Справочник Организации добавляются доп. свойства.
«Готово» — значит добавлены и вы можете дальше зайти в нужный элемент справочника Организаций и для каждой конкретной организации в вашей базе задать значения свойств. Смотрите рисунок 1.