powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / [игнор отключен] [закрыт для гостей] / Как запросом получить список всех родителей зад-го элемента
25 сообщений из 86, страница 1 из 4
Как запросом получить список всех родителей зад-го элемента
    #36596399
LogvinovSerj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Столкнулся с еще одной проблемой ... Есть иерархический справочник по элементам. Как запросом получить список всех родителей заданного элемента?
...
Рейтинг: 0 / 0
Как запросом получить список всех родителей зад-го элемента
    #36596581
Программист 1с
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну получили и дальше что?

ps Правильный вопрос уже содержит половину ответа.
...
Рейтинг: 0 / 0
Как запросом получить список всех родителей зад-го элемента
    #36596757
LogvinovSerj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Программист 1с
По моему я задал абсолютно правильный вопрос!!! Я задал цель, а вот для чего - разве без этого не понятен вопрос???
Есть документ согласования! Соответсвенно какой-то сотрудник создает документ и все его!!! начальники получают его и ставят свое резюме!
...
Рейтинг: 0 / 0
Как запросом получить список всех родителей зад-го элемента
    #36596868
Программист 1с
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А у вас "родители" элемента - начальники? А при увольнении (начальника) или перемещении (начальника) вы модифицируете свой иерархический справочник?

Ничего не путаете?

ps На практике встречал всего ОДИН случай когда требовались родители. И то при переносе между базами.
...
Рейтинг: 0 / 0
Как запросом получить список всех родителей зад-го элемента
    #36597034
vitkhv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LogvinovSerj, для 7.7 есть компонента ToySQL у нее есть метод СоздатьИерархию (CreateHierarchy) которая решает твою задачу. Скачай демо версию (так просто не скачивается по моему, надо отправлять запрос автору) и оттрасируй в профайлере, что делает компонента при использовании данного метода и повтори на 8х, либо спроси на форуме 1CSQL.ru как это сделать.

Мне как то на собеседовании очень продвинутый 1С нег с которым я собеседовался, сказал, что такое запросом сделать нельзя, только рекурсией, я хотя и помнил про метод ToySQL, но промолчал, т.к. этой задачей на 8х никогда не заморачивался:)
...
Рейтинг: 0 / 0
Как запросом получить список всех родителей зад-го элемента
    #36597058
vitkhv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Как запросом получить список всех родителей зад-го элемента
    #36597094
LogvinovSerjСтолкнулся с еще одной проблемой ... Есть иерархический справочник по элементам. Как запросом получить список всех родителей заданного элемента?

Для справочника с количеством уровней иерархии, например, 5, запрос будет выглядеть так:

Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Ссылка", КонтрагентСсылка);
Запрос.Текст =
"ВЫБРАТЬ
| ВложенныйЗапрос.Родитель
|ИЗ
| (ВЫБРАТЬ
| Контрагенты.Родитель КАК Родитель
| ИЗ
| Справочник.Контрагенты КАК Контрагенты
| ГДЕ
| Контрагенты.Ссылка = &Ссылка
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ
| Контрагенты.Родитель.Родитель
| ИЗ
| Справочник.Контрагенты КАК Контрагенты
| ГДЕ
| Контрагенты.Ссылка = &Ссылка
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ
| Контрагенты.Родитель.Родитель.Родитель
| ИЗ
| Справочник.Контрагенты КАК Контрагенты
| ГДЕ
| Контрагенты.Ссылка = &Ссылка
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ
| Контрагенты.Родитель.Родитель.Родитель.Родитель
| ИЗ
| Справочник.Контрагенты КАК Контрагенты
| ГДЕ
| Контрагенты.Ссылка = &Ссылка) КАК ВложенныйЗапрос
|ГДЕ
| ВложенныйЗапрос.Родитель <> ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)";


Если количество уровней иерархии заранее неизвестно, то текст запроса надо конструировать по частям в цикле, предварительно вытащив это количество из метаданных.
...
Рейтинг: 0 / 0
Как запросом получить список всех родителей зад-го элемента
    #36597175
Паля
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LogvinovSerjСтолкнулся с еще одной проблемой ... Есть иерархический справочник по элементам. Как запросом получить список всех родителей заданного элемента?
Иерархия справочников в 1с не предназначена для решения вашей задачи. окститесь пока не поздно. припишите начальников по другому.
...
Рейтинг: 0 / 0
Как запросом получить список всех родителей зад-го элемента
    #36597221
LogvinovSerj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Считаю данный иерархический справочник структуры подчинения почти идеальный! В основном на фирме и требуется, чтобы начальник знал документы и элементы своих подчиненных! А это элементарно при помощи - в иерархии!
По поводу жесткого ограничения уровней иерархии - не катит, сегодня их пять, завтра 10! Я вообще всю жизнь был программером Delphi и SQL Server и данный запрос в старых средах программирования сделал бы за пару минут! А вот в 1с как не крутил - так и не сделал ((( Вот и хотел спросить - может у кого нечто подобное реализовано!
...
Рейтинг: 0 / 0
Как запросом получить список всех родителей зад-го элемента
    #36597232
LogvinovSerj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все! Я понял, что 1с запросом это сделать не сможет! Очень жаль. Тогда сделаю обычной функцией. Примерно так:

функция ПоказатьВсехНачальников(Пользователь)
Если Пользователь = Неопределено Или Пользователь.Родитель = Неопределено Тогда
Возврат Неопределено;
КонецЕсли;

Результат = Новый ТаблицаЗначений;
Результат.Колонки.Добавить("Пользователь");
Начальник = Пользователь.Родитель;

Пока НЕ Начальник = Неопределено Цикл
Запись = Результат.Добавить();
Запись.Пользователь = Начальник;
Начальник = Начальник.Родитель;
КонецЦикла;
КонецФункции
...
Рейтинг: 0 / 0
Как запросом получить список всех родителей зад-го элемента
    #36597392
Программист 1с
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LogvinovSerjСчитаю данный иерархический справочник структуры подчинения почти идеальный! В основном на фирме и требуется, чтобы начальник знал документы и элементы своих подчиненных! А это элементарно при помощи - в иерархии!
По поводу жесткого ограничения уровней иерархии - не катит, сегодня их пять, завтра 10! Я вообще всю жизнь был программером Delphi и SQL Server и данный запрос в старых средах программирования сделал бы за пару минут! А вот в 1с как не крутил - так и не сделал ((( Вот и хотел спросить - может у кого нечто подобное реализовано!Мдаа. Вот я открыл то что писал полгода назад и вижу ошибки... А у вас сразу идеально - повезло наверное...

vitkhv вам хороший ответ привел.

А есть еще один хороший вариант. Вы когда выводите остатки с группами - представьте что у вас есть остаток только у вашего "подчиненного" и выводите все также.

ps Еще раз подумайте. Вам родители в запросе нужны? Или всетаки в выборке?
...
Рейтинг: 0 / 0
Как запросом получить список всех родителей зад-го элемента
    #36597711
leaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Запрос=Новый Запрос;
Запрос.Параметр("Код","%"+Прав(Найти(справочникобъект.полныйкод()- 1 ,"/")+"%");
Запрос.Текст=
	"ВЫБРАТЬ
	|	Номенклатура.Ссылка
	|ИЗ
	|	Справочник.Номенклатура КАК Номенклатура
	|ГДЕ
	|	Номенклатура.Код ПОДОБНО &Код
	|	И Номенклатура.ЭтоГруппа";

в общем мелкие ошибки есть = ищите сами ибо мне лень
идея такая
хотели одним запросом? ну вот он ...
надеюсь код строковый?
...
Рейтинг: 0 / 0
Как запросом получить список всех родителей зад-го элемента
    #36597715
leaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и еще одно условие
код уникальный в пределах справочника!
...
Рейтинг: 0 / 0
Как запросом получить список всех родителей зад-го элемента
    #36597722
leaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
Все! Я понял, что 1с запросом это сделать не сможет!

never say never
...
Рейтинг: 0 / 0
Как запросом получить список всех родителей зад-го элемента
    #36597833
HoBTID
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LogvinovSerjИдея правильная, для такой задачи нужно делать запрос в цикле.

Программист 1С, leaf.
А можно глупый вопрос, зачем решать задачу одним запросом?
Потому что так рекомендует 1С???
...
Рейтинг: 0 / 0
Как запросом получить список всех родителей зад-го элемента
    #36597908
HoBTIDLogvinovSerjИдея правильная, для такой задачи нужно делать запрос в цикле.

Программист 1С, leaf.
А можно глупый вопрос, зачем решать задачу одним запросом?
Потому что так рекомендует 1С???

Платформа построена так, что один запрос по нескольким таблицам (или несколько обращений в одном запросе к одной таблице, что в данном случае происходит) всегда отрабатывает быстрее, чем несколько запросов каждый по своей таблице.
Платформа на сервере преобразует запрос из формата 1С в формат SQL, попутно оптимизируя его. Поэтому, когда Вы строите один большой запрос вместо нескольких маленьких, Вы тем самым отдаете работу по оптимизации запроса в "руки" платформы. Т.е., в данном примере, таблица справочника будет прочитана только один раз (а не по количеству уровней иерархии в нем).

Другими словами, получение массива данных большим запросом вместо нескольких маленьких (кстати, запрос в цикле является грубой ошибкой) оптимизирует работу с базой данных.
...
Рейтинг: 0 / 0
Как запросом получить список всех родителей зад-го элемента
    #36598078
Jatz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Закиров Дамир,

только не стоит забывать про особенности оптимизаторов конкретных СУБД
...
Рейтинг: 0 / 0
Как запросом получить список всех родителей зад-го элемента
    #36598094
leaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на самом деле из метода имеем список значений кодов
его и передаем в запрос потом получаем список родителей
слишком много ошибок

Но на самом деле :
"Тому не надо ходить далеко у кого черт за плечами Вакула ..."

в полном коде все есть
...
Рейтинг: 0 / 0
Как запросом получить список всех родителей зад-го элемента
    #36598114
vitkhv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
leafна самом деле из метода имеем список значений кодов
его и передаем в запрос потом получаем список родителей
слишком много ошибок

Но на самом деле :
"Тому не надо ходить далеко у кого черт за плечами Вакула ..."

в полном коде все есть

Вот, что значит не замыленный взгляд.
Как в 1С та живется после foxpro?
...
Рейтинг: 0 / 0
Как запросом получить список всех родителей зад-го элемента
    #36598130
leaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что значит не замыленный ?
я уже 3 года или больше как с фокса соскачил
да что я то? Вон piva тут ошивается
...
Рейтинг: 0 / 0
Как запросом получить список всех родителей зад-го элемента
    #36598139
vitkhv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
leafчто значит не замыленный ?
я уже 3 года или больше как с фокса соскачил
да что я то? Вон piva тут ошивается

3 года для 1С видимо не срок ;), ведь полный код еще в 7.7 был, а данное решение первый раз вижу, отправь в книгу знаний на мисту....
...
Рейтинг: 0 / 0
Как запросом получить список всех родителей зад-го элемента
    #36598158
leaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
думаю найдется кому запатентовать ...
а вообще тут главное хелп уметь читать
по сравнению с фоксом тут в этом смысле легче ...

а насчет того что оно и в 7_7 было ...
так я его с 7_7 и знаю ... я и там был за 3-4 года
успел везде

насчет фокспрошников думаю :
если объявить перекличку - счас вылезут
просто на фоксе чуть другая отмосфера была ... фоксклуб и т.д.
отсутствие хелпа
больше старались помочь друг другу что бы среда разработки жила
здесь по другому
...
Рейтинг: 0 / 0
Как запросом получить список всех родителей зад-го элемента
    #36598184
HoBTID
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Закиров ДамирПлатформа построена так, что один запрос по нескольким таблицам (или несколько обращений в одном запросе к одной таблице,
что в данном случае происходит) всегда отрабатывает быстрее, чем несколько запросов каждый по своей таблице.Вы это откуда узнали, смотрели планы выполнения запросов и счетчики Reads, Writes, CPU в SQL Server Profiler?
Или может быть Вам об этом всего лишь сказали на курсах/прочитали в книге?

Закиров ДамирПлатформа на сервере преобразует запрос из формата 1С в формат SQL, попутно оптимизируя его.
Поэтому, когда Вы строите один большой запрос вместо нескольких маленьких,
Вы тем самым отдаете работу по оптимизации запроса в "руки" платформы.
Т.е., в данном примере, таблица справочника будет прочитана только один раз
(а не по количеству уровней иерархии в нем).

Другими словами, получение массива данных большим запросом вместо нескольких маленьких
(кстати, запрос в цикле является грубой ошибкой) оптимизирует работу с базой данных.Вы видели резальтаты этой "ОПТИМИЗАЦИИ" в профайлере SQL?
Или же по каким-то причинам просто предполагаете, якобы платформа "оптимизирует" его.

P.S.
Запрос в цикле является грубой ошибкой для новичков,
которые не умеют мыслить в категориях наборов данных,
для профессионалов высокого класса, иногда грубая ошибка - запрос без цикла.

По ссылке был приведен пример кода:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
ВЫБРАТЬ РАЗЛИЧНЫЕ
    Т1.Ссылка.Родитель КАК Ссылка
ИЗ
    Справочник.Задача КАК Т1
ГДЕ
    Т1.Ссылка В ИЕРАРХИИ(&Ссылки) И Т1.ЭтоГруппа=ложь
ИТОГИ ПО
    Ссылка ТОЛЬКО ИЕРАРХИЯ

Функция обУбратьОшибкиИтоговПоИерархии(Строки, Поле="Ссылка", Родитель=Неопределено) Экспорт 
    //Убираем все элементы, равные текущему
    Всего=Строки.Количество();
    Для Инд= 1  По Всего Цикл
        Стр=Строки[Всего-Инд];
        Зн=Стр[Поле];
        Если Родитель<>Неопределено И Зн=Родитель Тогда
            Строки.Удалить(Стр);
        Иначе
            обУбратьОшибкиИтоговПоИерархии(Стр.Строки, Поле, Зн);
        КонецЕсли;
    КонецЦикла;
КонецФункции

...

ВычСправочникДерево=Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
обУбратьОшибкиИтоговПоИерархии(ВычСправочникДерево.Строки);


Если вы знакомы с профайлером SQL, сравните его пожалуйста со следующим кодом:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
Функция ПолучитьВсехРодителей(ИсходныйЭлемент) Экспорт
	Запрос = Новый Запрос;
	Запрос.Текст = "
	|ВЫБРАТЬ
	|	Родитель
	|ИЗ
	|	Справочник.Номенклатура
	|ГДЕ
	|	Ссылка = &Ссылка
	|";

	МассивРодителей = Новый Массив;
	
	Запрос.УстановитьПараметр("Ссылка", ИсходныйЭлемент);
	Выборка = Запрос.Выполнить().Выбрать();
	
	ТекРодитель = Справочники.Номенклатура.ПустаяСсылка();
	Если Выборка.Следующий() Тогда
		ТекРодитель = Выборка.Родитель;
	КонецЕсли;
	
	Пока Не ТекРодитель.Пустая() Цикл
		МассивРодителей.Вставить( 0 , ТекРодитель);
		Запрос.УстановитьПараметр("Ссылка", ТекРодитель);
		
		Выборка = Запрос.Выполнить().Выбрать();
		Если Выборка.Следующий() Тогда
			ТекРодитель = Выборка.Родитель;
		КонецЕсли;
	КонецЦикла; 	
	
	Возврат МассивРодителей;
КонецФункции
...
Рейтинг: 0 / 0
Как запросом получить список всех родителей зад-го элемента
    #36598192
vitkhv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
leafдумаю найдется кому запатентовать ...
а вообще тут главное хелп уметь читать
по сравнению с фоксом тут в этом смысле легче ...

а насчет того что оно и в 7_7 было ...
так я его с 7_7 и знаю ... я и там был за 3-4 года
успел везде

насчет фокспрошников думаю :
если объявить перекличку - счас вылезут
просто на фоксе чуть другая отмосфера была ... фоксклуб и т.д.
отсутствие хелпа
больше старались помочь друг другу что бы среда разработки жила
здесь по другому

На территории 1С в свое время тоже никто в Хелп не отправлял, на том сайте собственно говоря 1С и учился, и атмосфера там была своя, особенная .... эх ностальгия ;)
...
Рейтинг: 0 / 0
Как запросом получить список всех родителей зад-го элемента
    #36598207
HoBTID
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
leaf
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Запрос=Новый Запрос;
Запрос.Параметр("Код","%"+Прав(Найти(справочникобъект.полныйкод()- 1 ,"/")+"%");
Запрос.Текст=
	"ВЫБРАТЬ
	|	Номенклатура.Ссылка
	|ИЗ
	|	Справочник.Номенклатура КАК Номенклатура
	|ГДЕ
	|	Номенклатура.Код ПОДОБНО &Код
	|	И Номенклатура.ЭтоГруппа";

в общем мелкие ошибки есть = ищите сами ибо мне лень
идея такая
хотели одним запросом? ну вот он ...
надеюсь код строковый?Здесь не мелкие ошибки, а принципиально неверный подход.
Так не будет работать, потому что полный код не хранится в базе и к нему нельзя обратиться в запросе.
...
Рейтинг: 0 / 0
25 сообщений из 86, страница 1 из 4
Форумы / [игнор отключен] [закрыт для гостей] / Как запросом получить список всех родителей зад-го элемента
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]