Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / [игнор отключен] [закрыт для гостей] / Как запросом получить список всех родителей зад-го элемента / 25 сообщений из 86, страница 1 из 4
24.04.2010, 19:04
    #36596399
LogvinovSerj
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как запросом получить список всех родителей зад-го элемента
Столкнулся с еще одной проблемой ... Есть иерархический справочник по элементам. Как запросом получить список всех родителей заданного элемента?
...
Рейтинг: 0 / 0
25.04.2010, 00:15
    #36596581
Программист 1с
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как запросом получить список всех родителей зад-го элемента
Ну получили и дальше что?

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

насчет фокспрошников думаю :
если объявить перекличку - счас вылезут
просто на фоксе чуть другая отмосфера была ... фоксклуб и т.д.
отсутствие хелпа
больше старались помочь друг другу что бы среда разработки жила
здесь по другому
...
Рейтинг: 0 / 0
26.04.2010, 12:53
    #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
26.04.2010, 12:55
    #36598192
vitkhv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как запросом получить список всех родителей зад-го элемента
leafдумаю найдется кому запатентовать ...
а вообще тут главное хелп уметь читать
по сравнению с фоксом тут в этом смысле легче ...

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

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

На территории 1С в свое время тоже никто в Хелп не отправлял, на том сайте собственно говоря 1С и учился, и атмосфера там была своя, особенная .... эх ностальгия ;)
...
Рейтинг: 0 / 0
26.04.2010, 12:59
    #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]