Таблица иерархии и проверка зацикленности #561984


#0 by Ненавижу 1С
Есть таблица с двумя полями: ссылка и родитель. Ссылка в таблице уникальна и всегда заполнена. Родитель - это ссылка непосредственного родителя (он тоже обязательно есть в некоторой записи этой таблицы в поле Ссылка). Если родителя нет, то поля Родитель не заполнено (ммм... в терминах 1С "пустая ссылка") - это корневой элемент. Требуется написать ОДИН запрос (можно пакетный) на языке запросов 1С, с помощью которого можно проверить нет ли в этой таблице иерархии зацикленности? То есть проверить на валидность данные. Взлетит?
#1 by Ник второй
Давай свой вариант. Как можно судить о взлетах ?
#2 by Ненавижу 1С
нужен запрос, если он есть, то взлетит, если есть хоть какое-то приемлимое обоснование, что нельзя - значит не взлетит
#3 by Fragster
это порочная структура, реально. правильная структура - ссылка, левое значение, правое значение, уровень. родитель опционален. и дерево вида (1,6,0) (2,3,1)(4,5,1)
#4 by Ненавижу 1С
структура уже задана, порочная она или нет, другой вопрос меня интересует можно проверить запросом на зацикленность или нет
#5 by Ник второй
Имхо. нет.
#6 by Jstunner
невозможно утверждать о зацикленности не пройдя все точки. Циклов в запросах нет
#7 by Ник второй
голос забыл
#8 by Fragster
может коррелированными подзапросами и можно как-то извратится. только это не стандартный T_SQL, да и хз, только 1 раз написал такой запрос, как раз для построения дерева (но там гарантированно не было циклов)
#9 by Fragster
ыц
#10 by Ник второй
Циклы в запросах есть , но не те.
#11 by Axel2009
нужно выдать на экран или обработать результат?
#12 by catena
КОличество уровней неизвестно?
#13 by Lama12
Недавно тема обсасывалась, но без запросов. Та дано оптимальное решение. Если на запрос переведешь, то получится.
#14 by Ненавижу 1С
нужно запросом дать данные, которые уже обработки не требуют (или требуют за фиксированное время)
#15 by Mort
И это можно доказать, оперируя порядком вычислений необходимого для решения данной задачи и порядком который может "предложить" один запрос.
#16 by Mort
+ Почему то не проголосовалось.
#17 by Юрий Лазаренко
Сам недавно бодался с подобной ботвой, в итоге остановился на рекурсии.
#18 by Axel2009
если тока вывести, можно скд попробовать, там есть рекурсии встроенные.. набор данных сам на себя зациклить..
#19 by sikuda
Реляционный подход требует получения данных за ограниченное количество внутренних запросов в системе. Если вы используете рекурсию типа TSQL оператор with, то количесто подзапросов растет как квардат от уровня вложенности. Если количество вложенности до 10, то этот костыль подходит. Но запихнуть его в 1С мне не удалось. В общем случае создавайте кэш-РегистрСведений Родитель(любого уровня), Ссылка, УровеньВложенности. Записывайте его при любом изменении иерархии. С помощью этой структуры ваш запрос строиться легко.
#20 by Ахиллес
Что есть в данном случае "Зацикленность"? У Ссылки1 родитель равен Сылка2, а у Ссылка2 родитель равен Ссылка1?
#21 by Axel2009
это была бы халява
#22 by Ахиллес
Что тогда найти надо? Неоднократные ссылки? Ещё большая халява тогда. Что есть зацикленность?
#23 by Axel2009
ссылка1, ссылка2 ссылка2, ссылка3, ... ссылкаN, ссылка1
#24 by Ахиллес
Запрос1: Выбрать Элемент, Родитель, группировка по Элемент,Родитель, где Родитель не пустое значение. Запрос2: Выбрать Элемент2, Родитель2, группировка по Элемент2,Родитель2, где Родитель2 не пустое значение. Внутреннее соединение по Элемент = Родитель2 З.Ы. Если х.ню сморозил - звиняйте :-)
#25 by Ахиллес
Не это ересь я какую то написал. Необходимо ещё уровень элемента знать. И дополнительное условие по сравнению уровней, я так понимаю.
#26 by Fragster
а какой уровень у зациклившихся элементов?
#27 by Ахиллес
У родителя меньше чем у элемента?
#28 by Ахиллес
то есть больше. :-)
#29 by Fragster
а кто из них родитель? там же как раз и прикол в неоднозначности уровня
#30 by Ахиллес
Цитата из Есть таблица с двумя полями: ссылка и родитель.  Значит надо просто дополнить эту таблицу уровнем элемента и уровнем родителя
#31 by Axel2009
а что это даст?
#32 by Ахиллес
Если уровень родителя больше уровня элемента, то косяк. Собственно при нормальном заполнении ситуация в невозможна в принципе. Х.З. Как эту таблицу Ненавижу 1С заполняет и почему у него там какая то зацикленность образовалась.
#33 by Axel2009
когда дерево заполняет пользователь на глаз, то каждый пересчет может занимать "долгое" время наверна
#34 by Ахиллес
Нифига не понял.
#35 by Axel2009
ну вот сидит пользователь, дается ему 2 колонки, ссылка, родитель. он заполняет ее сначала, а потом надо проверить, все ли он корректно ввел. если по каждому тыку проверять, пользователь будет сидеть по паре секунд и ждать когда же это произойдет..
#36 by Живой Ископаемый
2 зачем проверять после того как он наделал ошибок а не каждый раз как он вводит новую строку? Или это специальный пользователь, обученный заполнять сначала только одну колонку, а потом только вторую во всей таблице сразу?
#37 by Живой Ископаемый
"если по каждому тыку проверять" непонятно пчоему по паре секунд а не мгновенно
#38 by Fragster
у первого элемента родителем второй, у второго - первый. у кого какой уровень?
#39 by Ахиллес
В момент заполнения элемента и родителя пусть проверяются уровни элемента и уровень родителя. Если уровень родителя больше уровня эдемента, включается разрядник в сиденье стула на 1000 вольт. Я не могу придумать, как иначе образуется эта зацикленность?
#40 by Ахиллес
Мы ведь о многоуровневом справочнике говорим? В таком случае Уровень это объективное свойство элемента. Не надо думать какой уровень, надо просто взять и посмотреть на него.
#41 by Fragster
в нет уровня, есть таблица с 2 колонками. требуется проверить возможность построения дерева.
#42 by Живой Ископаемый
2 нет, не обязательно... Автор может думать как организовать альтернативную иерархию... Ну например... Есть справочник контрагентов - он заполняется как бог на душу положит бухгалтерии или например по Гегорафическому принципу... А на другом уровне эти контрагенты связаны между собой иерархией Агент-субагент
#43 by Ахиллес
В таблице есть ССЫЛКИ, а у ссылки есть метод Уровень
#44 by Живой Ископаемый
по географическому принципу 1.ЦАО 1.1.МосковскаяОбласть 1.1.1 агент Вася 1.2. Калужская Область 1.2.1 агент Петя а альтернативная ирерхия выглядит так: 1. агент Вася из московской области 1.1. субагент Петя из Калужской области
#45 by Fragster
при чем тут? допустим, мы строим произвольную (альтернативную) иерархию, и у нас РС с 2 измерениями: Ссылка и Родитель.
#46 by Ахиллес
Нарисуй зацикленное дерево к первой иерархии.
#47 by Fragster
*facepalm*
#48 by Живой Ископаемый
2 а ему и не нужно проверять зацикленность первой. Он хочет проверить зацикленность второй. а выглядит это просто: 1. агент Вася из московской области | 1.1. субагент Петя из Калужской области 1.1. субагент Петя из Калужской области | 1. агент Вася из московской области
#49 by МихаилМ
-------------------------- можно только если известно макс колво вложенности уровней но можно построить более эффективнуюю иерархию : в cсылке можно закодировать иерархию. и проверять её при создании элемента. тогда можно создать эффективный индекс.
#50 by rs_trade
почему только до 10?
#51 by Ахиллес
Если таблица соответствует новой иерархии, то действует простое правило, кто первый встал, того и тапки. Мы же должны знать на какой уровень иерархии мы хотим поместить создаваемый элемент? Как только создаётся элемент в новой иерархии ему моментально присваивается уровень. Без этого условия новую иерархию вообще невозможно построить. А раз уж мы присвоили уровень, то мы можем сравнивать их для новой пары.
#52 by Ахиллес
Для случая Создаем 1. агент Вася из московской области и решаем, что он будет родителем всех агентов. (Должны же мы с чего то начать дерево? Поэтому получите Вася первый уровень и распишитесь) Далее мы создаём 1.1. субагент Петя из Калужской области и решаем, что вася должен стать его родителем. Да не вопрос. Вот тебе Петя второй уровень. Дальше мы вышли покурить, а кто то нам решил помочь. Заводит 1.1. субагент Петя из Калужской области и решает, что Петя должен стать родителем Васи. И тут же получает граблями по лбу, потому, что Вася уже был заведён ранее и уже имеет уровень 1 который меньше чем у предпологаемого родителя.
#53 by Живой Ископаемый
2 все верно, как-то так...
#54 by vmv
уже давно создан алгоритм превращения тз в дерево по набору полей иерархии посредством запсроса с менеджером временных таблиц(ищем на инфостаре). его, кто хотел, докрутил по корректной обработке всех полей таблицы. Заодно он покакзывает зацикленности или его(алгоритм) можно заставить это делать веласипед снова изобретаем
#55 by МихаилМ
пожалуста ссылку дайте.
#56 by Ахиллес
На какой фабрике таких умных делают? Или алгоритм опиши или ссылку прямую дай. А на предъявы типа ищите на инфостарте/гугле/яндексе можно аналогичный посыл получить, куда Макар телят не гонял.
#57 by vmv
"вольная" работа с группами - однин из больших минусов платформы 1С. Мне пришлось к ключевым справочникам: ОС, Контрагенты, Номенкратура, ФизЛица прикручивать подписчики ПередЗаписью, которые при создании пользователем нового элемента "кладут" его программно именно в тут группу, которая определена
#58 by Ахиллес
Ты не зациклишь справочник в 1С.
#59 by Живой Ископаемый
2 даже если будет включена не иерархия групп, а иерархия групп и элементов? даже если после интерактивной записи потом программно для элемента-родителя назначу родителем элемент-потомок? не проверял, просто спрашиваю.
#60 by vmv
не-а, В новом ПланВидов характеристик задаются правила иерархии для этих справочников согласно наборам реквизитов объекта. Например если при вводе нового контрагента выбрали, что  это юр.лицо, что форма собственности "ООО" и это, допустим поставшик, то он "падает" в свою иерархию  и любая попытка перемешщения его из групы будет "натыкаться" на это правило расположения в иерахии, упорно записывая его в ту группу, что определена ПВХ. Если пользователь ничего не выбрал, то элемент падает в корень, а пользователь получает втык за лень и скопление незаполненных элементов.
#61 by Ахиллес
Ну интерактивно точно не получится. Я верю в то, что создатели 1С не конченые дауны, а програмно тоже не пробовал. Завтра попробую.
#62 by Живой Ископаемый
2 да, тоже способ.
#63 by vmv
пример вызова и метод ниже, метод не совсем оптимален в смысле кода, но я ему "скармливаю" любые тз для получения иерархий и итогов по числовым полям, полезно, например, для работы с банками, группировать дата/банк/Валюта деревья и импортить потом куда хочь // Инициализация массива колонок группировок и структуры с колонками пересчета.
#64 by Живой Ископаемый
2 Ну... интерактивно да - не выходит:
#65 by Живой Ископаемый
Но вот такой запрос: Где параметр Ссылка я задаю в элемент первого уровня, а Ссылка1 в его потомка третьего уровня, дает мне одну строку. к этой строке я применяю такой код: прокатывает, и после этого если открыть форму списка справочника Подразделения - там нет ни элемента первого уровня и ни одного его потомка... Но если выполнить запрос к справочнику вцелом, то эти элементы видны. И можно даже открыть сам элемент.. Но вот по кнопке "Перейти в список" Толстый клиент подвисает - видимо зацикливается... :))
#66 by Живой Ископаемый
автор потерял интерес? :)
#67 by Ненавижу 1С
автор понял, что задача неразрешима в постановке автор ошибался когда постил
#68 by Живой Ископаемый
ну тебя хоть фокус из порадовал? :)
Тэги: 1С 8
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С