<?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='\
Снова почитал комментыhttp://infostart.ru/projects/1747/?p=3#comm50
и решил написать свою компоненту…
Давно пишу такой же активикс, да все не допишу.
Василий, развивать дальше будешь?
Если нет, буду дописывать свой, если да, попробую твой. ;))
GDI+ действительно используешь или название прихватизировал просто?
Однозначно плюс.
(2) Реально его использую. В понятии .NET я сделал обертку для пространства имен System.Drawning;
Развивать в целом — да. Есть еще ряд того, чего я не успел сегодня сделать 🙂
за активикс-то вроде как плюс, но вопросик мучает — а на фига?
(3) Гуд.
С удовольствием потестю, и, с разрешения, попробую применить.
С хотелками и ошибками куда обращаться?
(4) Уж ты то в курсе, зачем он мне ;))
И первому активиксу ты меня научил.
(4) Ну к примеру можешь комменты почитать в (1) ссылка.
Что-то рисовать, графики какие-то.
(6) Да я не про актив-икс. Хоть убей не могу понять ЗАЧЕМ рисовать через одно место внутри 1С
(7) Опять таки не понимаю — ЗАЧЕМ рисовать
(8) Видно, иногда кому-то надо 🙂 Какое-нибудь визуально представление чего-нибудь :))))
(8) Если рисунок рисуется по данным 1С или наоборот, данные берутся из рисунка, то через то место получается как раз, когда рисуешь ВНЕ 1С.
(9) Скажу, зачем это мне.
Голубая мечта — конфа для производителей изделий ПВХ.
Рынок не тронут, работы хватит до конца жизни.
(11) Т.е ты хочешь сказать, что если я добавлю в Miracle рисование прямо но форме отчета — это будет зашибись? Там добавить — даже проще чем два байта остослать…
(12) Будет. И было уже у тебя.
Только рисование рисованию рознь.
(12) И то, что это активикс, тоже хорошо. Можно наделать примитивов на нескольких экземплярах АХ и складывать их мышей, как кубики.
Ну лана, рисуйте;) Мне бы ваши заботы :))))))))))
(15) И скорость отрисовки на уровне пикселей при использовании GDI+ должна быть высокой.
> Мне бы ваши заботы
Стареешь, блин ;))
На самом деле можно добавить и визуальное рисование, да оно не надо.
Как вариант — добавить шейпы, которые предварительно описаны и двигать их мышкой.
(17) было бы очень полезно
(18) Ага, что-то типа MS Visio получится :))
а одним только формексом обойтись низя?
(18) ну в каком то усеченном варианте да
(20) На сколько я знаю, 1С++ создает объект АктивХ, а формэкс пользуется ради «ПослеОткрытия».
Василь а можешь сделать компоненту которая просто таскает картинки по форме + пару полигонов, типа линии, прямоугольника и круга?
(22) Думаю, да.
общая идея: справочник картинок, оттуда выбираем ее и таскаем по форме
а потом сохраняем все это или в файл конфигураций,или в подчиненные справочники(в зависимости от необходимой реализации)
Сохраняем итоговую картинку? Или набор шейпов?
лучше второй вариант, готовая картинка как довесок
чтобы при повторном открытии можно было редактировать дальше
отличная идея!
(11)
Насчет голубой мечты в ПВХ:
с графикой в 1С8 прекрасно справляется VML (граф. язык встроенный в IE и заодно в соотв. объект 1С). На одной фирме (ООО «Промаокна» в Москве, если кому интересно) я так и реализовывал расчет изделий ПВХ. Всё элементарно и безо всяких доп. ухищрений типа активикс. Довольно небольшой код позволял интерактивно рисовать (визуально результат выглядел не хуже чем в специализированных ппрограммах) и обсчитывать как прямоугольные конструкции, так и арочные, треугольные и т.п. Единственно ОЧЕНЬ сильно пришлось вспоминать математику с её синусами и косинусами.
(0) Василий, (просто не успел качнуть еще, не пробовал) а для игр динамических как, пойдет? Я ж думаю когда-нибудь сделать прохождение лабиринтов с трехмерным видом изнутри ( я про этоhttp://infostart.ru/projects/3474/ ). Просто эта http://infostart.ru/projects/1747/ мне немного не подошла, т.к. обновлять целиком надо файл, а потом его заново отображать, или я не доразобрался с ней… Как думаешь?
Да! и чтобы еще к графическому примитиву можно было привязывать некий «описатель» 1Совский — типа «Расшифровки» — а туда уже можно запихнуть какой-хочешь 1Совский объект — хоть СЗ, хоть ТЗ, хоть описательную строку… — вот такая у мну хотелка
(29) Возможно. Просто закрашиваешь старое цветом фона и все.
А трехмерный вид изнутри это как? 🙂
(30) Это уже не к этой компоненте.
БОЛЬШОЙ +. Василий, будете в Вильнюсе, милости просим в гости — с меня пиво, сам хотел писать подобное
(31) > А трехмерный вид изнутри это как? 🙂
Ну типа как в 3D-бродилках (тот же Doom), только попроще, без теней и крутой графики;-) В общем, не спрашивай лучше, сам боюсь;)
(33) Это лучше мой 3Д склад использовать :))
(32) Ну как буду в Вильнюсе — напомню 😉
Рисовать действительно бывает нужно, поэтому +.
(11)(28) Я тоже сталкивался с этой проблемой в ПВХ (производство окон), тогда я пошел через использование PHP. Программно по заданным пользователям установкам генерился скрипт, выполнялся и в 1с возвращалась картинка. Жалко у меня тогда не было этой компоненты, жизнь была бы легче.
(36) vladsol, а ты бы поиском по сайту воспользовался. У меня уж год подобная штука лежит (правда не моя), только у Душелова она выполнена в виде ActiveX-контрола, что конечно же удобно, но до функционала Gflax не дотягивает. Конечно Дужелов и не будет дотягивать контрол до gflax, он просто скорее всего сделает тот функционал которого там нету — например векторные сплайны, анимацию, градиенты. Ну а в случае с ПВХ хватило бы и Gflax, по крайней мере с PHP бы не извращался.
Душелов, даёшь мощную векторную графику!!! 🙂
(28)(37) Насчет рисования изделий ПВХ.
На самом деле особая графическая мощь тут не нужна.
При массовом производстве 99% изделий состоят из простых элементов — рама, створки, импосты.
Я пошел таким путем.
При использовании моего активикса рисование створки, например, выглядит примерно так: ЗакуячитьСтворкуЛевуюПоворотноОткидную(Ширина,Высота). Вся математика зашита в активиксе.
На форме при помощи FormEx динамически создается нужное число контейнеров для активикса. Каждый экземпляр это ПВХ-примитив (рама, створка и т.д.). И из них собирается изделие.
Изменение размеров/положения (опять-таки при помощи FormEx) делается мышей (или вводом размера).
На экране изделие отображается с пропорциональными размерами, что важно для понимания, как будет выглядеть готовое изделие.
Таким образом, в документе я храню только вид и координаты ПВХ-примитивов.
При открытии формы документа, картинка рисуется заново.
Чем не векторная графика? ;))
Так что использовать компоненту Василия пока погожу.
Все равно большое спасибо ему, натолкнул на некоторые мысли :))
(38) в том то и дело, что считать нестандарт ПВХ (арки, трапеции и т.п.) на примитивах никак нельзя. И они точно составляют больше 1% при массовом производстве (если конечно не сидеть на заказах новостроек) — заказчик ныне пошёл привиредливый. Так что векторная графика в 1С нужна и автор пусть дальше развивает контрол.
(39) Конечно, пусть развивает.
А я буду развивать свой :))
Все больше склоняюсь к мысли, что нестандарт можно посчитать и на бумажке ;))
Не стоит овчинка выделки.
(40) ну смотря какого размера фирма и требования к персоналу расчитывающему изделия. На той фирме где я работал изделия расчитывали менеджеры (не конструктора) и результат расчета они должны были сказать сразу вне зависимости от сложности. Научить даже одного менеджера правильно расчитать нестандарт — утопия. А их на фирме было 50 человек в офисе + куча в регионах и на точках по всей Москве.
Не могу заставить работать из под 1С 7.7.
Код такой
Перем Кисти_;
//***************************************************************
Процедура ПослеОткрытия()
Кисти_ = СоздатьОбъект(«АктивИкс»);
Кисти_.УстановитьАтрибут(Форма, «АктХ»);
Кисти_.СоздатьЭУ(«Душелов.GDI»);
Кисти_.УстановитьФокус();
КонецПроцедуры
На этом этапе все нормально, но потом на форме пытаюсь сделать
Кисти_.НоваяКартинка(400,200);
выдает ошибку Поле агрегатного объекта не обнаружено (НоваяКартинка).
Почему так?
(42) Кисти_.Объект.НоваяКартинка(400,200);
Спасибо. Заработало.
(39)http://infostart.ru/projects/4076/
Уверен, что хорошая разработка. Плюс.
Отличная разработка! Просто жесть!!! Автору большой плюс и признание!
Но к сожаленью так и не смог ничего нарисовать в семёрке, так как нет реального живого примера например элементарной обработки или отчётика, где реализован весь етот шедевр!!!
У меня к примеру(42) выдаёт ошибку: «Неудачная попытка создания объекта (АктивИкс)»
Напишите пожалуйста например обрабоку с кодом построения точки, линии на форме!
А вообще огромное человеческое спасибо!!!
(47) Установите 1с++ для начала, раз ругается на объект АктивИкс…
(48) Спасибо ЁПРСТ! Забыл ЗагрузитьВнешнююКомпоненту, но после загрузки проблема не исчезла снова новая ошибка: «Неверный идентификатор атрибута»
Ребята кто-нить может выложить пример.ert, чтоб было наглядно понятно как и что? Заранее огромное пасибо!!!
Добавил пример работы с компонентой из 7.7
(50)Пример — суперсила!!! Большое пребольшое спасибо!!!
Знатная штука! С разрешения автора попользуюсь немного. Вот если бы кто-нибуть подсказал как такое написать :)) с добавлением Drag&Drop… или может ссылочку какую-нибуть полезную кинул… то с меня пиво!
(52) А зачем Drag&Drop ?
(53) Надо пользователюкартинки по форме перетаскивать, а мне — отслеживать, и при масштабировании, смене ориентации страницы и т.д. учитывать. А как пока не пойму…
(54) Данная компонента исключительно для программного рисования. Никаких юзерабилити действий.
Для «перетаскиваний» есть соседняя разработка.
(55) «[VectorDrawing] — Векторная графика в 1С»? Смотрел, можно было бы использовать, есть перетаскивание, можно сделать масштабирование, группировку — все замечательно, но пункт контекстного меню «О компоненте» не дает мне возможности ее использовать в своих разработках. Что, по моему, вполне естественно. По этому хотелось бы все-таки самому попробовать разобраться и написать собственную ВК. Кроме того, все-таки хочеться самому чему-нибуть научиться, а не тупо таскать с ИС чужие разработки.
(56) Тогда велкомhttp://infostart.ru/community/groups/8/forum/7300/
(57) Сэнкс, а то я уже полез за покрывшимся пылью диском с Delphi. Хотя, как говорится, давно не брал я в руки шашку, так что или вспонинать Delphi или изучать .net — одно и тоже :))
Счас ковыряюсь с Душелов.GDI на восьмерке,
запускаю вот такой фрагмент кода в цикле
Точки = Рис.СоздатьМассивТочек(4);
Рис.УстановитьТочкуВМассив(Точки, 0, Рис.СоздатьТочку(X+40, 10));
Рис.УстановитьТочкуВМассив(Точки, 1, Рис.СоздатьТочку(X+40, 40));
Рис.УстановитьТочкуВМассив(Точки, 2, Рис.СоздатьТочку(X+30, 30));
Рис.УстановитьТочкуВМассив(Точки, 3, Рис.СоздатьТочку(X+30, 20));
Рис.ЗаполнитьМногоугольник(Кисть, Точки);
Рис.РисоватьМногоугольник(ЧерноеПеро, Точки);
тут в цикле изменяется только «X». В результате появляется ругатня на функцию «ЗаполнитьМногоугольник», типо исключительная ситуация, Parameter is not valid.
Такое впечатление что функция ЗаполнитьМногоугольник может вызываться ограниченное количество раз
причем если вызываю этот цикл в процедуре «ПриОткрытии» документа, то вс нормально, если вызываю из обработчика нажатия кнопки в форме того же документа, то на определенном номере фигуры выпрыгивает ошибка.
(60) Может передаешь несуществующие координаты?
Сделай обработку с примером, где эта ошибка показывается….
Сейчас сделаю, куда выложить?… я недавно на этом сайте.
(62)http://narod.ru/disk/all
ну вот обработочка
Нажми на кнопку «выполнить» 2 раза и получишь результат.
Кроме того если попробуешь открыть эту обработку второй раз не закрывая 1С то глюк увидишь после первого нажатия на кнопку «Выполнить»
Изменено:
— СоздатьКисть(r, g, b); //создает объект типа «Кисть» заданного цвета
//r, g, b — числа
Добавлено:
— ОчиститьПамять();
(64) Скачивай обновление.
В своей обработке в процедуре рисования квадратиков добавь очистку памяти
Рис = ЭлементыФормы.GDI;
Рис.ОчиститьПамять();
Рис.НоваяКартинка(700, 700);
Ну и перепиши создание кистей.
Вроде заработало после того как поменял СоздатьКисть(r, g, b); даже Рис.ОчиститьПамять(); не использовал.
(67) Если часто будете пользоваться перерисовкой, то память стоит очищать, дабы в 1С-ке не было утечки памяти.
Кстати функция ОчиститьПамять() не работает.
{Форма.Форма1(70)}: Ошибка при вызове метода контекста (ОчиститьПамять): Произошла исключительная ситуация (Dushelov.GDI): Method not found: ‘System.GCNotificationStatus System.GC.WaitForFullGCComplete()’.
Рис.ОчиститьПамять();
по причине:
Произошла исключительная ситуация (Dushelov.GDI): Method not found: ‘System.GCNotificationStatus System.GC.WaitForFullGCComplete()’.
а нельзя ли воткнуть процесс очистки памяти поместить в функцию НоваяКартинка(), а то запаришся каждому объяснять для чего она нужна.
(70) При новой картинке она не нужна.
Не смотрел ошибку (69) ?
(72) У меня ее нет.
Поставь себе SP1 для фреймворка, видимо этот метод был добавлен позже.
Вот такой фреймворк пойдет?
просто у тебя в ридмишке дана ссылка на фреймворк без всяких сервиспаков, я его и ставил.
Спрашиваю прежде чем качать, потму что инет у меня не очень анлим и качать все подряд не очень охота.
(72) Обновил, пробуй.
Добавил еще сглаживание.
Добавлены события:
— ПриНажатииКнопкиМышки(Кнопка, X, Y);
— ПриДвиженииМышкой(Кнопка, X, Y);
— ПриОтжатииКнопкиМышки(Кнопка, X, Y);
— ПриШелчкеМышкой(Кнопка, X, Y);
— ПриДвойномШелчкеМышкой(Кнопка, X, Y);
Вот про эти как раз события я и хотел намекнуть. Они как раз нужны в задаче которую я решаю. Спасибо.
Новый косяк
Рис = ЭлементыФормы.GDI;
ЦветФона=Рис.ПолучитьЦвет(255, 251, 240);
Рис.НоваяКартинка(700, 700);
Рис.Очистить(ЦветФона);
Получаем:
{Документ.XXX.Форма.ФормаДокумента(130)}: Метод объекта не обнаружен (ПолучитьЦвет)
ЦветФона=Рис.ПолучитьЦвет(255, 251, 240);
(78) Забираю свои слова обратно ошибки нет, просто объект ActiveX надо было удалить и вставить новый.
События
— ПриНажатииКнопкиМышки(Кнопка, X, Y);
— ПриДвиженииМышкой(Кнопка, X, Y);
— ПриОтжатииКнопкиМышки(Кнопка, X, Y);
— ПриШелчкеМышкой(Кнопка, X, Y);
— ПриДвойномШелчкеМышкой(Кнопка, X, Y);
не работают даже в твоем примере!!!
но Рис.ОчиститьПамять(); — заработала на новой длл-ке без обновлений фреймворка
(80) Обнови до SP1 и события будут ловиться. Да и проверь, подписаны ли эти события у компоненты (после того, как удалил/добавил) они у тебя, скорее всего пустые, не подписанные.
А эта компонента позволяет програмно узнать текущий цвет какой либо определенной точки рисунка?
Подскажите, как в 7.7 использовать события ПриНажатииКнопкиМышки ?
(83)
(84) Про 1С++ это понятно,я имел в виду события от этой компоненты. Или они для чего предназначены?
Ну вот в 1С++ подписываться на эти события и их обрабатывать.
Можно ли в катинку на форме скопировать картину из памяти? Обе картинки объекты типа Душелов.GDI.
Процедура КнопкаВыполнитьНажатие(Кнопка)
КрасноеПеро = Рис.СоздатьПеро(Рис.ПолучитьЦвет(255, 0, 0), 1);
Рис.РисоватьЛинию(КрасноеПеро,1, 1, 100, 100);
КонецПроцедуры
линия не выводится на форму, пока не свернешь/развернешь окно. Как устроить обновление изображения или что-то в этом роде?
КрасноеПеро = Рис.СоздатьПеро(Рис.ПолучитьЦвет(255, 0, 0), 1);
Рис.РисоватьЛинию(КрасноеПеро,1, 1, 100, 100);
КонецПроцедуры
линия не выводится на форму, пока не свернешь/развернешь окно. Как устроить обновление изображения или что-то в этом роде?
Отвечаю сам себе:
Рис.Refresh();
Уважаемый Dushelov. Control на 5 баллов. То, что нужно, спасибо. Только хотелось бы более подробного описания функций. Трудновато до всего доходить методом тыка…
Подскажите, как загрузить картинку из памяти, IPicture.
Эта ветка жива?
А как нарисвать точку? Специальной процедуры нет, а при рисовании линии с совпадающим концом и началом не рисуется ничего.
Под Windows 7 не фурычит.
Видимо из-за встроенного там NET 3.5 ((
При установке не находит ngen
Есть лекарство?
Поддерживаю предыдущего оратора. Какие перспективы работы компоненты по Win7
А что на счет полос прокрутки? Нарисовал большой прямоугольник, он выходит за рамки элемента, но просмотреть все нет возможности.
(95) Основная идея — программно рисовать. Отображать можно в стандартном 1С-овском поле картинки
да вот отображать надо именно в Вашей компоненте. Задача в следующем: нарисовать таблицу (большую или нет зависит от пользователя), в некоторых ячейках нарисовать цветные квадратики, некоторые ячейки соединить дугами, и дат пользователю возможность перемещать эти квадратики. А для перемещения надо отслеживать события нажатие кнопки мыши, движение курсора и отжатие кнопки. Поэтому рисовать картинку, сохранять в файл и загружать в поле картинки не подходит.
Нашёл выход: на форме разместить панель, отключить свойство «использовать только видимую область», на ней разместить актив-икс и у него указать ширину и высоту большие, тогда полосы прокрутки будут у панели и много места для рисования! Спасибо за компоненту!
(3) Пространство имен System.Drawning; этотут ?
А как заставить их работать в 1С?