<?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) blindcat2006, Чутка подправить статью и будет годна. То, что на картинке, появилось только в 8.3, а ОбработкаПолученияДанныхВыбора есть уже в 8.2 на управляемых формах.
Платформа 2.0 и 3.0? Может платформа 8.2 и 8.3 или конфигурация Бухгалтерия предприятия 2.0 и 3.0? Когда работал во франче у нас менеджеры так путались, не думал, что программист может также запутаться…
Сама публикация нормальная, правда я уже давно на платформе 8.3 сижу, поэтому вряд ли мне понадобится данные в публикации наработки.
(3) klinval, Это очепятка)
стоило бы ограничить число строк возвращаемых запросом
Зачем это всё, когда в платформе реализован ввод по строке по любой части?
p.s Понял. Недочитал:)
Есть минусы:
1. Производительность. номенклатура — справочник содержащий тысячи позиций даже в небольшой фирме. Выражение ПОДОБНО — медленное по сравнению с вырезанием первых n символов. Я бы сначала проанализировал длину строки поиска и допустим искал бы от 3ех или 4ех символов, если введен 1 символ или два отказ = истина. Еще бы добавил в запрос Выбрать первые 5-6, т.к. больше в список выбора один фиг не поместится
2. Вы убили поиск по коду и артикулу. В ЗУП 3.0 в свое время убили ввод сотрудника по табельному т.к. косячно запрос написали. Т.е. они учли поиск по табельному, но сравнивали табельный с кодом физ.лица а не сотрудника 🙂 у Вас это вообще не учтено. Т.е. надо писать столько условий ПОДОБНО через ИЛИ, сколько у Вас полей используется для ввода по строке. Универсально будет пройтись по метаданным справочника и кодом сгенерить текст условия по всем полям. Это позволит в дальнейшем, если кто добавит еще один реквизит для ввода по строке, он не будет ломать мозг почему не работает, пока не найдет Вашу процедуру.
Где то месяц назад мне потребовался ввод по строке с поиском по реквизитам справочника, включая неограниченные строковые.
Реализовал через полнотекстовый поиск , из плюсов — произвольный порядок слов
при вводе по строке.
(1) blindcat2006, А у меня почему-то это не работает 🙁
Конфигурация 11.1.10.180
Платформа 8.3.6.2152
Данный принцип позволит искать элементы по специфичным данным, не являющихся реквизитами элементов! Например, искать Контрагента по номеру телефона (регистр, Контактные данные) и тому подобное… Вводимая подстрока может быть свойством, родителем или тем чем требуется. Подстрока поиска может быть подвержена транслитерации, замене раскладки и т.д.
Автору +
Вот вариант от 1С
http://v8.1c.ru/o7/201302ss/
Спасибо!
Сделал ограничение для определенных пользователей (что-то вроде RLS) с помощью этой штуки
Выкладываю свою написанную функцию для подсвечивания при поиске без учета регистра.
Функцию ВернутьФорматированнуюСтрокуПоиска необходимо добавить в СтроковыеФункцииКлиентСервер
Пример использования ниже:
Показать
(2) Более того, чтобы не колхозить, можно применить свои условия к тому списку, что выдаст сама платформа. Метод ПолучитьДанныеВыбора().