Имя: Пароль:
1C
1С v8
Выборка всех родителей номенклатуры
0 Falex
 
19.04.14
22:45
Здравствуйте. Можно ли написать одним запросом решение следующей задачи.
Есть регистр сведений, где хранится соответствие склада к группе номенклатуре.
На входе задачи имеется список номенклатуры. Можно ли в запросе выбрать сопоставление номенклатура (из входных данных) - склад из регистра.
(если будет несколько, то максимум)
Проблема заключается в том, что родитель в регистре для данной номенклатуры может быть указан любой из иерархии.
1 neo_matrix_123
 
19.04.14
22:53
в смысле в регистре не родитель самой номенклатуры, а любой уровень иерархии?
2 zulu_mix
 
19.04.14
22:55
решение практически любой задачи можно написать одним запросом
3 zulu_mix
 
19.04.14
22:59
вопрос только в том, сколько экранов будет занимать текст. 5 строк, 3 экрана или 42 экрана
4 Falex
 
19.04.14
23:40
да.любой уровень. подскажите как оптимальнее запрос написать?
5 neo_matrix_123
 
20.04.14
00:47
можно попробовать склеить таблицу номенклатуры, точнее только владельцев в иерархии (этогруппа = истина) с таблицей записей регистра
6 PCcomCat
 
20.04.14
01:35
Не знаю, поможет ли, но я когда-то прайс делала с выборкой родителей. Текст:

        Запрос = Новый Запрос("ВЫБРАТЬ
        |{ВЫБРАТЬ
        |    СправочникНоменклатура.Ссылка КАК Товар,
        |   ЦеныНоменклатурыСрезПоследних.ТипЦен КАК ТипЦен,
        |   ЦеныНоменклатурыСрезПоследних.Валюта КАК Валюта,
        |   ЦеныНоменклатурыСрезПоследних.Цена КАК Цена,
        |   Остатки.КоличествоОстаток КАК Остаток}
        |
        |    СправочникНоменклатура.Ссылка,
        |   ЦеныНоменклатурыСрезПоследних.ТипЦен,
        |   ЦеныНоменклатурыСрезПоследних.Валюта,
        |   ЦеныНоменклатурыСрезПоследних.Цена,
        |   Остатки.КоличествоОстаток
        |ИЗ
        |    Справочник.Номенклатура КАК СправочникНоменклатура
        |     {ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Хозрасчетный.Остатки(&Дата,Счет в иерархии (&Счет),,Субконто2 = &Склад) КАК Остатки
        |      ПО  Остатки.Субконто1 = СправочникНоменклатура.Ссылка}
        |     {ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата,ТипЦен В (&ТипЦен)) КАК ЦеныНоменклатурыСрезПоследних
        |      ПО  ЦеныНоменклатурыСрезПоследних.Номенклатура = СправочникНоменклатура.Ссылка}
        |
        |   {ГДЕ
        |       СправочникНоменклатура.Ссылка КАК Товар,
        |      СправочникНоменклатура.Ссылка  В ИЕРАРХИИ(&Номенклатура)
        |   И Остатки.Организация = &Организация}
        |ГДЕ
        |    СправочникНоменклатура.Ссылка В ИЕРАРХИИ(&Номенклатура)"
        );
          
        
        Если ПоОстаткам тогда
            Запрос.Текст = Запрос.Текст + ("
            |   И (Остатки.КоличествоОстаток>0 или СправочникНоменклатура.Ссылка.ЭтоГруппа=Истина)"
            );
        КонецЕсли;
        
        Запрос.Текст = Запрос.Текст + ("
        |
        |АВТОУПОРЯДОЧИВАНИЕ"
        );
7 romix
 
20.04.14
01:39
(0) Родитель.Родитель.Родитель... по-моему можно вызывать сколько угодно раз, система даст пустые значения, если иерархия не глубока.

Также можно задать на вход запроса элемент и всех родителей.
8 PCcomCat
 
20.04.14
01:43
(7) Главное угадать, сколько раз про Родителя вспоминать!
9 Ерепень
 
20.04.14
07:18
связать по в иерархии ещё не было?
10 Falex
 
20.04.14
16:55
Что вы под этим подразумеваете?
11 Wobland
 
20.04.14
17:00
(10) фигню, я уже проверил ;)
12 shuhard
 
20.04.14
17:18
(10) буквально то, что написано в (9)
13 Falex
 
21.04.14
09:53
Т.е. ответ никак в запрос? )
Только потом результат обрабатывать?
14 vovus
 
21.04.14
10:02
В типовой выборку родителей видел через запрос
.Родитель
.Родитель.Родитель
И так далее по этому принципу
выбирается 5 уровней, если последнее поле не пустое, запрос выполняется еще раз (через цикл)
15 Tarlich
 
21.04.14
10:06
Отбор Номенклатура принадлежит группе &гРуппа
Склад  = &Скелад
если пустая выборка ....
не то?
16 azt-yur
 
21.04.14
10:09
Посылай в запрос массив из самой номенклатуры и всех вышестоящих родителей. И в запросе условие:
Номенклатура В (&МассивНоменклатуры)

В типовых так реализовано для счетов учета номенклатуры
17 Tarlich
 
21.04.14
10:13
номенклатура В ИЕРАРХИИ ...
18 sdfqwe
 
21.04.14
10:27
Пример из типовой:

Функция ПолучитьСписокВышеСтоящихГрупп(ЭлементСправочника) Экспорт
    
    Результат = Новый Массив;        
    
    Если НЕ ЗначениеЗаполнено(ЭлементСправочника) Тогда
        Возврат Результат;
    КонецЕсли;
    
    МетаданныеСправочника = ЭлементСправочника.Метаданные();
    Если НЕ МетаданныеСправочника.Иерархический Тогда
        Возврат Результат;
    КонецЕсли;
    ИмяСправочника = МетаданныеСправочника.Имя;    
    Запрос = Новый Запрос;
    Запрос.Текст = "
    |ВЫБРАТЬ
    |    Справочник1.Родитель КАК Родитель1,
    |    Справочник2.Родитель КАК Родитель2,
    |    Справочник3.Родитель КАК Родитель3,
    |    Справочник4.Родитель КАК Родитель4,
    |    Справочник5.Родитель КАК Родитель5
    |ИЗ
    |    Справочник." + ИмяСправочника + " КАК Справочник1
    |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник." + ИмяСправочника + " КАК Справочник2
    |        ПО (Справочник2.Ссылка = Справочник1.Родитель)
    |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник." + ИмяСправочника + " КАК Справочник3
    |        ПО (Справочник3.Ссылка = Справочник2.Родитель)
    |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник." + ИмяСправочника + " КАК Справочник4
    |        ПО (Справочник4.Ссылка = Справочник3.Родитель)
    |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник." + ИмяСправочника + " КАК Справочник5
    |        ПО (Справочник5.Ссылка = Справочник4.Родитель)
    |ГДЕ
    |    Справочник1.Ссылка = &Ссылка";
    
    ТекущийЭлемент = ЭлементСправочника;
    
    Пока ЗначениеЗаполнено(ТекущийЭлемент) Цикл        
        Запрос.УстановитьПараметр("Ссылка", ТекущийЭлемент);
        Выборка = Запрос.Выполнить().Выбрать();
        Если Выборка.Следующий() Тогда
            Для Индекс = 1 по 5 Цикл
                ТекущийЭлемент = Выборка["Родитель" + Индекс];
                Если ЗначениеЗаполнено(ТекущийЭлемент) Тогда
                    Результат.Добавить(ТекущийЭлемент);
                Иначе
                    Прервать;
                КонецЕсли;                
            КонецЦикла;
        Иначе
            ТекущийЭлемент = Неопределено;
        КонецЕсли;
    КонецЦикла;    
    
    Возврат Результат;
    
КонецФункции
19 vovus
 
21.04.14
10:30
(18) да-да, как раз вот это я вспомнил из типовой
20 azt-yur
 
21.04.14
10:46
(18) потом этот список и передается в запрос по регистру сведений с условием как в (16)
21 azt-yur
 
21.04.14
10:49
и по-моему как то слишком замудрили в типовых эту функцию.
так проще и надежнее:

Результат = Новый Массив;
ТекущийЭлемент = ЭлементСправочника;
Пока ЗначениеЗаполнено(ТекущийЭлемент) Цикл
Результат.Добавить(ТекущийЭлемент);
ТекущийЭлемент = ТекущийЭлемент.Родитель;
КонецЦикла;
Возврат Результат;
22 sdfqwe
 
21.04.14
10:53
(21) без запроса все просто, но народу надо именно с ним. Вдруг СКД или есче что.
Независимо от того, куда вы едете — это в гору и против ветра!