<?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. Создаем внешнюю обработку
2. Копируем в нее форму документа, справочника, чего угодно
3. Назначаем ее основной
Профит!
(1) Зачем что-то создавать, когда то же самое делается в два клика? Выделить документ,Ctl-c, Выделить дерево обработок,ctrl-V, сохранить как внешнюю. Самое главное сохраняется связь элементов формы с метаданными. В вашем случае она будет потеряна, на форме будет хаос.
а че так можно было?!:O Спасибо!
Я бы все же перенес вручную. т.к. при замене документа у него изменится идентификатор
(4) Если это тестовая база и это документ, который создан тобой недавно, то без разницы.
(5) Вот это «если» и имеет значительную разницу) Было на практике, что заменил так уже существующий документ, в тестовой базе разумеется. Все ссылки на него сразу тютюкнулись, потом пришлось восстанавливать.
(6) Согласен, нужно быть осторожнее в этом моменте. Правда можно еще поиграться с режимами объединения конфигураций при переносе документа в боевую.
(2)
А как же создание реквизитов Ссылка, Номер, Дата, Проведен, ПометкаУдаления и тп?
А что более интересно — при чуть более сложном документе это все уже просто не работает.. Попробуйте сделать указанную процедуру с документом реализации из ЕРП:
по причине:
{ВнешняяОбработка.РеализацияТоваровУслуг.МодульОбъекта(649,7)}: Переменная не определена (ОбменДанными)
Если <<?>>ОбменДанными.Загрузка Тогда
{ВнешняяОбработка.РеализацияТоваровУслуг.МодульОбъекта(1221,7)}: Переменная не определена (ОбменДанными)
Если <<?>>ОбменДанными.Загрузка Тогда
{ВнешняяОбработка.РеализацияТоваровУслуг.МодульОбъекта(661,2)}: Переменная не определена (ДополнительныеСвойства)
<<?>>ДополнительныеСвойства.Вставить(«ЭтоНовый», ЭтоНовый());
{ВнешняяОбработка.РеализацияТоваровУслуг.МодульОбъекта(662,2)}: Переменная не определена (ДополнительныеСвойства)
<<?>>ДополнительныеСвойства.Вставить(«РежимЗаписи», РежимЗаписи);
Очистить модуль объекта? Так его функции могут использоваться из формы..
Кроме того, в форме могут использоваться методы расширения типа Прочитать(), Записать()..
(2) Ты бы хоть проверил для проформы. Никакая связь не теряется, более того, не надо создавать стандартные реквизиты (Код, Наименование и т.д.). Плюс сохраняется связь с модулем объекта исходного документа/справочника (чуть ниже описаны ошибки из-за твоего метода)
И обратное копирование доработанной формы тоже происходит гораздо более безболезненно, чем описано в публикации — просто Ктрл+Ц/Ктрл+В
(8) В таком случае, можно закомментарить текст сбойных модулей. Для отладки этого должно хватить.
(2) Обязательно проверю. Если ваш метод лучше, буду пользоваться им.
(9)
Кстати, так тоже не очень работает для типовых..
Накидал свою обработку для открытия форм — типа, копируешь форму в обработку, а в ней своя форма со списком форм — выбираешь и она открывается.. А фигушки — выдает какие-то проблемы с идентификаторами метаданных..
В этом плане наверное лучше всего работает вариант с расширениями — делаешь расширение для формы, в ней отлаживаешь изменения, а потом переносишь изменения в основную форму.
(12) Есть такой нюанс. Это не ошибка, просто в БСП для внешних обработок нужно указывать въявную тип источника формы
Показать
(13)
у меня оно вот тут начинает свое падение:
(14) Тут еще проще, закомментируйте эту строку, да и все (если она не влияет на логику отладки)
(15)
А смысл? хотелось замутить обработку, которая бы открыла любую перенесенную в не форму объекта.. А так — скопируй, проанализируй, исправь, удали.. Большая часть профита теряется.. Быстрее все же сделать расширение..
(16) Хз, если на скорую руку что-то проверить в работе формы — так очень удобно. Не сталкивался с сильными сложностями? Что за конфа-то хоть?
(17)
Ерп в основном.
Для Ут и Унф в принципе тоже пробовал — больших проблем вроде нет. единственное что неудобно затягивать объекты в расширение, если есть необходимость.
Ну и изменения переносить придется не в один клик, разумеется.. Но это для любой схемы проблема, мне кажется.
(2) модуля менеджера нет во внешних обработках, а большинство документов содержит код в модуле менеджера. Поэтому только Ctrl-C / Ctrl-V не обойдешься.