Перевод слов в наименовании товаров




Принцип обмена данными из 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='\

14 Comments

  1. WKBAPKA

    В связи с новыми-старыми требованиями заполнения налоговой накладной с 01.04.2011, наименования товаров должны быть строго на украинском языке. Т.к. у многих компаний наименование товаров на русском языке, появилась необходимость их перевода, что эта обработка и позволяет сделать. Хотя, нужно заметить, что ее можно использовать и для других целей перевода!

    Перейти к публикации

    Reply
  2. detec

    Только что по прбовал парочку наших товаров — google translate довольно неплохо перебивает названия товаров с русского на украинский. Не рассматривали возможность использовнаия этого api, а не самопального словарика по типу translation memory?

    Reply
  3. WKBAPKA

    2(1): да нет, это же простая обработка для решения конкретной проблемы.. .кстати, нашел пару багов, завтра выложу… я первым делом кинулся в интернет, думал найду переводчик, который дает возможность передать строку и получить перевод, но не нашел… 🙁 гугл первым был, но как получить нормально перевод? через http? как получить обратный ответ ? разбирать результат запроса… вообщем решение задачи того не стоит…

    Reply
  4. detec

    (2) API нужно использовать. Ответ можно настроить в виде XML, а такое распарсить несложно.

    Reply
  5. cool.vlad4

    (1)(2)(3) Я через json обыкновенный парсю

    сначала регимся на gmail, получаем для api translate ключ

    и как-то так

    Процедура КнопкаВыполнитьНажатие(Кнопка)

    Сообщить(Перевести(«счет»));

    КонецПроцедуры

    Функция Перевести(Текст, ЯзыкИсточник = «ru», ЯзыкРезультат = «uk»)

    url = «https://www.googleapis.com/language/translate/v2?key=ЗдесьДолженБытьКлюч&q=» + urlencode(Текст) + «&source=» + ЯзыкИсточник + «&target=» + ЯзыкРезультат + «&callback=handleResponse»;

    HTTPСоединение = Новый COMОбъект(«WinHttp.WinHttpRequest.5.1»);

    HTTPСоединение.open(«GET», url, 0);

    HTTPСоединение.send();

    Возврат HTTPСоединение.responseText;

    КонецФункции

    Функция urlencode(Строка)

    ScrptCtrl = Новый COMОбъект(«MSScriptControl.ScriptControl»);

    ScrptCtrl.Language=»javascript»;

    Возврат ScrptCtrl.Run(«encodeURIComponent», Строка);

    КонецФункции

    Получаем

    handleResponse({

    «data»: {

    «translations»: [

    {

    «translatedText»: «рахунок»

    }

    ]

    }

    }

    );

    Что распарсить я думаю сможете сами

    Reply
  6. cool.vlad4

    Кошерно будет если от комов избавлятся, конечно, ScrptCtrl = «»; и т.д.

    Reply
  7. cool.vlad4

    Оказывается уже сделан http://infostart.ru/public/14872/ Правда .net здесь излишен

    Да и еще советую api посмотреть, там куча всего, просто навскидку набросал…

    Reply
  8. WKBAPKA

    анекдот прикольный… запомним… на самом деле нужно было решить простую задачу… просто переименовать большой массив информации… ради этого использовать API по переводу, писать свой парсинг, для того что бы перевести до десятка слов, как то сами понимаете — лень, да и платить никто не захочет… 😉

    Reply
  9. Damian

    Руками набивать словарик облом 🙁

    Можно добавить такую фичу:

    1. По кнопке «Найти слова» создается массив из неповторяющихся слов, которые присутствуют в наименованиях номенклатуры (за вычетом предлогов и аббревиатур) — это левая сторона табличной части обработки (на этом этапе можно также исключить слова, содержащие цифры и некиррилические символы — это, скорее всего, маркировки)

    2. По кнопке «Перевести слова» происходит подключение к Google, способом, указанным cool.vlad4.

    Кстати, в одном запросе можно передавать сразу несколько слов:

    url = «https://www.googleapis.com/language/translate/v2?key=ЗДЕСЬ_ДОЛЖЕН_БЫТЬ_КЛЮЧ&q=»+urlencode(ТЕКСТ_1)+»&q=»+urlencode(ТЕКСТ_2)+»&source=»+ЯзыкИсточник+»&target=»+ЯзыкРезультат+»&callback=handleResponse»;

    Результат будет примерно таким:

    handleResponse({
    «data»: {
    «translations»: [
    {
    «translatedText»: «вимикач»
    },
    {
    «translatedText»: «дверцята»
    }
    ]
    }
    }
    );

    Показать

    3. Парсим полученные от Google ответы и получаем правую сторону табличной части

    4. Подправляем ручками слова, которые Google перевел коряво, и

    5. Жмем кнопку «Выполнить перевод»

    PS. Таким макаром Google позволяет переводить максимум 100000 символов в сутки.

    PPS. А вот код

    ScrptCtrl = Новый COMОбъект(«MSScriptControl.ScriptControl»);

    думаю лучше вынести в ПриОткрытии(), а саму переменную ScrptCtrl сделать общей для всей формы, чтобы постоянно не создавать COM-объект

    PPPS. Спасибо, автор, натолкнул на мысль :). Если мне еще раз придется переводить номенклатуру, обязательно воспользуюсь этой обработкой с дополнениями, изложенными в комментариях (в прошлый раз выгружал наименования в файлы, руками скармливал эти файлы Гуглу, потом назад из файлов загружал в номенклатуру. И это при том, что в файле должно быть не более 10000 символов — получилось 68 файлов. Геморрой, однако 🙂

    Reply
  10. Damian
    Оказывается уже сделан http://infostart.ru/public/14872/ Правда .net здесь излишен

    Там компонента не переводит с русского на украинский 🙁

    Reply
  11. WKBAPKA

    обновил обработку, была допущена досадная небольшая ошибка… исправил…

    2(9): я уже писал, можно было бы конечно и гугл подключить… но мне клиент эту работу, по подключению гугла, не оплачивал, поэтому и смысла не было тратить время… все же распарсить файл не сложно, но и не так просто… с другой стороны, с помощью этой обработки можно не только переводить, а просто переименовывать не только номенклатуру, но и элементы любых справочников.

    Reply
  12. WKBAPKA

    вообще у меня была первая мысль, для решения этой задачи, найти клиент которому можно скормить слова из 1С и получить перевод… потом пытался найти словарь, который можно просто подгрузить к этой обработке… вот если бы найти словари в виде: переводимое слово | перевод слова

    вот это было бы шикарно 🙂

    Reply
  13. cool.vlad4

    (12) словарь это набор слов, есть гугл — ну и кэшировать в БД слова или куда еще. JSON парсить не просто, а очень просто — на ИС есть обработки BigB (честно их не проверял), но есть также огромное количество javascript framework-ов, которые предназначены для этого. На хабре есть даже сравнение их. Ну и прикрутить одну из них либо через браузерный движок, либо через msscript…кстати современные браузеры — ie8 например, уже имеет встроенные функции для работы с json, если не ошибаюсь.

    Reply
  14. WKBAPKA

    2(13): так и решение задачи простое… нужно было только перевести слова, а не фразы

    Reply

Leave a Comment

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