Добавить лидирующие нули к произвольному значению




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?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='\

23 Comments

  1. Armando

    А в чем ценность, собственно ❓ ❓ ❓

    Reply
  2. WiseSnake

    Эти функции давно до Вас написаны, можно было использовать уже готовые. Так же написаны обработки и методики переноса между базами.

    Reply
  3. Abadonna

    Ну, прям сходу скажу, в чем порок этой функции (в том виде, как она есть).

    Берем ТиС или Комплексную 7.7, там учет многофирменный и есть такая примочка (как и в 8х) под названием префикс.

    На

    Сообщить(ДобавитьНули(«Н-004»,7));

    получим 00Н-004

    Вроде не то, что хотелось, а? 😉

    Reply
  4. Abadonna

    +(3) А, вообще-то, еще и в дремучей 7.7 есть

    Функция ДополнитьСтроку(Стр, Символ, Длина, Режим = 1)
    
    КолСимволов = Длина — СтрДлина(Стр);
    Если КолСимволов > 0  Тогда
    
    Reply
  5. WKBAPKA

    А мне понравилось. Нестандартно, через формат. Когда я реализовывал функцию по добавлению нулей, я делал это через цикл. Мне кажется предложенный вариант по скорости будет работать быстрее чем в (4)

    Reply
  6. WKBAPKA

    а вот другой вопрос, если элементы справочников имеют коды с префиксом 😉

    Reply
  7. Abadonna

    (5) А оно тебе надо шибко быстрее? 😉

    Если один — разницы не заметишь, если много — львиный кусок перезапись элементов сожрет, тоже не заметишь

    Reply
  8. yku

    еще бы дополнить чтоб параметр значение мог иметь тип «Число».

    Типа того:

    Если ТипЗнч(пЗначение) = Тип(«Число») тогда

    Значение = Формат(Значние,»ЧГ=0″); // убираем пробелы в больших числах «1 234» -> «1234»

    // За верность не отвечаю, под рукой 1Ски нет.

    Иначе

    Значение = СокрЛП(Значение);

    КонецЕсли;

    Reply
  9. zzerro

    А добавть нули в начало можно еще и примерно так:

    НужноеЗначение = Прав(«0000000000000000000000000000″ + Формат(НашеЗначение,»ЧГ=0»),СколькоЗнаковНужно);

    Reply
  10. Abadonna

    В 4 тем хороша, что она дополняет чем угодно. Знаю одну базу, где в справочнике Номенклатура стоят ведущие пробелы. Манагерам так удобнее искать, как они сказали.

    Reply
  11. ApocalypseNTC

    Параметр может быть строкой или числом, проверено — работает. Если есть префиксы, то это уже частный случай и дополнить функцию не сложно, тоже самое касается добавления нулей с правой стороны. Обработка показывает нестандартное решение, подобного я не видел, поэтому решил опубликовать.

    Reply
  12. Tokiy

    (7) Скорость как раз важна! Из мелочей складывается общая производительность!

    Автору плюс, через Формат однозначно интереснее чем через Цикл.

    Reply
  13. AnryMc

    Нестадартно.

    Сам делал через цикл или похоже на (9)

    Reply
  14. Leannet

    Согласна с 13

    Reply
  15. echo77

    (0) Если уж говорить про КД2, то там есть экспортная функция:

    // Приводит номер (код) к требуемой длине. При этом выделяется префикс

    // и числовая часть номера, остальное пространство между префиксом и

    // номером заполняется нулями.

    // Функция может быть использована в обработчиках событий, программный код

    // которых хранится в правила обмена данными. Вызывается методом Выполнить()

    // Сообщение «Не обнаружено ссылок на функцию» при проверке конфигурации

    // не является ошибкой проверки конфигурации

    //

    // Параметры:

    // Стр — преобразовываемая строка;

    // Длина — требуемая длина строки.

    //

    // Возвращаемое значение:

    // Строка — код или номер, приведенная к требуемой длине.

    //

    Функция ПривестиНомерКДлине(Знач Стр, Длина, ДобавлятьНулиЕслиДлинаНеМеньшеТекущейДлиныНомера = Истина, Префикс = «») Экспорт

    Reply
  16. q4a

    А почему бы не использовать Формат с ЧВН=1 (выводить лидирующие нули)?

    Код:

    Для Инд=1 По 15 Цикл

    Сообщить(«Номер=»+Формат(Инд, «ЧЦ=2; ЧВН=1»));

    КонецЦикла;

    Выдаст: 01, 02, 03…

    Reply
  17. brrart

    (9) zzerro, Пригодилось, спасибо!

    Reply
  18. 9322304@gmail.com

    Функция ДобавитьНулиВперед(Знач Значение, НужнаяДлинаЗначения) Экспорт

    иначе Значение внутри Вашей функции меняется

    Reply
  19. katavyjob

    (8) Мне было необходимо использовать перенос документов из Фолио в 1С, предложенную функцию лишь немного «под себя», добавив «Символы.НПП» , т.к. из фолио номера идут с пробелами «283 435».Вот так она выглядит:

    Функция ПолучитьКорректныйНомер(Значение, НужнаяДлинаЗначения)
    
    Значение = СтрЗаменить(Формат(Значение, «ЧГ=0″), Символы.НПП,»»);
    НадоНулей = НужнаяДлинаЗначения — СтрДлина(Значение);
    ВедущиеНули = Формат(0,»ЧЦ=»+НадоНулей+»;ЧН=; ЧВН=; ЧГ=0″);
    Возврат ВедущиеНули + Значение;
    
    КонецФункции

    Данная функция оказалась в таком варианте мне очень удобной (у нашей орг-ции нет префикса, а если бы и был, то «внедрить» его несложно было бы), спасибо!

    Reply
  20. edyardg

    (9) Помогло спасибо.

    Reply
  21. user723770

    Если Значение длиннее НужнойДлинны… то на управляемых на тонком клиенте дописывает лишний ведущий ноль.

    Нужна проверка

    Функция ДобавитьНули(Значение, НужнаяДлинаЗначения)
    
    Значение = СтрЗаменить(Формат(Значение, «ЧГ=»), » «, «»);
    НадоНулей = НужнаяДлинаЗначения — СтрДлина(Значение);
    Если НадоНулей > 0 Тогда
    ВедущиеНули = Формат(0,»ЧЦ=»+НадоНулей+»;ЧН=; ЧВН=; ЧГ=0″);
    Иначе
    ВедущиеНули=»»;
    КонецЕсли;
    Возврат ВедущиеНули + Значение;
    
    КонецФункции

    Показать

    Reply
  22. shoy

    (9)

    Прав(«0000000000000000000000000000″ + Формат(НашеЗначение,»ЧГ=0»),СколькоЗнаковНужно);

    СтранаКод «36» Строка

    Формат(СтранаКод,»ЧЦ=3; ЧВН=; ЧГ=0″) «36» Строка

    Прав(«000″ + Формат(СтранаКод,»ЧГ=0»), 3) «036» Строка

    и вааще, это как так бывает?

    Reply
  23. Eugen-S

    Вот мой вариант:

    Функция ДобавитьНули(Значение, НужнаяДлинаЗначения)
    
    Если Значение = 0 Тогда
    Возврат Лев(Формат(1, «ЧЦ=» + НужнаяДлинаЗначения + «;ЧГ=0; ЧВН=»), НужнаяДлинаЗначения — 1) + «0»;
    Иначе
    Возврат Формат(Значение, «ЧЦ=» + НужнаяДлинаЗначения + «;ЧГ=0; ЧВН=»);
    КонецЕсли;
    
    КонецФункции
    

    Показать

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *