<?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='\
В связи с новыми-старыми требованиями заполнения налоговой накладной с 01.04.2011, наименования товаров должны быть строго на украинском языке. Т.к. у многих компаний наименование товаров на русском языке, появилась необходимость их перевода, что эта обработка и позволяет сделать. Хотя, нужно заметить, что ее можно использовать и для других целей перевода!
Перейти к публикации
Только что по прбовал парочку наших товаров — google translate довольно неплохо перебивает названия товаров с русского на украинский. Не рассматривали возможность использовнаия этого api, а не самопального словарика по типу translation memory?
2(1): да нет, это же простая обработка для решения конкретной проблемы.. .кстати, нашел пару багов, завтра выложу… я первым делом кинулся в интернет, думал найду переводчик, который дает возможность передать строку и получить перевод, но не нашел… 🙁 гугл первым был, но как получить нормально перевод? через http? как получить обратный ответ ? разбирать результат запроса… вообщем решение задачи того не стоит…
(2) API нужно использовать. Ответ можно настроить в виде XML, а такое распарсить несложно.
(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»: «рахунок»
}
]
}
}
);
Что распарсить я думаю сможете сами
Кошерно будет если от комов избавлятся, конечно, ScrptCtrl = «»; и т.д.
Оказывается уже сделанhttp://infostart.ru/public/14872/ Правда .net здесь излишен
Да и еще советую api посмотреть, там куча всего, просто навскидку набросал…
анекдот прикольный… запомним… на самом деле нужно было решить простую задачу… просто переименовать большой массив информации… ради этого использовать API по переводу, писать свой парсинг, для того что бы перевести до десятка слов, как то сами понимаете — лень, да и платить никто не захочет… 😉
Руками набивать словарик облом 🙁
Можно добавить такую фичу:
1. По кнопке «Найти слова» создается массив из неповторяющихся слов, которые присутствуют в наименованиях номенклатуры (за вычетом предлогов и аббревиатур) — это левая сторона табличной части обработки (на этом этапе можно также исключить слова, содержащие цифры и некиррилические символы — это, скорее всего, маркировки)
2. По кнопке «Перевести слова» происходит подключение к Google, способом, указаннымcool.vlad4 .
Кстати, в одном запросе можно передавать сразу несколько слов:
Результат будет примерно таким:
Показать
3. Парсим полученные от Google ответы и получаем правую сторону табличной части
4. Подправляем ручками слова, которые Google перевел коряво, и
5. Жмем кнопку «Выполнить перевод»
PS. Таким макаром Google позволяет переводить максимум 100000 символов в сутки.
PPS. А вот код
думаю лучше вынести в ПриОткрытии(), а саму переменную ScrptCtrl сделать общей для всей формы, чтобы постоянно не создавать COM-объект
PPPS. Спасибо, автор, натолкнул на мысль :). Если мне еще раз придется переводить номенклатуру, обязательно воспользуюсь этой обработкой с дополнениями, изложенными в комментариях (в прошлый раз выгружал наименования в файлы, руками скармливал эти файлы Гуглу, потом назад из файлов загружал в номенклатуру. И это при том, что в файле должно быть не более 10000 символов — получилось 68 файлов. Геморрой, однако 🙂
Там компонента не переводит с русского на украинский 🙁
обновил обработку, была допущена досадная небольшая ошибка… исправил…
2(9): я уже писал, можно было бы конечно и гугл подключить… но мне клиент эту работу, по подключению гугла, не оплачивал, поэтому и смысла не было тратить время… все же распарсить файл не сложно, но и не так просто… с другой стороны, с помощью этой обработки можно не только переводить, а просто переименовывать не только номенклатуру, но и элементы любых справочников.
вообще у меня была первая мысль, для решения этой задачи, найти клиент которому можно скормить слова из 1С и получить перевод… потом пытался найти словарь, который можно просто подгрузить к этой обработке… вот если бы найти словари в виде: переводимое слово | перевод слова
вот это было бы шикарно 🙂
(12) словарь это набор слов, есть гугл — ну и кэшировать в БД слова или куда еще. JSON парсить не просто, а очень просто — на ИС есть обработки BigB (честно их не проверял), но есть также огромное количество javascript framework-ов, которые предназначены для этого. На хабре есть даже сравнение их. Ну и прикрутить одну из них либо через браузерный движок, либо через msscript…кстати современные браузеры — ie8 например, уже имеет встроенные функции для работы с json, если не ошибаюсь.
2(13): так и решение задачи простое… нужно было только перевести слова, а не фразы