<?php // Полная загрузка сервисных книжек, создан 2026-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)
актуально. где об этом можно почитать(посмотреть)?
(1) Про профиль безопасности я говорил
«При добавлении расширения необходимо снять галочку «Безопасный режим, имя профиля безопасности» иначе при запуске 1с мы получим следующее уведомление:»
А если применить «После» вообще ничего работать не будет — пункты меню задвоятся.
(3)
Так не надо типовой код копировать ) , там надо только «добавки» написать.
Опускайте
//
// Здесь идет код типовой процедуры Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода)
//
И у Вас всё получится.
(3)
Я заметил. Просто добавил, что это полезно указать более подробно. Т.к. расширения сейчас очень актуальная тема. Буквально на прошедшем семинаре 1Сникам говорил, что нет методических материалов, как правильно делать в т.ч. доп. печатные формы.
Вы пометили общий обход для всех «не безопасных» действий, а ведь можно разрешить работать только своему расширению и не опасаться что бух что-то там ещё запустит.
(4) В принципе, Вы правы. С &после будет правильнее.
(0) нафига это надо? чем печатная форма не угодила?
(6) Хотя бы тем, что процесс разработки и отладки намного проще.
К тому же, возможности расширений постоянно растут, и было бы странно дорабатывать конфу с помощью расширений и при этом использовать внешние печатные формы.
(7) мой процесс разработки выглядит как редактирование запроса и макета, думаю в вашем случае он не проще.
(8) какая из возможностей расширений (старыхновых) используетсядемонстрируется в статье?
(8)
В чём именно странность?
(9) новые возможности — это те, которые появились в 8.3.9.
Вы же не будете спорить, что процесс отладки кода в расширениях проще? (можно запустить отладчик и работать с ним, как и при отладке обычной конфы)
ИМХО, использовать расширения, для изготовления печатных форм, это как по слону стрелять дробиной…
К тому же у печатных форм есть такая особенность, что их можно независимо распространять, а с расширениями есть большое желание напихать в них всего и побольше, что сразу отметает идею о частичном распространении.
(13)Бред сивой кабылы. Что вам мешает напихать в форму в отдельное расширение?
Почему наш народ так отчаянно противится всему новому? Лучше бы сами попробовали САБЖ где нить, может тогда поймете для чего они делались.
(14) Может быть бы сначала сами подумали, что уже целая армия пользователей знает о существовании обработок, а теперь вы еще их «убогих» хотите научить и каким-та расширениям неведомым?
Мне как программисту все равно как реализовать, хоть тупо в код залезть типовой и там накуролесить, но пока я выберу путь внешних печатных форм, покуда они поддерживаются в БСП.
Тут как посмотреть. Надо мне, например, ответственного за выписку документов поменять. Зачем я буду создавать отдельную ВПФ, когда я в расширение «пихну» модуль менеджера, там его обработаю и все.
(16) Комрад Brawler верно говорит, такую задачу лучше решать через ВПФ! Опять же, вопрос поддержки, один — написал, второй будет тянуть, ВПФ всегда проще отладить и изменить! Ну и опять же, в конторах любят иметь набор ПФ, которые отрабатывают по разному. Ну и какой шлак, тогда будет внутри?
Спасибо!
Очень познавательно.
(15) Вы попробуйте отделить суп от мух.
Вам продемонстрировали внятный пример «как сделать свое расширение»(суть), на примере создания печатной формы(частность). Почему Вы сосредоточились на частности?
Автор не про печатные формы писал а про расширения конфигураций.
(14)
Попробуйте на досуге доработать запрос в печатной форме, и тогда поймете, чем же лучше ВПФ ) Уж как минимум тем, что не надо втаскивать в нее стомильонов объектов заради одного запроса..
(20) Запрос (его текст) можно сделать в модуле внешней обработке, дальше копипастом в расширение.
Подождите, Господа. Тут речь идет не о том, через какое место лучше делать. Человек сказал что можно вот так. А как делать оптимальнее, зависит от задачи и от ЗУНов каждого конкретного прогера.
Не помешало бы расширение закинуть что бы на нее глазами посмотреть
(23) Так в статье весь код есть. Хотя можно и выложить.
Вот уже и становится задача перед тем, как реализовать дополнительную печатную форму в базе. А задача, как доп. печ. форму реализовать — или через внешнюю обработку, или через механизм расширений.
(25) Хотя, признаюсь честно, что через расширения больше как-то нравится.
А обязательно в общие макет добавлять свой новый макет, или можно добавить типовой макет в расширении его там поправить ? попробовал так сделать — не получается. говорит что макет к которому обращаюсь не найден.
(4)
Всем привет. А можно про &После немного поподробней? В каком смысле «Опускайте»?
(28) При использовании «После» не нужно копировать типовой код, он и так исполнится, а только затем добавленный нами..
В статье же описан только метод «Вместо», который заменяет типовой код и для сохранения стандартного поведения нужно его (типовой код) копировать в наше расширение.