<?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) Ниасилил?
А в чем преимущество данного функционала перед возможностью платформы переопределять обработчики событий (only v8.1). Ведь можно назначать обработчики для событий прикладных объектов, прикладных объектов, наборов записей и СОМ — объектов.
(3)
Вообще-то статья о формах. Форма — прикладной объект?
юзаю уже давно респект, но вчера наткнулся на баг небольшой, в событии ПриИзмененииФлажка
Лучше поздно, чем никогда.
Сам применил эту методику в рабочей конфе. Спасибо автору.
Внедряю УПП. Попоробую эту методику, т.к. события форм максимально автоматизируются. Только вот вопрос вида форм для разных ролей этой методикой не решить, скорее всего будет несколько форм документов для различных должностей. ❓
+1 Шпасиба!
(2) Для управляемых форм 8.2. не пробовал портировать?
Не работает на подменю:
ЛксУстановитьДействиеФормы(ЭтаФорма, , «ДействияФормы.Подменю2.ЭлектронныеПисьмаПлюсКонтактныеЛица»);
Классное решение. Правда не сразу разобрался, но сейчас доволен как удав 🙂 (УПП 8.2 работает)
Пожалуйста продемонтрируйте данную технологию на практическом примере.
Описание методики до меня начало доходить только после 2 прочтения. И все равно я не понял
как будут переопределяться динамичиские обработчики событий, назначенные программно (напр. меню кнопки «Печать»,»Заполнить» или «Вид операции» в документах типовых конфигураций).
Очень прошу описать выполнение действий для простой задачи, например:
1) Ручное добавление реквизита «НаименованиеДляНалоговойНакладной» в справочник «Контрагенты»
и заполнение данного реквизита при изменении заначения в реквизите «Наименование».
По аналогии с реквизитом «Полное наименование».
2) В документе «Реализация товаров и услуг» в процедуре ПриОткрытии() вызывается процедура
РаботаСДиалогами.УстановитьПодменюВыбораВидаОперации(,……,Новый Действие(«ДействияФормыДействиеУстановитьОперацию»));
Цель задачи: необходимо переопределить обработчик «ДействияФормыДействиеУстановитьОперацию».
В новом обработчике необходимо реализовать вывод некоторой картинки-пиктограммы, которая отображалась бы перед наименованием вида опреации.
(8) Поручик, присоединяюсь. Кто знает подобное решение для управляемых форм?
(12) HIgor, поддерживаю, очень интересует подобная схема для управляемых форм
БРАВО!!! Это просто круть.
хорошо бы реализовать подобное для управляемых форм 8.2…………….
(8) Поручик, (12) HIgor, (13) stalker18, (15) alekseies, вот для УФhttp://infostart.ru/public/169131/ . Метод похож на та этот. Спасибо автору за идею и малость кода.
Мир этому дому. Спасибо за статью. Чужой опыт, всегда полезен — указывает возможный путь и решение.
Можно попросить Вас отформатировать программный текст? Сейчас он растянут, читается тяжело
(
особенно
перенос
скобок
на новую
строчку
)
(18) К сожалению вручную это большие трудозатраты. Как это сделать автоматизировано, у меня пока нет идей. Сломалось по вине движка сайта. Я лишь добавил ссылку на версию методики для управляемых форм. После сохранения все форматирование сломалось. Я обращался к модератору с просьбой помочь, но он пока не отреагировал на нее =(
Тех. поддержка восстановила форматирование содержимого публикации.
для УФhttp://infostart.ru/public/169131/ . Метод похож , но более трудоемк для обновления на новые конфигурации ………….
(21) Я все надеялся в самой публикации указать эту ссылку, но к сожалению при попытке отредактировать публикацию в ней ломается все оформление программного кода. Видимо теперь она навсегда останется в текущем виде.
Шаблоны в конце статьи не читабельны. Здесь зеркало статьи с нормальными шаблонами:http://kb.mista.ru/article.php?id=268
И еще: долго с коллегами думали, что же делает, например, код:
Оказалось, что квадратные здесь — просто для красоты #k8SjZc9Dxk.#k8SjZc9Dxk Может быть, хотя бы в статье-зеркале уберёте, раз эта не недактируется?
Квадратные скобки обозначают необязательный фрагмент.
(0), спасибо.
Потребовалось добавить во все формы конфы немного программного кода. В платформе есть возможность выгружать загружать файлы конфы. Чтоб велосипеды не городить да время сэкономить, не подскажите, нет ли обработки, позволяющей во все формы конфы добавить некий код? Может даже с указанием, в какую процедуру надо код вопхнуть…
Сколько лет прошло, а методика жива и работает
(1)
Центр = Половина длины сторон ограничивающего прямоугольника. 😉
По обработке можно выложить скрин экрана обработки?
По образцу Вашей статьи мной решалась задача вызова обработчика «ПриИзменении» реквизита формы документа в процедуре общего модуля;
оказалось, что для обработчиков, не объявленных как экспортные, возвращается ПолучитьДействие (отличное от Неопределено),
но попытка выполнения их вне формы выдает ошибку: Метод объекта не обнаружен, объявление их экспортными ошибку устраняло
(8.3.9, режим совместимости Версия 8.2.16, обычные формы).
Благодарю за статью.
Обработчик ПриИзменении для поля формы часто удобнее вызывать черезhttps://infostart.ru/public/16985/