Функция Синоним для наименования




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

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

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

<?php // Полная загрузка сервисных книжек, создан 2024-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='\

16 Comments

  1. baton_pk

    Имя = СтрЗаменить(Имя, «СНДС», «_сНДС»);

    Читерство:

    Передача ВПФР

    Сумма СНДФЛ

    Reply
  2. nick-max

    (1) ну да, читерство

    но платформа сама не умеет отделять предлоги от аббревиатур (см. приложение)

    поэтому логично написать это как исключения. Можно, конечно, анализировать первый символ аббревиатуры на предмет его принадлежности к какой-нибудь заранее определенной группе предлогов («С», «В», «К» и др.), но ведь есть аббревиатуры, начинающиеся с этих букв («СЗВ», к примеру). Тогда получится БланкСЗВ Бланк с ЗВ.

    Полный перечень аббревиатур тоже не хочется заводить, потому что он в любом случае будет неполный.

    Reply
  3. DrAku1a

    Все она умеет, просто подход знать надо (см. приложение).

    Reply
  4. DrAku1a

    На правах рекламы: в обработке Отладчик запросов в главном модуле есть такая процедура:

    // Преобразовывает имя переменной к более читабельному виду, аналогично внутренним алгоритмам 1С
    // Например «ОбменСБазой» -> «Обмен с базой»
    Функция глозПредставлениеПеременной(знач ИмяПеременной) Экспорт
    Перем МаленькиеБуквы, Цифры, Буква, Ответ, сч, ПредыдущаяБуква, СледующаяБуква;
    ИмяПеременной = СокрЛП(ИмяПеременной);
    МаленькиеБуквы = «абвгдеёжзийклмнопрстуфхцчшщъыьэюя_»;
    Цифры=»0123456789.»;
    Буква = Лев(ИмяПеременной, 1);
    Ответ = «»+Буква;
    Для сч=2 По СтрДлина(ИмяПеременной) Цикл
    ПредыдущаяБуква = Буква;
    Буква = Сред(ИмяПеременной, сч, 1);
    Если (Найти(МаленькиеБуквы, Буква)=0) и (Найти(МаленькиеБуквы, ПредыдущаяБуква)>0) Тогда
    СледующаяБуква = Сред(ИмяПеременной, сч+1, 1);
    Если (СледующаяБуква<>»») и (Найти(МаленькиеБуквы, СледующаяБуква)>0) Тогда
    Буква = НРег(Буква);
    КонецЕсли;
    Буква = » «+Буква;
    ИначеЕсли (Найти(Цифры, Буква)>0) и (Найти(Цифры, ПредыдущаяБуква)=0) Тогда
    Буква = » «+Буква;
    КонецЕсли;
    Ответ = Ответ + Буква;
    КонецЦикла;
    Ответ = СтрЗаменить(Ответ, «_», » «);
    
    //этого пока нет в релизе — убирает все задвоенные пробелы, типа «Сумма___С_НДС» —> «Сумма   с НДС»
    Пока Найти(Ответ, »  «)>0 Цикл Ответ = СтрЗаменить(Ответ, »  «, » «) КонецЦикла;
    
    Возврат Ответ;
    КонецФункции
    

    Показать

    Reply
  5. v.l.

    (0)

    так как полноценного качественного варианта предложено так и не было

    некрасиво как-то. переформулируйте.

    Reply
  6. nick-max

    (5) Ок.

    Вот, сравнил результаты всех наших функций на деле:

    Reply
  7. v.l.

    (6) Вы не поняли. Цитата а-ля «я д’Артаньян».

    За проделанную работу плюс. Похвально.

    Reply
  8. ildarovich

    (6) А почему моей функции из комментариев к той же публикации нет?? Она самая короткая! И работает «по платформе»

    Функция Синонимайзер(Имя, Ответ = «», Стэйт = 7, б = «») Экспорт
    Для ё = 1 По СтрДлина(Имя) Цикл
    а = Сред(Имя, ё, 1);
    Стэйт = (НРег(а) <> а) * 4 + Цел(Стэйт / 2);
    Ответ = Ответ + ?(Стэйт = 2, НРег(б), ?(ё = 2, ВРег(б), б)) + ?(Стэйт = 4 ИЛИ Стэйт = 5, » «, «»);
    б = а
    КонецЦикла;
    Возврат Ответ + б
    КонецФункции

    Показать

    Добавьте к своей таблице число строк в записи функций.

    И еще с цифрами должны быть обязательно тесты.

    Reply
  9. nick-max

    (6) Хорошо, сейчас протестирую вашу функцию тоже

    Но я считаю, что длина функции в данном случае не играет большой роли

    Reply
  10. nick-max

    Чтобы преобразования с цифрами были тоже корректны, поменял строку

     Если Символ = НРег(Символ) Тогда 

    На

     Если Символ = НРег(Символ) И Найти(«1234567890», Символ) = 0 Тогда 

    Вот новые результаты сравнения функций:

    Reply
  11. v.l.

    У нас появился юный плагиатор, значит идея интересная.

    http://infostart.ru/public/196029/

    Reply
  12. nick-max

    (11) Ну, что делать)

    Если у нас уже есть четыре функции, то почему бы не быть еще пятой)

    Reply
  13. nick-max

    Кстати, функция от ildarovich из (8) судя по таблице и правда работает точно «по платформе». Разве что нижние подчеркивания не учитывает. Но встроенная платформенная функция тоже не идеал. Так уж повелось, что разработчики типовых решений (а за ними и все остальные) каждого новое слово в наименовании начинают с большой буквы, даже если это слово идет за аббревиатурой. Например,

    РегламентированныйОтчетНДССправкаОДебиторскойЗадолженности

    а не

    РегламентированныйОтчетНДСсправкаОдебиторскойЗадолженности

    А создатели платформы, наверное, думали, что в ходу будет именно второй вариант

    Так что просто слепо следовать платформе тоже не стоит

    Reply
  14. Starik

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

    Reply
  15. ZhokhovM

    (12)в вашей функции есть опечатка «Передача В ПФР» если судить по скрину

    Reply
  16. RomanKatPro

    Спасибо автору! Пригодилась.

    Reply

Leave a Comment

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