<?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='\
Просто и понятно, для новичков самое то
Вообще-то для таких вещей в языке запросов предусмотрено «ВошедшиеВЗапрос»
(2) Спасибо тоже интересное решение.
(3) А можно пример ? (распечатать ТЗ на форме — не имея при этом запроса)
В чем вопрос-то? Как сформировать ТЗ без запроса? Или как распечатать ТЗ, где все колонки одинаковые, кроме первой и последней?
(5) Вопрос и не стоял.
http://infostart.ru/forum/messages/forum9/topic10583/message85923/#message85923
Написано пример :
(в частности вот для этой темы )
ТЗ как на (Рис. 5756 . Внеший вид)
распечатать как в (Рис. 5758 . «горизонтальный» вид таблицы печати)
Без запроса
(6) То есть постановка задачи: сформировать таблицу значений, не пользуясь запросом.
Слушай Ёпрста в упомянутом форуме.
+7
3.Чтоб поглядеть, есть ли нужная колонка в ТЗ — не обязательно перебирать ВСЕ колонки в ТЗ
Вылысыпыдысты 😉 ? есть более продвинутая разработка… — позволяет и группировать, и расшифровывать и еще чуть-чуть… (типа как в (2)):
http://infostart.ru/projects/942/
http://infostart.ru/projects/522/
пример использования:
(7) Я его и слушаю. Я же ему не перечу. У него свой вариант — у меня свой.
«есть ли нужная колонка в ТЗ — не обязательно перебирать ВСЕ колонки в ТЗ»
это уже третий раз говорят мне, а кто сможеть показать пример (честно научите, только без ВК)
(9) Спасибо. Хороший пример. Буду знать
(но мой же пример по другому принципу работает и я думаю имеет право на жизнь)
(10) Ну на..учись:
Если ТЗ.ВидимостьКолонки(«ХренЗнаетКакойИдентификатор»,1)=-1 Тогда
Сообщить(«Нету в тз такой колонки»);
Иначе
Сообщить(«присутствует однако»);
КонецЕсли;
🙂
(12) Спасибо. Работает.
Вообще-то у автора подтасовка и тырение комплектующих 😉 ?
№п/п 7 — Упаковка — откуда там 13 взялось, если при суммировании всего 9 получается?
(14) нет там такого )))
(столбцы закреплены ТП.Опции(0,0,4,3); и на скриншот не попали , а то длинный бы был)
(15) эх! промахнулся…. 😉
(12) если на данном примере сравнить мой и твой вариант
то мой — 0,0312
с твоим вариантом — 0,0402
НО ! если добавить колонок в задание (до 256)
то мой — 1,467
с твоим вариантом — 0,586
Спасибо за вариант — предложенный Вами.
Прошу прощения!!!
строка 50
Пока ТекКолонка<стр-1 Цикл
должна выглядеть
Пока ТекКолонка<стр Цикл
думаю пригодится
(18) продолжу как в (17)
если на данном примере сравнить мой, Ёпрст и твой вариант
мой — 0,0312
Ёпрст — 0,0402
nikakoy — 0,02398
НО ! если добавить колонок в задание (до 256)
//нет времени попробовать
// в (18) нужно две строки закоментировать
// //ном=СоздатьОбъект(«СписокЗначений»);
// //мод=СоздатьОбъект(«СписокЗначений»);
// так они уже есть на форме
у меня на форме только тз…. и весь код при открытии нужен для автоматического заполнения тз….
Смысл в правильной(требуемой) сортировке и последующем создании необходимого числа свернутых табличек…..
(22) Спасибо. Добавил ваши варианты в шапку.
(если против — уберу)
Ё… вариант №2 неправильный… да еще и медленный..
Вариант №1 — аналогично — не верный!!!
Вот только 3-ий вариант рабочий..
На вот , тебе еще один вариант для коллекции…
http://webfile.ru/3822078
И свой — исправляй..
Одно непонятно, те хто плюсует.. вообще смотрит, что ЭТО ?…
Ёпрст 70
nikakoy 79
а выигрыш на
«исхТЗ.Выгрузить(врТЗ);
исхТЗ.Выгрузить(ТЗСлуж);»
из таблицы — переменной
по сравнению с
«тз.Выгрузить(ТзМод);
тз.Выгрузить(ТзНом);»
из таблицы формы….
непринципиально….
(29) увеличь количество строк до 10 тысяч и замерь…
+30 там есть кнопка заполнить для этого с указанием количества строк..
+31 и выигрыш там не в том вообще… У тебя НайтиЗначение… у меня — этого нет вообще.
На 10 000 строк выигрыш по скорости ~ 2 раза..ужо.
лимон заполняется!!! 😀
а по идее не должно…
У тебя вложенный цикл по таблице моделей, у меня поиск по ней же…
мой должен быстрее работать… счас посмотрим…
Другой разницы не увидел!!! ;-))
(35) НайтиЗначение- тот же перебор…нефига не быстрый метод..
Наверно заблуждался…. еще заполняется….. проверим!!!!
Где-то здесь виде ВК по индексированным таблицам, но у нас вечная контра с сисадмином… :-((… и лишние ВК ему как нож по всем частям!!!!
(36) в (27) что ты выложил посмотрела. Спасибо за объединенный тест.
Только вот чуть-чуть ты там смухлевал )))
в мой процедуре -ты забыл инициализировать переменную НАЧАЛО
Начало = _GetPerformanceCounter(); И поэтому у меня там дикий результат 🙂
Спасибо за активное участие , я в (17) тебе сказала что твой метод после 36 столбцов быстрее будет работать.
Тема называется «Пример как развернуть таблицу печати в горизонтальном виде » а не как быстрее это сделать.
Есть четвертый метод — вечером поставаюсь добавить.
(38) Ну чего за гон ?
В каком месте смухлевал ?
Всё там у всех одинаково..
Только у вас — не рабочий код вообще, да еще и самый медленный…
+39
Процедура СССР()
Перем ЗагКол;
Начало = _GetPerformanceCounter(); // Это что по вашему ?
(37) На лимоне может не хватить памяти.. 100 тыщ более чем достаточно, хотя и 10-ки хватит… для убедительности 🙂
нашли повод!!! =-О
почему у Ёпрста быстрее?????
(42) Оптимальнее алгоритм и привет..
Нет лишнего поиска.
(41) 🙂 так там (в 27) твой вариант «ТЗВрем.ВидимостьКолонки(СокрЛП(ТекМод),1)=-1 »
я подругому предлага
//это не мой код
Процедура СССР()
Перем ЗагКол;
Начало = _GetPerformanceCounter();
Если ТЗ.КоличествоСтрок()=0 Тогда
Сообщить(«Таблица комплектации пустая — нет данных для печатит»);
Иначе
//создадим ТЗ с одной колонкой ВЕРТИКАЛЬНОЙ
ТЗврем=СоздатьОбъект(«ТаблицаЗначений»);
ТЗВрем.НоваяКолонка(«Номенклатура»);
//создадим список — для хранения колонок
Сверток=СоздатьОбъект(«СписокЗначений»);
КолКол=1;
ТЗ.ВыбратьСтроки();
Пока ТЗ.ПолучитьСтроку()=1 Цикл
ТекМод=ТЗ.Модель;
НСтолба=0;
Счет=0;
//проверим если колонка с таким заголовком
Если ТЗВрем.ВидимостьКолонки(СокрЛП(ТекМод),1)=-1 Тогда
КолКол=КолКол+1; //увеличиваем счетчик
Сверток.ДобавитьЗначение(КолКол,ТекМод); //и добавим значение в список
ТЗврем.НоваяКолонка(,»Число»,10,0,СокрЛП(ТекМод),,,); //новая колонка с заголовком новой модели
НСтолба=КолКол;
КонецЕсли;
( и в шапке все варианты рабочие — разный подход, разная скорость у пользователя должен быть выбор всегда) Тем и прекрасно программирование в 1С — что почти всегда задачу можно решить разными способами и чем больше ты способов знаешь тем лучше. Разве я не права ?
+43 а у автора, самый медленный — создание всей простыни + её заполнение..
да к томуже еще и не рабочий, пока…
(44) Рабочие ???
Мот на результат сначала посмотришь?
Т.е. перебор быстрее??? :-$
Это как понимать?
(47) смотря как использовать.
И вообще тема родилась на основании вопроса в форуме.
Человек просил помочь , я помогла.
Тебя задело , что я влезла?
Я еще там сказала ЁПРСТ — ты не заменимый и самый лучший.
Сказала — спасибо за конструктивный диалог и примеры.
на твои высказывания:
«Это — никогда не заработает.»
«Да ну ? И — БОЛТ! »
я доказала , правоту СВОЕГО высказывания и показала на примере.
Помогла человеку — Правильно оформила тему (описание, скриншоты, обработка) заметь многие даже сказали спасибо , ибо им пригодилось.
но ответ я так думаю в (28)
так мелочно , в чужой теме — орать на всю сеть
«Одно непонятно, те хто плюсует.. вообще смотрит, что ЭТО ?…»
Поставь мне минус (меня это уже дАААвно мало колышит, но хоть тебе приятно будет) — Но что подумают ЛЮДИ ?
Хочешь выложи в новой ветке свой вариант, я этот удалю — нет проблем 🙂
Жизнь прекрасна тем , что Ты в ней Есть.
(50) На (48) есть ответ ?
(48) это вопрос сам себе задаешь ?
ты вызываешь процедуру из своей разработки (в которой все перемашал вкучу)
и спрашиваешь почему так получилось (хочешь угадаю на какую кнопку ты нажимал ?)
nikakoy 3822
Ёпрст 3811
на 200000 строк…
Это после переделки
Процедура nikakoy()
Начало = _GetPerformanceCounter();
ТзМод=СоздатьОбъект(«ТаблицаЗначений»);
ТзНом=СоздатьОбъект(«ТаблицаЗначений»);
ТзВрем=СоздатьОбъект(«ТаблицаЗначений»);
тз.Выгрузить(ТзВрем);
ТзВрем.Свернуть(«Номенклатура,Модель»,»Колво»);
ТзВрем.Выгрузить(ТзНом);
ТзНом.Свернуть(«Номенклатура»,»Колво»);
ТзВрем.Выгрузить(ТзМод);
ТзМод.Свернуть(«Модель»,»Колво»);
ТзВрем.Сортировать(«Номенклатура,Модель»);
ТзМод.Сортировать(«Модель»);
ТП=СоздатьОбъект(«Таблица»);
ТП.ВывестиСекцию(«Шапка|Основа»);
ТзМод.ВыбратьСтроки();
Пока ТзМод.ПолучитьСтроку() = 1 Цикл
списмод=СокрЛП(ТзМод.Модель);
ТП.ПрисоединитьСекцию(«Шапка|Модель»);
КонецЦикла;
+(53) из моей первоначальной обработки это выглядит так
http://i075.radikal.ru/0908/d4/f3e8
До этого у мня сворачивалась по моделям и номенклатуре исх. таблица
Счас исходная сворачивается по ном и мод
и она уже сворачивается по отдельности…
Это имелось ввиду под оптимизацией кода????
Мог и сразу сказать, а не понты кидать!!!
по поводу найти значение 0,06% времени у меня
0,05% в случае «Пока врТЗ.ПолучитьСтроку()=1 Цикл…»
вывод — действительно разницы особой….. (((
(51) можно еще улучшить…
(54) да из любой, что в топике по 1,2 …
+57 и я там ничего не переделывал.
(55) я твой код даже не смотрел, если что..
а убыстрить еще можно — если выводить заранее рассчитанные секции..
(60) подскажи, только нормально.
если выводить заранее рассчитанные секции…
а если вывести сначала все сетку а потом в процессе разбора таблицы ее заполнить (помоему так медленнее будет)
Д не… и не заморачивался… разница не принципиальна, тема была как развернуть таблицу… скорость заинтересовала по ходу развития темы!!!
Важный вывод для читающих!!!!
Готовьте таблицы внимательно, чт об не заставлять машину лопатить лишние данные!!!
Работа с виртуальными таблицами на порядки выше!!!!
пример
Процедура Заполнить()
ТЗ.УдалитьСтроки();
тз1=СоздатьОбъект(«ТаблицаЗначений»);
тз.Выгрузить(тз1);
Если ВсегоСтрок<=0 Тогда
randomize();
ВсегоСтрок=random(1000);
КонецЕсли;
ВсегоНоменклатуры = Ном.РазмерСписка();
ВсегоМоделей = Мод.РазмерСписка();
Для к =1 По ВсегоСтрок Цикл
randomize();
ТЗ1.НоваяСтрока();
ТЗ1.Модель = Мод.ПолучитьЗначение(random(ВсегоМоделей));
ТЗ1.Номенклатура = Ном.ПолучитьЗначение(random(ВсегоНоменклатуры));
ТЗ1.Колво = random(1000);
Состояние(к);
КонецЦикла;
тз1.Выгрузить(тз);
КонецПроцедуры // Заполгить
заполнения на 1000000 в первоначальном варианте так и не дождался!!!!
;-))
(61) Тоже мне америку открыл..
ТЗ на форме мега тормоз.. и так, сам по себе..
(60) Тип того:
Секция = Таб.ПолучитьСекцию(«Шапка|Строка»);
Область = Секция.Область();
Цикл…..
Область.Текст = <Чтото>;
Таб.ВывестиСекцию(Секция);
(61) И лучше не пользоваться СоздатьОбъект(…) это тоже не быстрый метод, хотя и с загрузкой 1c++ он в разы быстрее стал..
и «избегайте» большого количества столбцов (так как в EXCEL больше 256 столбцов не сохраните, да строк там 65536 всего)
У нас 1спп не стоит….
Обычно использую ГлПустаяТаблица.Выгрузить(ТаблицаКредитовПоВеткам);
55% уходит на первоначальную выгрузку ТЗ.Выгрузить(исхТЗ);
44% на первоначальную свертку исхТЗ.Свернуть(«Номенклатура,Модель»,»Колво»);
Далее все меньше процента таб.показать,присоединитьсекцию…..
Так что не вижу особого смысла в дальнейшей оптимизации…
если все время уходит на визуализацию…..
Сейчас заинтересовало это
«Странник Сети (Собеседник Разума)
У вас нет прав на просмотр профайла этого пользователя. »
Почему???
(65) посмотри, сколько жрёт метод вывести/присоединитьСекцию… если не дай бог там еще и выражения в ней вычисляются…
Моксель тоже узкое место..
Уже понял, свой профиль глянул!!! :-))
(67,68) Спасибо за прекрасное и развернутое обсуждение. Мальчики вам по заслуженному + за обсуждение. :{}
;-))
(28) Да уж, каюсь. Мельком глянул.
(72) Это Ваше право. А как же (1) ведь именно там — выражена ГЛАВНАЯ мысль темы
Кое в чём программка помогла разобраться =)
Привет! А что нужно прописать, что бы макет автоматически выводился на печать горизонтально т.к. вертикально в формате А4 не влазит?
P.S. версия 8.0