<?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='\
— потому что
http://infostart.ru/public/80055/
пс: извини, Игорь, но перестал бы ты парить людям моск
<
В (1)- набор слов и ссылка на пустышку.
Приведи свою готовую обработку, свой текст запроса с последующей вызгрузкой в дерево.
Или дай ссылку на публикацию , где решается подобная задача .
Пока говорить не о чём.
Пустышка? у тебя, наверное, отключена загрузка изображений.
там есть два рисунка, на одном — запрос, безо всяких твоих выкрутасов, а на другом — сформированное из этого запроса дерево.
Игорь, помнишь, у тебя был такой сдвиг: СКД — рулез, кодинг — атстой?
Ну, так это и есть СКД, и именно здесь она — рулез, а вовсе не в рекурсиях.
Пишешь запрос и несколько параметрических движений мышкой, все остальное система делает сама.
И не надо застирывать моск извратами типа (0).
***
Игорь назвал мою публикацию пустышкой? С чего бы это? Вот, уважаемый коллега iov даже плюсанул.
Похоже, причина в том, что тема, поднятая Игорем, в очередной раз является преодолением им же самим созданных трудностей.
А моя публикация ему потому и кажется пустышкой , что проблем-то нет, никаких.
Просто пишем запрос, все остальное система делает сама. Понимаешь, Игорь? Программист составляет простейший запрос, без никаких твоих выкрутасов, и система сама делает все остальное.
Это и отображено на картинках. Да, публикация получилась очень маленькая. Так ведь и проблемы-то для обсуждения — нет. Понимаешь, Игорь? Это твоя публикация была бы пустышкой, если бы реально не вредила мозгам коллег, по крайней мере, мозгам тех из них, которые тебе отплюсовались.
Ну, а уж чтобы совсем было все понятно каждому, прикладываю в своей публикации файлик с отчетом.
Первый скриншот вы сможете воспроизвести, открыв СКД отчета.
Второй скриншот — запустив отчет в демо-базе УПП 1.3
(3) Ок. Давай разбираться.
Изображение у меня выводятся.
И то, что ты использовал СКД — вытекает из текста запроса.
Почему же тогда в (2) использован термин «пустышка» ?
Потому что
1. Не приведена сама обработка.
2. Не приведены аргументы ( сранительный анализ и тестирование) —
почему и в каких случаях СКД лучше, чем решение в текущей теме ?
Без этих двух пунктов твоя заявка (1) на лучшее решение — это просто «пук».
Гаданием за тебя, что ты имел ввиду — заниматься не буду.
Теперь о текущей статье, весь смысл её в том , что экономнее обойтись без СКД и решить всё в одном запросе.
См. простейшие тексты обработок.
Применение же СКД связано с дополнительными затратами в виде хранения отдельного макета «СхемыКомпоновкиДанных», загрузки его в оперативную память и т.д.
это невсегда удобно при доработке существующей формы документа или справочника.
Если же не хранить такой макет, то тогда придется программно создавать «СхемуКомпоновкиДанных» и организовывать вывод,
но тогда теряется преимущество в простоте настройки.
Вообщем, прочитай тему «Заметочки..» Alex-is там приведены примеры использования вывода в дерево.
Из этих примеров ты поймёшь , что в данных конкретных случаях применение СКД — избыточно.
и проще , экономнее использовать простой запрос.
Ты уж определись, агитатором и пропагандистом чего ты являешься, СКД или кодинга, а то в памяти всплывает термин шизофрения.
(3) — в (0) об СКД — ни слова, ты и не вспоминал о ней, пока я не ткнул.
Нашел применение вашему противостоянию!!! (добавил в тестовые задания для новых сотрудников так сказать найди 10 отличий.
Да а чего вы такие злые друг на друга?
мы не злые, мы — 1сники
(4) сравни размер обработки с макетом и без макета
а про использование оперативки — это реальный пук, обратись в хот-лайн известной фирмы
(6) Это мы — по старой дружбе.
http://infostart.ru/public/71130/
(8) Начнем сначала. В теме есть предложение , всё обясняющее :
Данную статью можно рассматривать как дополнение к теме Alex-is «Заметочки про 1с Предприятие 8»
В этой статье автор привёл примеры как получить двухуровневые итоги в одной колонке результата запроса.
Простенько и со вкусом.
Но для трех- и более уровневых итогов этот приём был уже не применим.
Текущая же статья описывает как раз приём , позволящий выводить трех- и более уровневые итоги в одной колонке.
Разумеется , можно выводить в дерево при помощи СКД. Никто этого запретить не может.
Да, действительно , про СКД в статье ни слова, потому что такая возможность очевидна и неинтересна в контексте рассмотрения.
(5) Быть сторонником применения СКД — это не значит тыкать СКД куда ни попадя.
Еще раз говорю, в контексте целого класса задач (доработка сущ. форм , например) применение СКД для вывода в дерево избыточно,
если всё можно реализовать в одном простом запросе.
ты по-случаю — не какой-нибудь маленький начальник компьютерщиков?
больно соображения у тебя какие-то нереальные
избыточным может быть только одно — время, затраченное на получение необходимого результата
если быстрее на СКД — берем СКД
если из реляционных таблиц надо вытащить иерархию — кодинг с рекурсией
Дополнительным плюсом статьи является возможность выводить дерево итогов с разнообразной многоуровневой группировкой.
Это могут быть и «склады, товары, контрагенты» и «контрагенты, склады, товары» и «товары, контрагенты, склады». Важно, что можно меняя запрос динамически получить практически миниOLAP на данных.
И выводить все эти данные на форме, а не в отчете.
(10) Должна быть свобода выбора. Иногда код с рекурсией работает медленнее, иногда наоборот. Не вижу ничего плохого в поисках Игоря решать задачи другими способами, например через запросы.
(12) Иногда код с рекурсией работает медленнее
Мы говорим об одном и том же, о из реляционных таблиц надо вытащить иерархию (априори количество уровней не знаем, пример — спецификация изделия) (10)?
Пожалуйста, приведите пример без рекурсии, не важно, быстрее он или медленнее.
Или вы настолько Иш_3, что спрячетесь, как Иш_2, за потоком «умных» слов?
(13)
Пожалуйста, приведите пример без рекурсии, не важно, быстрее он или медленнее.
В практических задачах ( а мы с помощью 1с решаем именно такие задачи) важно не количество уровней в каждом
конкретном исследуемом объекте , а максимально возможное количество уровней.
В практических задачах оно всегда известно и берется с некоторым запасом.
Тем не менее теоретически вполне возможен следующий вариант ,
http://infostart.ru/public/78285/
см. «Запрос против…»
В нижеприведенном примере лишь изменен вид цикла
Показать
Итак , по твоему запросу приведен пример решения задачи разузлования без рекурсии для случая,
когда количество уровней в графе неизвестно.
Я привел ,Миша , для тебя пример : как нужно практически доказывать свои утверждения.
(14) А зачем доказывать?
(13) Мне не попадались задачи с вложенностью в глубину более 67 уровней. Это было один раз за все мои 44 года.
Чаще всего количество уровней задано и не превышает 10.
Я не отрицаю рекурсии, но сожалею о том, что нет 1С рекурсивных запросов. Типа OVER BY, CONNECT BY, START WITH.
Почему доступно получение Иерархии из справочника (код-родитель) запросом, и почему нельзя получить дерево запросом из таблицы значений с полями (потомок-родитель)?
Если задача получения состава изделия, или получение дерева затрат, или получения иерархической структуры решается постоянно, то я скорее буду хранить иерархию в справочнике, чем постоянно использовать рекурсии и нагружать вычислениями базу.
Возможных решений много… И все они имеют право на жизнь.
(15)1.
Затем , чтобы «пуков» в этой теме было поменьше.
2.
Потому что на уровне записи элемента справочника реализован механизм , который исключает зацикливание ссылок — получаем «идеальное» дерево
(ациклический граф).
Если же таблица с колонками Родитель,Ребенок создана пользователем произвольно, то тогда встает проблема : возможно зацикливание (ошибка заполнения) . Применять готовые встроенные процедуры расчитанные на идеальное дерево — НЕЛЬЗЯ.
(14) Игорь, если ты не видишь в своем коде чистейшей воды рекурсию, то дискуссия вырождается в спор о терминах, я это уже говорил.
(15) слово «доказывать» сказали вы — чистейшей воды Иш2-приемчик.
(17) Пустое, Миша. Всё уже ясно.
http://infostart.ru/public/80055/ и
Теперь переключимся на твою тему
посмотрим вступится за твою честь WiseSnake или нет.
(2)
С полгода назад тренировки ради (был вопрос на одинэссии).
Никакого отношения к итогам не имеет, а прием тот же — запихивание в одну колонку разнотипной билиберды.
Видимые колонки: КонтрагетОтчет и ДоговорКолонки. И еще сортировка в консоли отчетов КонтрагентКолонки, КонтрагентОтчет, ДоговорКолонки.
От вспомогательных полей можно избавиться еще одним уровнем вложенности.
Показать
(19) Вопрос :
Показать
Для чего здесь «Сгруппировать ПО» ?
Разве в справочнике «ДоговорыКонтрагентов» есть неуникальные пары Договор, Владелец ?
Не проще ли написать равносильное :
(20)
Это уже перестраховка в спешке.
С замечанием согласен.
(15),(17),(19)
Жаль , что я не дождался аргументированного ответа о преимуществах СКД при выводе в дерево.
Придется самому защищать СКД и поставить под сомнение способ получения дерева из запроса с итогами.
Первый камень в текущую тему .
См. прикрепленный рисунок (второй из текущей темы).
Что имеем на рисунке ? Для того чтобы получить дерево мы используем в запросе ИТОГИ
и увеличиваем выходную таблицу в 4(!) раза.
Уже один этот факт рождает подозрение : а хорошо ли это ?
А в СКД ИТОГИ в запросе не используются совсем неслучайно.
(17)
Если в (22) размышлизм , то здесь доказательство.
Вот каких аргументов я ждал от тебя ,Миша.
Специально подобран убойный, уникальный пример
для показа преимуществ СКД при формировании дерева.
С помщью СКД дерево было сформировано в 50(1) раз быстрее.
(23) А где колонка «Поле4»?
(24)
Вопрос : как получить итоги в одну колонку при использовании СКД (без постобработки) ? — интересный.
Подождём публикаций. Насколько мне известно эту задачу к настоящему моменту никто не решил.
А в (23) продемонстрировано преимущество СКД при формировании «обычного» дерева (без итогов в одну колонку).
В указанном примере оно настолько велико , что постобработка для получения дерева нужного вида ненамного уменьшит это преимущество.
(26) А я знаю кто это умеет делать… 🙂
(26) «Луч света», ну , расскажи нам. Просим.
(27) Ну, что за сарказм…
http://infostart.ru/public/download.php?file=80200
Вот ссылочка
(28) Ай ! Молодца !
На форуме «1с» человек страдает по этому поводу.
Я ему не помог. Теперь сошлюсь.
(28) На форуме «1с»http://devtrainingforum.v8.1c.ru/forum/thread.jsp?id=556773
(28) Вы уж Алексей Викторович — извините ,
http://infostart.ru/public/download.php?file=80200
но без наездов в этой теме — никак.
Расматривается твоя обработка Пример8 из темы «Заметочки…»:
Теперь наезд :
1. Нужно обязательно избавиться от создания лишних и никчёмных пользовательских полей Рекизит1,Реквизит2..
2. В табличное поле «Дерево» должно сразу выводиться только одно поле «Поле4».
Без этих двух требований серьезным людям показывать такую обработку нельзя.
Слабо доработать ?
(31) В компановке данных нужно просто удалить эти пользовательские поля и всё. Оставить только «Поле4». Работать будет быстрее.
(32) Не пойдет. Ты прикрепи обработку.
(33) Ну, ладно…
Тут обработка только с 1 колонкой Поле4
(34) Ок !
Добавил ещё один вариант реализации многоуровнего дерева в колонке «Поле4» с использованием СКД — «Пример 9»http://infostart.ru/public/71130/files/
(36) Мне придется переписывать и стыковать с текущей темой (Благодаря тебе — она тоже будет полностью переработана).
Вместо реквизитов «Реквизит1″,»Реквизит2» — «Поле1″,»Поле2″,»Поле3″,»Поле4».
Ты зачем- то никому не интересный цикл заполнения таблицы — сделал в одну строку.
Ввел зачем-то переменную «Счетчик»,»НовоеДерево».
Время с точностью до миллисекунды…
Мда..На вкус и цвет .
> Вместо реквизитов «Реквизит1″,»Реквизит2» — «Поле1″,»Поле2″,»Поле3″,»Поле4».
http://infostart.ru/public/79992/
«Поле1″,»Поле2″,»Поле3″,»Поле4» — то вот отсюда
> Ты зачем- то никому не интересный цикл заполнения таблицы — сделал в одну строку.
Так быстрее работает
> Ввел зачем-то переменную «Счетчик»,»НовоеДерево».
«Счетчик» — так быстрее работает
«НовоеДерево» — так правильнее работает при повторном запуске
> Время с точностью до миллисекунды…
Точность — вежливость королей
Можно придумать множество оправданий, но мне не хочется, чтобы сделанную мной работу называли «поделками».
Способ вроде как известный 🙂
Использую иногда.
Для некоторых случаев, подходит. Но если порядок групп менять, то условие «ВЫБОР КОГДА Поле2 Есть NULL….» не работоспособно. расширять надо
(38) В (37) были придирки.
(39)
«Чисто» поговорить ? или сможете представить свой вариант выгрузки в дерево ?
Интересная тема, спасибо. 🙂
Покурил чуть этот вопрос, скажу пару слов в сторону запросной половины статьи.
Главный затык идет на Выгрузить() в строках вида «Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам)». Сам запрос выполняется так же быстро, как и СКД.
Но в строках вида «Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам)» никаких затыков нет.
В итоге, для программиста, в тех случаях, когда он собирается обходить кодом полученное быстро ДЗ (и, к примеру, не выводить её на форму) вполне можно использовать и Выборку, ибо обход и ДЗ и Выборки будет одинаково утомителен :).
(41)Можно ,конечно, провести еще опыты ,
но весь смысл такого использования итогов запроса именно в том , что получаем выигрыш в скорости.
Т.е. одно и тоже дерево получено
1. Дерево = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам);
2. Выборка = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам) ;
или Пока Выборка.Следующий() Цикл
… или рекурсивная процедура с получением «Дерево».
Так вот п.1 работает быстрее.
В частности это обсуждается
здесьhttp://devtrainingforum.v8.1c.ru/forum/thread.jsp?id=571765
(38) Что скажешь на (41),(42) ? Ты что-то подобное тестировал ?
Для меня , честно говоря, это было настолько очевидно ,
что я даже не сравнивал по быстродействию.
Для двухуровнего дерева у меня есть вот такие данные. Запрос с итогами выгружается через РезультатЗапроса.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам)
Заполнение запросом с итогами…
Время выполнения запроса : 0,266 сек.
Время выгрузки из результата запроса : 0,187 сек.
Общее время выполнения : 0,453 сек.
Заполнение СКД…
Время подготовки СКД : 0,016 сек.
Время выгрузки из СКД : 0,781 сек.
Общее время выполнения : 0,797 сек.
(44) Ты чего -то не о том . Вернее о чем-то своём.
Вопрос -то был о сравнении двух способов получения дерева (без СКД) :
— при помощи «кодинга» и выборки
— без кодинга выгрузить сразу в дерево.