Добрый день помогите разобраться с проблемой, из регистра бухгалтерии получаю остатки товара, но есть сложность надо выводить первую группировку товара, то есть без подгрупп. Написал пакетный запрос, в временной таблице получаю родителя, но не знаю как связать полученный родитель номенклатуры с остатками номенклатуры чтобы выводило нужное поле.

ВЫБРАТЬ
    Номенклатура.Наименование КАК Родитель
ПОМЕСТИТЬ Номенклатура
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ГДЕ
    Номенклатура.Родитель = &Родитель
;

////////////////////////////////////////////////////////////­////////////////////

ВЫБРАТЬ
    ХозрасчетныйОстатки.Субконто1.Наименование КАК Наименование,
    ХозрасчетныйОстатки.Субконто1.Артикул КАК Артикул,
    ХозрасчетныйОстатки.КоличествоОстаток,
    Номенклатура.Родитель
ИЗ
    РегистрБухгалтерии.Хозрасчетный.Остатки(&Дата, , &Субконто, ) КАК ХозрасчетныйОстатки,
    Номенклатура КАК Номенклатура

Связи не указывал пока вывод бред, меня интересует вопрос, могу ли я выяснить главную группу, если не известен уровень вложенности?
---
nogik, еще один рабочий вариант:

```1c
    Запрос1=Новый Запрос;
    Запрос1.Текст="ВЫБРАТЬ
    | ХозрасчетныйОстатки.Субконто1 КАК Ссылка,
    | СУММА(ХозрасчетныйОстатки.КоличествоОстаток) КАК Остаток,
    | ХозрасчетныйОстатки.Субконто1.Родитель КАК Родитель
    |ИЗ
    | РегистрБухгалтерии.Хозрасчетный.Остатки(&Дата, Счет В ИЕРАРХИИ (&Счет), , ) КАК ХозрасчетныйОстатки
    |
    |СГРУППИРОВАТЬ ПО
    | ХозрасчетныйОстатки.Субконто1";

    Запрос1.УстановитьПараметр("Счет",ПланыСчетов.Хозрасчетный.ТоварыНаСкладе);
    ЗАпрос1.УстановитьПараметр("Дата",ТекущаяДата());

    Табл=Запрос1.Выполнить().Выгрузить();

    Для Каждого СтрОстаток из Табл Цикл

    Родитель=СТрОстаток.Ссылка.Родитель;
    Пока Родитель.Уровень()>0 Цикл
    Родитель=Родитель.Родитель;

    КонецЦикла;
    СтрОстаток.Родитель=Родитель;
    КонецЦикла;

    Табл.ВыбратьСтроку();
```
---
nogik, наверно я чего-то не понял. Как родитель может дать остатки?
---
tolyan_ekb, Ему не нужны остатки по номенклатуре из групп, которые подчинены выбранной группе
---
tolyan_ekb, мне нужны остатки по номенклатуре но если есть Группа главная например Группа 1, затем идёт подгруппа Группа 2, и в этой группе есть номенклатура соответственно у это номенклатуры будет родитель Группа 2, а мне нужна эта номенклатура только чтобы у неё родитель был главный то есть Группа 1.
---
Если запросом не получается, можно как-то в цикле по запросу до определить главного родителя и добавить его в ДеревоЗначений?
---
Как то сложно, почему не выбрать сразу:
```1c
    ВЫБРАТЬ
    ХозрасчетныйОстатки.Субконто1.Родитель КАК Группа,

    Сумма(ХозрасчетныйОстатки.КоличествоОстаток) Как Остаток,
    Номенклатура.Родитель
    ИЗ
    РегистрБухгалтерии.Хозрасчетный.Остатки(&Дата, , &Субконто, ) КАК ХозрасчетныйОстатки,
    Номенклатура КАК Номенклатура Группировать ХозрасчетныйОстатки.Субконто1.Родитель
```
---
laduk, потому что есть подгруппы номенклатуры, которые не нужны.
---
ВЫБРАТЬ
 Номенклатура.Наименование КАК Родитель
ПОМЕСТИТЬ Номенклатура

ИЗ
 Справочник.Номенклатура КАК Номенклатура
ГДЕ
 Номенклатура.Родитель = &Родитель
 И НЕ Номенклатура.ЭтоГруппа

Вот, так получите только элементы из папки Родитель, потом привязывайте не по родителю, а именно по элементам из родителя (элементы без групп)
---
deniseek77, немного не понял, в приведёном запросе я получаю номенклатуру без групп, а помещаю её временную таблицу, а потом связать её с регистром остатки? А где у меня будет отображаться главная группа?
---
nogik, Группы тоже попадают, точнее наименования групп, так как в таблице Номенклатура у вас выбираются Наименования
---
deniseek77, в этом запросе что вы написали вообще ничего не отбирает у меня), параметр &Родитель я поставил для определения списка главных групп. Получается условия противоречат Номенклатура.Родитель = &Родитель
И НЕ Номенклатура.ЭтоГруппа
---
А если по синтаксису, то:
```1c
    ВЫБРАТЬ
    ХозрасчетныйОстатки.Субконто1.Родитель,
    СУММА(ХозрасчетныйОстатки.КоличествоОстаток) КАК КоличествоОстаток
    ИЗ
    РегистрБухгалтерии.Хозрасчетный.Остатки(&Дата, Счет В Иерархии (&Счет), , ) КАК ХозрасчетныйОстатки

    СГРУППИРОВАТЬ ПО
    ХозрасчетныйОстатки.Субконто1.Родитель
```
---
```1c
    ВЫБРАТЬ
    Номенклатура.Ссылка
    ПОМЕСТИТЬ Вт_Номенклатура
    ИЗ
    Справочник.Номенклатура КАК Номенклатура
    ГДЕ
    Номенклатура.Родитель = &Родитель
    И НЕ Номенклатура.ЭтоГруппа
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    ХозрасчетныйОстатки.Субконто1.Артикул КАК Артикул,
    ХозрасчетныйОстатки.КоличествоОстаток,
    Вт_Номенклатура.Ссылка,
    ХозрасчетныйОстатки.Субконто1
    ИЗ
    Вт_Номенклатура КАК Вт_Номенклатура
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Хозрасчетный.Остатки(&Дата, , &Субконто, ) КАК ХозрасчетныйОстатки
    ПО Вт_Номенклатура.Ссылка = ХозрасчетныйОстатки.Субконто1
```

Не правда, только что проверил в консоле запросов, все так, Например, естбь папка, в ней номенклатура (элелементы и папки), у меня отбирает только элементы, вот этот запрос только что проверил
---
deniseek77, Извините меня может я тугодум, только что в консольку загнал ваш запрос вообще нет результата, пустая таблица(
---
nogik, Что выбираете, как родителя? параметром?
---
deniseek77, у меня родителем пустое поле, я его сделал для того чтобы получить список Главных групп.
---
nogik, Я думал вам нужен отбор по определенной группе, по элементам этой группы получить остатки, так и делал
---
deniseek77, простите что ввёл вас в заблуждение мне нужны остатки по всем группам товаров, то есть ориентироваться на регистр хозрасчетный.остатки, может быть просто сделать запрос по остаткам и в цикле перебора запроса определять группу главную, только пока не знаю как реализовывать это.
---
ВЫБРАТЬ
 Номенклатура.Ссылка КАК Ссылка,
 Номенклатура.Родитель
ПОМЕСТИТЬ Вт_Номенклатура
ИЗ
 Справочник.Номенклатура КАК Номенклатура
ГДЕ
 Номенклатура.Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
 ХозрасчетныйОстатки.КоличествоОстаток,
 ХозрасчетныйОстатки.Субконто1
ИЗ
 РегистрБухгалтерии.Хозрасчетный.Остатки(&Дата, , &Субконто, ) КАК ХозрасчетныйОстатки,
 Вт_Номенклатура КАК Вт_Номенклатура
ГДЕ
 ХозрасчетныйОстатки.Субконто1.Родитель В (Вт_Номенклатура.Ссылка)

Пойдет? Выбираем только верхние группы у которых нет родителя. Потом соединяем с условием, что родитель у субконто в ранее выбранной таблице.
---
tolyan_ekb, а поле родитель в итоговой таблице нет же, мне как раз это надо, чтобы таблица состояла из таких полей номенклатура, количество и главная группировка.
---
nogik, добаить нужно ХозрасчетныйОстатки.Субконто1.Родительи в первом запросе услове на группу, я забыл добавить
ГДЕ
 Номенклатура.Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
 И Номенклатура.ЭтоГруппа
---
nogik, получилось с учетом дополнения в (21)?
---
tolyan_ekb, получилось но не совсем то что ожидалось, при выполнении запроса нет остатков номенклатуры по некоторым группам, если делаю просто выборку по остатку, то этот товар есть, а после выполнения вашего запроса этого товара нет(
---
вообще не пойдет для общего случая, да и зачем выбирать заведомо пустое значение Номенклатура.Родитель в виртуальную таблицу ?
---
laduk, чтобы выбрать группы первого уровня
---
laduk, у меня запрос работает. Что значит для общего случая?
---
Ваш запрос не решает задачу поскольку не выводит : Родитель1Уровня, Остаток
и не может это сделать.
---
laduk, на чем основывается данное утверждение?
---
на том что в первой таблице у вас получится Таблица элементов первого уровня, а как вы проверите что Субконто1 принадлежит конкретному элементу этой таблицы ?
я отвечу - никак.
Для того что б проверить Вам необходимо пробежаться по таблице которую получили и проверить принадлежит или нет для каждого значения.

Ваш второй запрос проверяет что Субконто1 принадлежит Всей таблице первого уровня.
---
laduk, я сдела дополнение в (21) теперь во временную таблицу выбираются группы. Во втором запросе проверятеся, что родитель нмоенклатуры входит в спсико групп из временной таблицы. В демо базе работает, в моей базе работает.
Вы утверждаете - никак. Странно
---
ну входит он в список групп и что из этого, на какой вопрос дает ответ, то что остаток входит в СПИСОК групп ?
как вы на основании этого укажете конкретную группу первого уровня в которую входит номенклатура ?
---
laduk, конкретная группа указывается в параметрах, если нужно. В (19) сказано, что по конкретной группе не нужно выбирать. В запросе выбираются все группы.
---
даже если я не прав и задаче не предполагает вывода списка групп 1 первого уровня с остатками по ним, то все равно Ваш запрос не будет работать если в справочнике больше 3 уровней вложенности.
---
laduk, мне не нужно выводить остатки по группам главным, задача состоит в выводе остатков по номенклатуре.
---
я чет вообще тогда не понял, какой результат должен быть ?
одна строка в которой указано количество остаток ?
---
tolyan_ekb, у меня почему-то не вся номенклатура по остаткам идёт, у вас правильно отрабатывает ваш запрос?
---
Вам обязательно запросом это сделать ?
---
Можно выбрать две таблицы в первую родителей 0 уровня:
```1c
    ВЫБРАТЬ
    Номенклатура.Ссылка КАК Группа

    ПОМЕСТИТЬ Родители
    ИЗ
    Справочник.Номенклатура КАК Номенклатура
    ГДЕ
    Номенклатура.Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка) И Номенклатура.ЭтоГруппа=Истина
```

Во вторую остатки:
```1c
    ВЫБРАТЬ
    ХозрасчетныйОстатки.Субконто1.Родитель,
    СУММА(ХозрасчетныйОстатки.КоличествоОстаток) КАК КоличествоОстаток
    ИЗ

    РегистрБухгалтерии.Хозрасчетный.Остатки(&Дата, Счет В Иерархии (&Счет), , ) КАК ХозрасчетныйОстатки

    СГРУППИРОВАТЬ ПО
    ХозрасчетныйОстатки.Субконто1.Родитель
```
---
laduk, а что мне даст то что я 2 запроса сделаю? Как мне склеить их в ДеревеЗначений?
---
Выполнить пакет пробежать Вложенным циклом Первой второй таблице проверяя на "В иерархии"
---
Синтаксис не проверял, но алгоритм рабочий

```1c
    Запрос=Новый Запрос;
    Запрос.Текст="ВЫБРАТЬ
    Номенклатура.Ссылка КАК Группа,
    0 как Остаток
    ИЗ
    Справочник.Номенклатура КАК Номенклатура
    ГДЕ
    Номенклатура.Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка) И Номенклатура.ЭтоГруппа=Истина ;

    Запрос1=Новый Запрос;
    ЗАпрос1.Текст="ВЫБРАТЬ
    ХозрасчетныйОстатки.Субконто1.Родитель Как Ссылка,
    СУММА(ХозрасчетныйОстатки.КоличествоОстаток) КАК Остаток
    ИЗ

    РегистрБухгалтерии.Хозрасчетный.Остатки(&Дата, Счет В Иерархии (&Счет), , ) КАК ХозрасчетныйОстатки

    СГРУППИРОВАТЬ ПО
    ХозрасчетныйОстатки.Субконто1.Родитель;

    Запрос1.УстановитьПараметр("Счет",Счет);
    ЗАпрос1.УстановитьПараметр("Дата",Дата);

    ТаблРодителей=Запрос.Выполнить.Выгрузить();

    Выборка=Запрос1.Выполнить.Выбрать();
    Пока Выборка.Следующий() Цикл
    Для каждого Стр из ТаблРодителей Цикл
    Если Выборка2.Ссылка.ПринадлежитЭлементу(Стр.Группа) Тогда
    Стр.Остаток=Стр.Остаток+Выборка.Остаток;
    КонецЦикла;
    КонецЦикла;
```
---
laduk, сейчас проверю и отпишусь обязательно.
---
laduk, такой вопрос, а что мне в параметр Счет передавать не совсем понятно?
---
Счет это счет учета на котором ведутся товарные остатки, в общем случае для России это Счет с кодом 41, (для Украины с кодом 28)
---
если это у Вас отчет, то выведите на форму Реквизит с типом Плансчетов.Хозрасчетный
выбирайте там счет "Товары на складах"
Если нет формы то можно написать:
```1c
    Запрос.УстановитьПараметр("Счет",ПланыСчетов.Хозрасчетный.ТоварыНаСкладах);
```
---
laduk, а где брать Если Выборка2.Ссылка.ПринадлежитЭлементу(Стр.Группа)???
---
laduk, чёто глазами пробежался по запросу, а где сами поля номенклатура?
---
Выборка2 это синтаксис ошибка, дложно быть Выборка
Номеменклатура это Субконто1 в Регистре бухгалтерии для товарных счетов, для убыстрения берем сразу Родителя
Так цикл будет намного меньше
---
Если же вам нужно прост вывести по Выбранной группе остаток, то тут вообще все просто:

```1c
    ВЫБРАТЬ
    СУММА(ХозрасчетныйОстатки.КоличествоОстаток) КАК КоличествоОстаток,
    &Родитель
    ИЗ
    РегистрБухгалтерии.Хозрасчетный.Остатки(&Дата, Счет = &Счет, , ) КАК ХозрасчетныйОстатки
    ГДЕ
    ХозрасчетныйОстатки.Субконто1 В ИЕРАРХИИ(&Родитель)
```
---
laduk, мне нужно чтобы выводило 3 столбца 1 номенклатура, 2 количество отсаток, 3 родитель 1 уровня вот такая таблица
---
nogik, Консоли запросов нет под рукой сейчас, идея такая: 1) Номенклатура- получаем запросом- принцип такой " Где Номенклатура.Родитель.Родитель=Значение(Справочник.Номенклатура.пустаяСсылка)" 2) Группа, которой принадлежит номенклатура "Номенклатура.Родитель.Наименование" 3) Запрос- я писал как получить, ссылку получаете параллельно 1 пункту
---
Это можно решить несколькими способами:
1) Немного переформатировав мой алгоритм:
```1c
    Запрос=Новый Запрос;
    Запрос.Текст="ВЫБРАТЬ
    | Номенклатура.Ссылка КАК Группа
    |ИЗ
    | Справочник.Номенклатура КАК Номенклатура
    |ГДЕ
    | Номенклатура.Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
    | И Номенклатура.ЭтоГруппа = ИСТИНА";

    Запрос1=Новый Запрос;
    Запрос1.Текст="ВЫБРАТЬ
    | ХозрасчетныйОстатки.Субконто1 КАК Ссылка,
    | СУММА(ХозрасчетныйОстатки.КоличествоОстаток) КАК Остаток,
    | ХозрасчетныйОстатки.Субконто1.Родитель КАК Родитель
    |ИЗ
    | РегистрБухгалтерии.Хозрасчетный.Остатки(&Дата, Счет В ИЕРАРХИИ (&Счет), , ) КАК ХозрасчетныйОстатки
    |
    |СГРУППИРОВАТЬ ПО
    | ХозрасчетныйОстатки.Субконто1";

    Запрос1.УстановитьПараметр("Счет",ПланыСчетов.Хозрасчетный.ТоварыНаСкладе);
    ЗАпрос1.УстановитьПараметр("Дата",ТекущаяДата());

    ТаблРодителей=Запрос.Выполнить().Выгрузить();

    Табл=Запрос1.Выполнить().Выгрузить();

    Для Каждого СтрОстаток из Табл Цикл

    Для каждого Стр из ТаблРодителей Цикл
    Если СтрОстаток.Ссылка.ПринадлежитЭлементу(Стр.Группа) Тогда
    СтрОстаток.Родитель=Стр.Группа;
    Прервать;
    КонецЕсли;
    КонецЦикла;
    КонецЦикла;
    Табл.ВыбратьСтроку();
```
---
Справочник Номенклатура в конфигурациях 1С8 не имеет ограничения по уровням иерархии.
если их допустим не 2 как Вы предполагаете, тогда как : Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель=Значение(Справочник.Номенклатура.пустаяСсылка) ???
---
laduk, ему нужен 2 уровень иерархии, без групп, только элементы 2 уровня. Потом наименования групп, которым принадлежат и остатки, правда не указано по каким счетам
---
в (50) указано, что нужно и про второй уровень тут ничего...
---
nogik, еще один рабочий вариант:

```1c
    Запрос1=Новый Запрос;
    Запрос1.Текст="ВЫБРАТЬ
    | ХозрасчетныйОстатки.Субконто1 КАК Ссылка,
    | СУММА(ХозрасчетныйОстатки.КоличествоОстаток) КАК Остаток,
    | ХозрасчетныйОстатки.Субконто1.Родитель КАК Родитель
    |ИЗ
    | РегистрБухгалтерии.Хозрасчетный.Остатки(&Дата, Счет В ИЕРАРХИИ (&Счет), , ) КАК ХозрасчетныйОстатки
    |
    |СГРУППИРОВАТЬ ПО
    | ХозрасчетныйОстатки.Субконто1";

    Запрос1.УстановитьПараметр("Счет",ПланыСчетов.Хозрасчетный.ТоварыНаСкладе);
    ЗАпрос1.УстановитьПараметр("Дата",ТекущаяДата());

    Табл=Запрос1.Выполнить().Выгрузить();

    Для Каждого СтрОстаток из Табл Цикл

    Родитель=СТрОстаток.Ссылка.Родитель;
    Пока Родитель.Уровень()>0 Цикл
    Родитель=Родитель.Родитель;

    КонецЦикла;
    СтрОстаток.Родитель=Родитель;
    КонецЦикла;

    Табл.ВыбратьСтроку();
```
---
laduk, вот этот вариант больше всего подходит завтра выйду на работу протестирую, у меня более сложная задача стоит, мне надо это всё в Дерево значений запихнуть, а потом по COM подключится ещё к 2 базам получить оттуда остатки и их добавить в Дерево значений чтобы вывести общий отчёт по базам, для чего именно нужна была первый уровень группировки, после вывода отчёта будет формироваться списание остатков по формуле и надо будет по брендам списывать, а бренды это уровень группировки 1 как-то так.
---
Проще конечно "Бренды" вести отдельным справочником, по примеру "Номенклатурных групп" - суть та же или хотя б "Свойством", это если будет возможность немного оптимизировать структуру.
---
laduk, спасибо за помощь этот вариант перебора подошёл.
---
```1c
    ВЫБРАТЬ
    Номенклатура.Ссылка,
    Номенклатура.Наименование,
    Номенклатура.Родитель.Родитель,
    Номенклатура.Родитель КАК Группа,
    Номенклатура.Артикул
    ПОМЕСТИТЬ Вт_Номенклатура
    ИЗ
    Справочник.Номенклатура КАК Номенклатура
    ГДЕ
    Номенклатура.Родитель.Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
    И НЕ Номенклатура.Ссылка.ЭтоГруппа
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    ХозрасчетныйОстатки.КоличествоОстаток,
    Вт_Номенклатура.Ссылка,
    ХозрасчетныйОстатки.Субконто1,
    Вт_Номенклатура.Группа,
    Вт_Номенклатура.Артикул
    ИЗ
    Вт_Номенклатура КАК Вт_Номенклатура
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Хозрасчетный.Остатки(&Дата, , &Субконто, ) КАК ХозрасчетныйОстатки
    ПО Вт_Номенклатура.Ссылка = ХозрасчетныйОстатки.Субконто1
```
---
еще раз "намекаю": справочнике Номенклатура нет ограничения по количеству вложенных групп
---
А вообще, корректно поставленный вопрос это уже половина ответа :-)
---
laduk, То есть я опять не понял? Ему нужны остатки по всей номенклатуре, а имена групп самого верха, для отображения в каких папках лежат? Поясните, если так...
---
deniseek77,
Как мне кажется, именно так (но наверное не имена групп, а ссылки на группы).
---
Насколько я понял. Нужно вывести все остатки, но в качестве родителя выводить группу первого уровня, даже если товар из группы 10й вложенности.