<?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) но для этого надо изменять конфигурацию. Хотя бы просто для того, чтобы экспортировать процедуру ПриИзменении. Данный способ позволяет этого не делать.
Я уже писал здесь, но мой пост куда то делся (удалили?)
http://infostart.ru/public/16985/
Попробую снова.
Более универсальным решением для имитации интерактивного изменения значения в поле ввода является мой способ
(4) Я тоже с таким глюком сталкивался.
1. надо ли открывать форму?
2. надо ли откатывать действие назад?
(3) я ничего не удалял. Кстати, пропавший комментарий приходил мне на почту, поэтому в систему он точно записывался. Дальнейшая судьба мне не известна.
По поводу Вашего решения: я не настаиваю на уникальности и единственной верности данного способа. Я поделился своим опытом, а остальные могут его использовать, а могут и не использовать.
По такой же логике я «заставил» выполниться процедуру ПередЗаписью Формы (путём переназначения действия при закрытии Формы на процедуру ПередЗаписью). Таким образом можно вызывать выполнение «интерактивных» процедур программно путём подсовывания этих процедур под действия, которые можно вызвать программно (например, установить текущую строку, вызвав тем самым действие ПриАктивизацииСтроки, или закрыть форму, вызвав тем самым действие ПриЗакрытии).
(6) 1. Без открытия формы нельзя ничего делать с элементами формы. Поэтому открывать форму обязательно
2. Действие откатывается назад для перестраховки. Если данный код использовать внутри большой процедуры, но через надцать страниц код можно забыть, что у этой формы произведена замена процедур по действию и тогда форма будет работать «неадекватно».
1. отмаза про перестраховку не катит: ФормаДокПоступления.Закрыть();
ФормаДокПоступления = Неопределено;
2. почему нельзя просто вызвать «ПриАктивизацииСтроки»? не экспорт? но наверняка в ней самой ничего такого нет, она (наверняк) просто вызывает что-то экспортное
(9) 1. программер до строк «ФормаДокПоступления.Закрыть(); ФормаДокПоступления = Неопределено;» может ещё выполнять какие-то действия с формой.
2. Не понял суть вопроса. Как просто вызов процедуры ПриАктивизацииСтроки табличного поля может вызвать выполнение процедуры ПриИзменении элемента управления в ячейке
ну, что там внутри ПриИзменении вызвать..
(11) ПриИзменении в табличную часть заносится единица измерения номенклатуры, пересчитываются всего и итого по таблице. Это из того, что я точно знаю.
странно. поставил плюс — никакой реакции. обновил страницу — нет моего плюса. Давлю снова на плюс — вы уже голосовали 🙁
(8) 1. Как это нельзя? Реализовывал недавно эмуляцию нажатий на кнопки при заходе определённого пользователя в систему:
В глобальном модуле:
Ф=Обработки.ПроведениеПоПартиям.Создать();
Форма=Ф.ПолучитьФорму();
При получении выполняются действия из нижней части модуля формы, не из процедур:
Если глТекущийПользователь.Наименование = «ПроведениеПоПартиям» Тогда
ПередОткрытием(Ложь,Истина);
КнопкаВыполнитьНажатие(ЭтаФорма.ЭлементыФормы.ОсновныеДействияФормы.Кнопки.Действие);
КонецЕсли;
В документах думаю что-то подобное можно по аналогии сворганить 😉
(15) но, опять же, для этого надо редактировать конфигурацию 🙂
По поводу элементов формы. С ними ничего нельзя сделать без открытия формы. Другой вопрос, что Вы предлагаете запускать процедуры из модуля, не привязываясь к элементам формы.
Спасибо большое. Мне помогло данное решение.