<?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='\
1С «любит» нас.
Класс «ОбработкаКартинок» вообще детский… две операции, поворот и обрезка лишнего…
Ни размера изображения не узнать, ни этот самый размер изменить…
Ну и хоть какой нить доступ к аналогу канвы не помешал бы.
Интересно, что их останавливает…
(1) Наверное, не хочет 1С превращать платформу в аналог Photoshop’а )
Из внешних утилит мне больше всего понравился портированный с линукса консольный ImageMagickhttps://ru.wikipedia.org/wiki/ImageMagick
правда несколько проблемный из-за совпадения имени основной утилиты convert.exe с одноименной консольной командой windows, то есть или переименовывать или запускать с полным путем
(2) да ей до фотошопа рости как до края галактики…
Похоже, вот тут опечатка:
Должно быть:
Небольшая оптимизация кода. А то на больших размерах тормозит…
Вместо:
Пиксель.ШиринаКолонки = 0.3;
Пиксель.ВысотаСтроки = 1;
которые выполняются в цикле лучше сделать перед циклом:
Канва = Новый ТабличныйДокумент;
всяОбласть = Канва.Область(1,1,ВысотаКанвы,ШиринаКанвы);
всяОбласть.ШиринаКолонки = 0.3;
всяОбласть.ВысотаСтроки = 1;
всяОбласть.АвтоВысотаСтроки = Ложь;
Ускорение процентов на 25.
Также лучше вместо:
ИмяПикселя = «R» + Формат(КоординатаПикселя_R, «ЧН=; ЧГ=») + «C» + Формат(КоординатаПикселя_C, «ЧН=; ЧГ=»);
Пиксель = Канва.Область(ИмяПикселя);
сделать:
Пиксель = Канва.Область(КоординатаПикселя_R,КоординатаПикселя_C,КоординатаПикселя_R,КоординатаПикселя_C);
Ускорение еще процентов на 10.
И еще интересное наблюдение, может кому пригодится…
Понадобилось мне вывести объект ГеографическаяСхема в ТабДок. Как раз воспользовался алгоритмом Автора. Но, выявилась проблема. При выполгении ГеографическаяСхема.ПолучитьКартинку() картинка получается с параметром БитНаПиксель = 32. А данный алгоритм корректно отображает картинку только если у нее БитНаПиксель = 24. Соответственно для обработки картинки из ГеоСхемы я применил следующий алгоритм:
_картинкаСхемы = ГеографическаяСхема.ПолучитьКартинку(100,100,ФорматКартинки.BMP);
ОбработкаКартинок = Новый ОбработкаКартинок;
_картинкаСхемы = ОбработкаКартинок.Повернуть(_картинкаСхемы,0); //так нужно чтобы сделать БитНаПиксель 24, а не 32 как получается изначально
_картинкаСхемы = _картинкаСхемы.Преобразовать(ФорматКартинки.BMP);
ИмяВременногоФайла = ПолучитьИмяВременногоФайла(«BMP»);
_картинкаСхемы.Записать(ИмяВременногоФайла);
В результате получается картинка нужного формата, и она корректно отображается на ТабДок.
(6) Давненько не заглядывал сюда. По поводу оптимизации спасибо конечно) согласен, так правильнее и быстрее. В свое оправдание хочу сказать, что обработка писалась исключительно! в образовательных целях и код скорее написан для читаемости неподготовленным человеком, нежели с целью реального использования.
А тот факт, что код получил реальное применение (хоть и с доработками) — это вдвойне приятно 😉
На счет глубины цвета — давно было, не помню наверняка, но по моему достаточно было просто переписать процедуру вывода. Сигнатуры, адреса ключевых структур и их длина для 3й версии вне зависимости от глубины цвета по моему не меняются. Но подробнее конечно по ссылке на Вики, там все достаточно подробно).
Как-то делал на assembler’e в детстве вьювер PCX-картинок — 250 с чем-то байт занимало (это была полноценная COM-утилита, запускаемая из командной строки и выводившая файл на экран, переключаясь в VESA-режим 800х600х24). На 1С-е подобные велосипеды бессмысленны от слова «совсем». Вот если бы Вы JPEG или PNG прочитали — это было бы интересно, ибо в них какая-никакая математика есть. Даже в PCX она есть, а в BMP нет ничего — это тупой битмап (карта битов).
(8) А зачем здесь эта информация? Или мы здесь *уями меряемся кто в детстве круче поделки делал? Статья в образовательных целях написана, вполне достаточна для представления о том, что представляет из себя работа с буфером двоичных данных и том как устроен bmp (хоть и не сложно, согласен)… Или когда только ленивый не выложил новую счет фактуру сюда — это нормально, а когда пусть и на не сложных примерах, пусть без особой практической пользы пишутся обзорные статьи про тот или иной функционал платформы — это не гут и лучше рефлексировать на свои столь же бесполезные поделки из детства?
(9) у меня все равно длиннее, если мериться. А если о функционале, то я и говорю, что примитивные примеры, конечно, не плохи сами по себе, но с PNG и JPEG было бы куда интереснее.
(10) Ну вот и напишите, а то с длинной набитой на котах в отчетах трудно меряться)))