<?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С:
Разработка управляемого интерфейса
Глава 3.8. Последовательность событий при открытии формы объекта
Глава 3.9. Последовательность событий при записи объекта из формы
(5)
(6)
Возможно, картина не полная, не судите строго…
Выписал то, на что сам Радченко обращал внимание, в другие источники некогда было лазить. Но, по опыту, могу сказать, что большего пока и не требовалось))
Переопределение параметров однозначно входит в жизнь формы, с ними там целая эпопея. Но вот как-то без них…
(7)
Спасибо, загляну!
(8) Я, бывает, в работе сталкиваюсь, когда нужно как-то обработать значения полей формы, которые были сохранены у пользователя в настройках. При создании на сервере — это еще рано, при открытии — можно, но это на клиенте. Самое правильное — это вот таких специальных событиях.
На самом деле не весьма наглядно, поскольку на одном уровне расположены ПриЧтенииНаСервере() и ОбработкаЗаполнения()
. На самом деле вначале обработчики происходят МодуляОбъекта, а потом уже на стороне модулей формы но никакак ни наодном уровне. исправьте!
(5)
Это да, но уже они с более новых платформ. Я так понимаю автор хотел основную механику.
Еще пропущено
1) Код модуля формы
2) Код модуля объекта
И это основные механики.
из новых ОбработкаЗаписиНового
Кстати попробуйте догадайтесь в каком порядке происходит вызов кода модуля формы ))
(10) Разве можно говорить о порядке двух обработчиков, один из которых выполняется только для нового объекта, а другой — только для существующего? Они взаимоисключаемые )) Не вижу смысла исправлять.
(12) Не понял вашего замечания. По-моему, именно эти вещи отмечены на схеме.
А по поводу дополнительных обработчиков, которых нет на схеме, еще раз повторюсь: я не претендую на абсолютную полноту ))
(14)
Открытие формы
выполняется до процедур обработчиков, в том числе ПриЧтенииНаСервере() — код который расположен ПОСЛЕ всех процедур и функций
в модуле формы
в модуле объекта
(14) товарищ (15) имеет ввиду, видимо, компиляцию программного кода модуля формы и модуля объекта… И про определение операторов тела программы типа «мСпециальныйФлаг = Истина». В принципе да, важное замечание — можно добавить в статью пару слов про последовательность компиляции
Рекомендую дополнить заголовок словом «объекта». Для УФ набора записей, записи, отчета и обработки существуют другие процедуры и функции.
Под книжкой «Разработка управляемых форм» имелась в виду «Разработка управляемого интерфейса» с Радченко и Хрусталевой?
(18) Да)))
Очень хорошая схема, автор молодец. Есть дополнение к:
Нужно уточнить, что это верно для непараметризованных функциональных опций.Читаем :
Взводится такая ФО примерно вот так:
Вот ещё картинка
И другая
Есть вообще какой-то справочник или манул 1С:8.3 по всем событиям? С учетом того, что будущий читатель может и не знать как называются события, то есть СП не поможет.
(23)Руководство разработчика и синтакс-помощник ))
(24) Отличная шутка. Так я написал, что СП не поможет, так как пользователь не знает названия функций. Какое конкретно руководство, дайте ссылку на источник.