Имя: Пароль:
1C
1С v8
Поиск циклических ссылок запросом.
↓ (Волшебник 18.02.2024 18:38)
0 Lama12
 
16.02.24
10:23
Добрый день, коллеги.
Теоретически возможно запросами найти объекты содержащие циклические ссылки неизвестной вложенности?

Пример.
Допустим есть справочник "Спр1" содержащий один из реквизитов  с типом "Справочник.Спр1".
Есть 5 элементов справочника.
Первый элемент справочника содержите ссылку на второй элемент справочника.
Второй на третий. Третий на четвертый. Четвертый на пятый, я пятый на первый.

Когда глубина/длина цепочки известна, выбрать подобные объекты наверно возможно. Вот когда длина цепочки не известна возможно?
1 Волшебник
 
16.02.24
10:25
Такое даже не всякий SQL-диалект умеет.
2 sikuda
 
16.02.24
10:59
(1) SQL-1999
WITH [recursive] имя_алиаса_запроса [ (список столбцов) ]
AS (запрос)
основной запрос
3 DiMel_77
 
16.02.24
22:26
Помнится у Ильдаровича был реализован такой поиск "Быстрое определение циклов произвольной длины одним пакетным запросом" https://infostart.ru/1c/articles/160707/?ysclid=lm800wcmjg283259760
4 Волшебник
 
16.02.24
22:45
Ага, применяйте. Паровоз вам навстречу
5 Garykom
 
16.02.24
22:59
(0) Для заданной вложенности ищется элементарно
Для произвольной это слишком затратно
6 Garykom
 
16.02.24
23:01
(5)+ Например пусть в справочнике 1 миллион элементов
И цикл всего один, элементы последовательно ссылаются друг на друга
И только последний ссылается на первый

Вложенность будет 1 миллион, это или миллион колонок или миллион последовательных запросов через ВТ в две колонки, где первая всегда начальный элемент а вторая текущий по циклу
7 Garykom
 
16.02.24
23:02
Имхо данные из базы выгружать в массив и обрабатывать чем то внешним (не 1С) для скорости
8 sitex
 
naïve
17.02.24
10:56
(6) Может ужать запросом где уникальных ссылок больше чем 1
9 vde69
 
17.02.24
11:25
можно с инсертом во временную таблицу, но есть вероятность завалить весь сервер :)
10 RomanYS
 
17.02.24
11:32
(6) ... или два десятка последовательных пакета (2^20 > 10^6) (7) сам себе какие-то цифры придумал, сам к каким-то странным решениям пришел. Миллионные массивы без проблем можно обработать и в 1С, если ответ за десяток другой секунд устраивает
11 PR
 
17.02.24
13:15
Узнаю русский народ
Всем интересно решить задачу, никому не интересно, зачем
12 RomanYS
 
17.02.24
13:47
(11) "теоретически" же в (0). Интерес исключительно академический и спортивный
13 rphosts
 
17.02.24
15:01
(11) Большая часть теоретических исследований в естественных науках они именно про узнать что-бы лишь знать.
14 Garykom
 
17.02.24
15:02
(10) Зачем ждать "десяток другой секунд" когда нечто внешнее выдает ответ меньше секунды?
15 Волшебник
 
17.02.24
15:09
(0) Проще проверять циклические ссылки при записи конкретного элемента. Это резко сокращает объём данных, поскольку надо пройтись только по связям одного элемента.
16 RomanYS
 
17.02.24
15:47
(14) Это судьба одинесника) Чем ты месяц в ЕРП закрываешь такой нетерпеливый)?
17 Гена
 
17.02.24
15:56
(15) Толковая мысль.
18 Lama12
 
17.02.24
18:07
(12) Вот причина Как перехватить переполнение стека встроенного языка на сервере?
Предположение оказалось верным. Благо объекты ссылались сами на себя. Устранив ситуацию, проверил как будет работать на цепочке из 5 объектов. Точно так же - падает.
Вопрос из (0) пока теоретический, т.к. надеюсь что 1С исправят ошибку при выгрузке это сделать не сложно. А вот если не будут исправлять, придется придумывать отчет для анализа данных. Стандартный код не хотелось бы менять.
19 Lama12
 
17.02.24
18:08
(15) 👍 Как альтернативный вариант пока приберегу.
20 RomanYS
 
18.02.24
10:58
(18) Стандартный код не хотелось бы менять.
Странный подход. Если код содержит ошибку, её нужно исправить. Циклические ссылки сами по себе норма и нормальный обмен должен с ними работать
21 Волшебник
 
18.02.24
18:01
(18) По той задаче надо просто ввести кэш уже загруженных объектов из Соответствие или индексированной ТаблицаЗначений. Перед загрузкой проверять объект, может он уже был ранее загружен в этом сеансе и тогда его пропускать.
22 Garykom
 
18.02.24
18:36
(20) Вероятно у него наваян свой универсальный обмен, с перебором реквизитов и выгрузкой элементов из них
И не учел уровень вложенности при переборе
23 Волшебник
 
18.02.24
18:38
Итак, автор как обычно на своей волне...
24 Lama12
 
19.02.24
09:17
(21) Зачем что-то изобретать сразу? Написал в 1С. Если ответят что это ошибка, то узнаю когда исправят. Если сроки будут приемлемы, то подождем. Если будут считать что не ошибка, то предложат варианты обхода. Если варианты обхода не удовлетворят руководство, то тогда и буду думать как исправлять. Вариант проверки перед записью мне больше нравится чем контроль выгрузки.
Обычно 1С в приемлемые сроки исправляет серьезные ошибки.
25 RomanYS
 
19.02.24
10:29
(24) Проверки чего? И что ты с этой проверкой дальше делать будешь?
Контрагент ссылается на основной договор, в договоре - естественно ссылка на владельца - зациклились! Будешь запрещать устанавливать основной договор или как?
26 Волшебник
 
19.02.24
10:53
(24) Вам уже объяснили в (20), что циклические ссылки при выгрузке никуда не денутся, это нормально.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший