<?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='\
А в чем ценность, собственно ❓ ❓ ❓
Эти функции давно до Вас написаны, можно было использовать уже готовые. Так же написаны обработки и методики переноса между базами.
Ну, прям сходу скажу, в чем порок этой функции (в том виде, как она есть).
Берем ТиС или Комплексную 7.7, там учет многофирменный и есть такая примочка (как и в 8х) под названием префикс.
На
Сообщить(ДобавитьНули(«Н-004»,7));
получим 00Н-004
Вроде не то, что хотелось, а? 😉
+(3) А, вообще-то, еще и в дремучей 7.7 есть
А мне понравилось. Нестандартно, через формат. Когда я реализовывал функцию по добавлению нулей, я делал это через цикл. Мне кажется предложенный вариант по скорости будет работать быстрее чем в (4)
а вот другой вопрос, если элементы справочников имеют коды с префиксом 😉
(5) А оно тебе надо шибко быстрее? 😉
Если один — разницы не заметишь, если много — львиный кусок перезапись элементов сожрет, тоже не заметишь
еще бы дополнить чтоб параметр значение мог иметь тип «Число».
Типа того:
Если ТипЗнч(пЗначение) = Тип(«Число») тогда
Значение = Формат(Значние,»ЧГ=0″); // убираем пробелы в больших числах «1 234» -> «1234»
// За верность не отвечаю, под рукой 1Ски нет.
Иначе
Значение = СокрЛП(Значение);
КонецЕсли;
А добавть нули в начало можно еще и примерно так:
НужноеЗначение = Прав(«0000000000000000000000000000″ + Формат(НашеЗначение,»ЧГ=0»),СколькоЗнаковНужно);
В 4 тем хороша, что она дополняет чем угодно. Знаю одну базу, где в справочнике Номенклатура стоят ведущие пробелы. Манагерам так удобнее искать, как они сказали.
Параметр может быть строкой или числом, проверено — работает. Если есть префиксы, то это уже частный случай и дополнить функцию не сложно, тоже самое касается добавления нулей с правой стороны. Обработка показывает нестандартное решение, подобного я не видел, поэтому решил опубликовать.
(7) Скорость как раз важна! Из мелочей складывается общая производительность!
Автору плюс, через Формат однозначно интереснее чем через Цикл.
Нестадартно.
Сам делал через цикл или похоже на (9)
Согласна с 13
(0) Если уж говорить про КД2, то там есть экспортная функция:
// Приводит номер (код) к требуемой длине. При этом выделяется префикс
// и числовая часть номера, остальное пространство между префиксом и
// номером заполняется нулями.
// Функция может быть использована в обработчиках событий, программный код
// которых хранится в правила обмена данными. Вызывается методом Выполнить()
// Сообщение «Не обнаружено ссылок на функцию» при проверке конфигурации
// не является ошибкой проверки конфигурации
//
// Параметры:
// Стр — преобразовываемая строка;
// Длина — требуемая длина строки.
//
// Возвращаемое значение:
// Строка — код или номер, приведенная к требуемой длине.
//
Функция ПривестиНомерКДлине(Знач Стр, Длина, ДобавлятьНулиЕслиДлинаНеМеньшеТекущейДлиныНомера = Истина, Префикс = «») Экспорт
А почему бы не использовать Формат с ЧВН=1 (выводить лидирующие нули)?
Код:
Для Инд=1 По 15 Цикл
Сообщить(«Номер=»+Формат(Инд, «ЧЦ=2; ЧВН=1»));
КонецЦикла;
Выдаст: 01, 02, 03…
(9) zzerro, Пригодилось, спасибо!
Функция ДобавитьНулиВперед(Знач Значение, НужнаяДлинаЗначения) Экспорт
иначе Значение внутри Вашей функции меняется
(8) Мне было необходимо использовать перенос документов из Фолио в 1С, предложенную функцию лишь немного «под себя», добавив «Символы.НПП» , т.к. из фолио номера идут с пробелами «283 435».Вот так она выглядит:
Данная функция оказалась в таком варианте мне очень удобной (у нашей орг-ции нет префикса, а если бы и был, то «внедрить» его несложно было бы), спасибо!
(9) Помогло спасибо.
Если Значение длиннее НужнойДлинны… то на управляемых на тонком клиенте дописывает лишний ведущий ноль.
Нужна проверка
Показать
(9)
СтранаКод «36» Строка
Формат(СтранаКод,»ЧЦ=3; ЧВН=; ЧГ=0″) «36» Строка
Прав(«000″ + Формат(СтранаКод,»ЧГ=0»), 3) «036» Строка
и вааще, это как так бывает?
Вот мой вариант:
Показать