<?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.0) версии, для получения макета непосредственно из внешней обработки, выполнятся запрос к базе данных, хотя контекст, из которого вызывается функция МакетПечатнойФормы(), в большинстве случаев уже несет в себе ОбработкуОбъект.
Можно написать отдельную функцию получения макета, где входящим параметром нужно передавать ОбработкуОбъект, но такое решение усложняет, т.к. необходимо во внешних обработках переписывать место получения макета.
Если бы расширение позволяло добавлять в перехватываемую функцию необязательные параметры…
Смотрю в сторону дополнительных свойств ОбработкиОбъекта. Тогда тем, кому важна временнАя оптимизация получения макета могли бы добавлять ОбработкуОбъект в дополнительные свойства перед вызовом функции МакетПечатнойФормы().
(1)нет, не выйдет ничего с дополнительными свойствами, т.к. они живут только вместе с ОбработкойОбъектом, а её (кажется) можно передать только параметром.
Добрый день! Есть внешняя печатная обработка, есть макет в формате «Двоичные данные» — документ «Word». Макет попадает в «Макеты печатных форм», редактируется, сохраняется. Но при печати выводится старый, неизмененный макет из внешней обработки, хотя отладчиком я попадаю на строку Возврат Выборка.Макет.Получить(); функции simПМВПФ_МакетПечатнойФормы() (то есть в регистр «Пользовательские макеты печати») я попадаю. Что здесь не так? Может, что-то мною упущено? Спасибо.
Добрый день!
Однозначно плюс! Работает и с WORD.
Только маленький вопрос.
В моей обработке используется «ВызовКлиентскогоМетода» в отличии от «ВызовСерверногоМетода» (в примере _ДемоПечатьСчетовНаОплатуПокупателю).
При этом в форме строка кода:
выдает ошибку:
Макет = УправлениеПечатью.МакетПечатнойФормы(ЭтотОбъект.Метаданные().ПолноеИмя() + «.» + ИдентификаторКоманды);
Если явно указываю
то все работает…
Подскажите, как получить имя внешней обработки из формы (&НаКлиенте или &НаСервере)
по моему вот этих 2-х пунктов
— Макеты, которые вы хотите дать на редактирование пользователям, должны префиксироваться согласно правилам БСП (ПФ_MXL_,ПФ_DOC_)
— Получать макет необходимо функцией БСП УправлениеПечатью.МакетПечатнойФормы(ПутьКМакету)
вполне достаточно для редактирования макетов в пользовательском режиме. Для чего весь остальной код ?
(4)Добрый день. В принципе, можно сделать так как сделали вы, просто при создании новой печатной формы копированием, нужно не забывать менять данный параметр.
Что бы обратиться к метаданным обработки объекта с клиента, вам нужно вызвать серверную функцию вида:
Показать
(6)А еще лучше, что бы лишний раз не дергать сервер, в ПриСозданииНаСервере закешировать полное имя из метаданных в реквизит формы. В последствии вы просто обращаетесь к этому реквизиту при необходимости.
(3)Добрый день. К сожалению не смогу вам помочь. Слишком мало данных для анализа. Может стоит попробовать почистить кеш.
(5)Добрый день. Вы проверили ваше утверждение, или только предполагаете?
(9) я делаю печатные формы только через расширения, чтобы пользователи сами меняли макеты через Еще-Изменить макет.
И точно знаю что Префикс печатной формы + получение макета через путь к нему = автоматическое редактирование макетов пользователем )
(10) в данной публикации речь идет о дополнительных внешних обработках печати, подключение которых не предполагет использования расширения (и редактирования макета пользователем).
(11) надеюсь кто-то найдет это материал полезным