Обработка изображений номенклатуры в УТ 10.3




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

33 Comments

  1. gull22

    Беру себе на заметку

    Reply
  2. astronavt006

    Большое спасибо за разработку. Реально помогла)))

    Reply
  3. insurgut

    (2) astronavt006, рад, что пригодилась 😉

    Reply
  4. osd2006

    Спасибо огромное, удалось сжать картинки в базе на 127 мб.

    Reply
  5. insurgut

    Добавил возможность указания качества сжатия JPEG. Если исходная картинка в базе имеет более низкое качество и не происходит изменения ее размеров, то пересохраняться в более высоком качестве она не будет, т.к. фактически картинка останется та же, а размер ее вырастет.

    Так же добавлена возможность обработки всех изображений номенклатуры, которые добавлены в файлах номенклатуры.

    Reply
  6. Jelbock

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

    Reply
  7. insurgut

    (6) Jelbock, получится, эта возможность была добавлена 25.02.2016.

    Reply
  8. Jelbock

    (7) Спасибо)

    Reply
  9. S@V

    Спасибо большое за обработку ))) ужал на 200 метров базу )))

    Reply
  10. Voblhned

    ужал базу с 5,4 гигадо, до 980 метров, а теперь скажи на реальной базу стоит делать? Как она дружит с РИБом, если центральную ужать, то потом ужимать узлы или нет?

    Reply
  11. insurgut

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

    Reply
  12. Voblhned

    (11) Я примерно так и думал, проверил уже, так и есть, файл обмена стал огромным, по категориям разбил, хорошо перенеслось. Плюс тебе в карму.

    Reply
  13. NushaN

    insurgut, шикарно, спасибо! работает в лёт! Применима и для УПП 1.3

    2.61 Гб -> 900 Мб

    Reply
  14. user689645_gb

    (11)Добрый день!Подскажите,как зарегистрировать компоненту не на диске С ,а на диске D ,например.Пожалуйста,напишите,как должна выглядеть команда в командной строке.Заранее благодарю.

    Reply
  15. insurgut

    (14) что-то вроде C:Windowssystem32
    egsvr32.exe «D:моя_директорияUnicode Release.Win32GflAX.dll»

    Reply
  16. _n26__

    Добрый день!

    Спасибо большое за обработку. Очень помогла. Возник такой вопрос. А как-то можно узнать, что загружены новые изображения, и применить уменьшение именно к новым, а не заново все изображения элементов номенклатуры обрабатывать?

    Reply
  17. insurgut

    (16) стандартно такой возможности нет, самый простой вариант — это доработка конфигурации.

    В номенклатуре добавляем реквизит ДатаИзменения с типом Дата. В модуле при записи номенклатуры добавляем строку:

    ДатаИзменения = ТекущаяДата();

    В самой обработке добавляем на форму реквизит ДатаИзменения и в условии отбора прописать примерно так:

     Запрос = Новый Запрос(«ВЫБРАТЬ
    | Номенклатура.Ссылка
    |ИЗ
    | Справочник.Номенклатура КАК Номенклатура
    |ГДЕ
    | НЕ Номенклатура.ЭтоГруппа » + ?(ЗначениеЗаполнено(ДатаИзменения), «И Номенклатура.ДатаИзменения >= &ДатаИзменения», «») + »
    | И Номенклатура.Ссылка В ИЕРАРХИИ(&ГруппаНоменклатуры)»);
    Запрос.УстановитьПараметр(«ГруппаНоменклатуры», ГруппаНоменклатуры);
    Если ЗначениеЗаполнено(ДатаИзменения) Тогда
    Запрос.УстановитьПараметр(«ДатаИзменения», ДатаИзменения);
    КонецЕсли;

    Показать

    Reply
  18. _n26__

    (17) Спасибо за ответ!

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

    Reply
  19. insurgut

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

    Reply
  20. _n26__

    (19) Спасибо большое за совет! Так будет гораздо проще.

    Reply
  21. chukawata

    Подскажите, пожалуйста, каким методом GflAX.dll менять качество JPEG?

    Reply
  22. insurgut

    (21) не метод, свойство, которое заполняется перед сохранением:

    Картинка.SaveJPEGQuality = КачествоJPEG;

    где КачествоJPEG — число от 0 до 100

    Reply
  23. namazi74

    Спасибо за обработку. Очень пригодилась. Зачем вы выкладываете отдельно архив GflAX? Он и так гуглится.

    Reply
  24. insurgut

    (23) для тех, кому лень гуглить 🙂

    Reply
  25. namazi74

    (24) при сжатии изображений, изменяется цвет (оттенки). По какой причине это может происходить?

    Reply
  26. profisasha

    Возможно изменить DPI?

    Reply
  27. insurgut

    (26) у растрового изображения нет понятия DPI. В данном случае размер изображения можно отрегулировать изменением максимальной ширины/высоты в пикселях.

    Reply
  28. profisasha

    (27)то есть информация про dpi в свойствах файла бесполезна? У разработчика этой библиотеки на сайте есть конвертер «XnConvert» и в нем есть «изменение кол-ва точек/дюйм».

    Есть возможность удалять служебную информацию о свойствах файла и личной информации у картинки?

    Reply
  29. insurgut

    (28) возьмите любое изображение и сохраните его с разным значением DPI, но полностью идентичными настройками сжатия и сравните. DPI — это служебная информация, используемая при печати. На мониторе картинки с DPI 256 и 16 выглядеть будут одинаково и размер их будет одинаковым. В качестве примера (подтверждения) прикрепил 2 картинки.

    Reply
  30. profisasha

    (29)Да согласен, проверил уже.

    не подскажете этой библиотекой можно удалить служебную информацию о свойствах файла и личной информации у картинки?

    Reply
  31. insurgut

    (30) думаю данную информацию можно выяснить только в мануале.

    Reply
  32. profisasha

    (25) Как-то удалось решить эту проблему?

    Reply
  33. namazi74

    (32) только выставлением большего качества изображения. в остальном — не критично.

    Reply

Leave a Comment

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