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

```1c
    Запрос = Новый Запрос;
    МенеджерВТ = Новый МенеджерВременныхТаблиц;
    Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
    Запрос.Текст = "ВЫБРАТЬ
    | Таб.Номенклатура,
    | Таб.Количество
    |ПОМЕСТИТЬ ВТДанные
    |ИЗ
    | &Данные КАК Таб
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |ВЫБРАТЬ
    | ВТДанные.Номенклатура,
    | ВТДанные.Количество
    |ИЗ
    | ВТДанные КАК ВТДанные";

    Запрос.УстановитьПараметр("Данные", ТаблицаЗначений);
```

Как можно заметить я получил временную таблицу в которой отображается количество в разрезе номенклатуры. Перемещение сформировано таким образом, что при проведении документа, остаток на складе в разрезе номенклатуры не будет отрицательным

Но чтобы сформировать корректно перемещение, мне надо учитывать ещё и характеристики. Так как остатки на складе учитываются в разрезе характеристик тоже.

То есть получить таблицу вида с 3 колонками Номенклатура ХарактеристикаНоменклатуры и Количество.

Мне все-равно с какой характеристикой товар попадет в перемещение, но важно чтобы количество на складе по каждой позиции в разрезе Номенклатуры и Характеристики не было отрицательным.

Задачу хотелось бы решить используя пакетный запрос. Но ни как не могу сообразить как его сформировать. Пока сделал только это.

```1c
    ВЫБРАТЬ
    Таб.Номенклатура,
    Таб.ХарактеристикаНоменклатуры,
    Таб.Количество
    ПОМЕСТИТЬ ВТДанные
    ИЗ
    &Данные КАК Таб
    ;

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

Помогите пожалуйста в формировании запроса.
---
Тему можно закрывать. Задача решена

```1c
    ТаблицаЗначений = ТабличнаяЧасть.Выгрузить();

    Запрос = Новый Запрос;
    МенеджерВТ = Новый МенеджерВременныхТаблиц;
    Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
    Запрос.Текст = "ВЫБРАТЬ
    | Таб.Номенклатура,
    | Таб.Количество
    |ПОМЕСТИТЬ ВТДанные
    |ИЗ
    | &Данные КАК Таб
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |ВЫБРАТЬ
    | ТоварыНаСкладахОстатки.Номенклатура,
    | ТоварыНаСкладахОстатки.ХарактеристикаНоменклатуры,
    | ТоварыНаСкладахОстатки.КоличествоОстаток КАК Количество
    |ПОМЕСТИТЬ Остатки
    |ИЗ
    | РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |ВЫБРАТЬ
    | ВТДанные.Номенклатура,
    | ВТДанные.Количество,
    | Остатки1.ХарактеристикаНоменклатуры КАК Т1_ХарактеристикаНоменклатуры,
    | Остатки1.Количество КАК Т1_Количество,
    | ЕСТЬNULL(Остатки2.Количество, 0) КАК Т2_Количество
    |ПОМЕСТИТЬ Данные
    |ИЗ
    | ВТДанные КАК ВТДанные
    | ЛЕВОЕ СОЕДИНЕНИЕ Остатки КАК Остатки1
    | ПО ВТДанные.Номенклатура = Остатки1.Номенклатура
    | ЛЕВОЕ СОЕДИНЕНИЕ Остатки КАК Остатки2
    | ПО ВТДанные.Номенклатура = Остатки2.Номенклатура
    | И (Остатки1.ХарактеристикаНоменклатуры > Остатки2.ХарактеристикаНоменклатуры)
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |ВЫБРАТЬ
    | ВремТаб.Номенклатура,
    | ВремТаб.Т1_ХарактеристикаНоменклатуры,
    | МАКСИМУМ(ВремТаб.Количество) КАК Количество,
    | МАКСИМУМ(ВремТаб.Т1_Количество) КАК Т1_Количество,
    | СУММА(ВремТаб.Т2_Количество) КАК Т2_Количество
    |ПОМЕСТИТЬ Данные2
    |ИЗ
    | Данные КАК ВремТаб
    |
    |СГРУППИРОВАТЬ ПО
    | ВремТаб.Номенклатура,
    | ВремТаб.Т1_ХарактеристикаНоменклатуры
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |ВЫБРАТЬ
    | Данные.Номенклатура,
    | Данные.Т1_ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
    | Данные.Количество КАК КоличествоДок,
    | Данные.Т1_Количество КАК Количество,
    | Данные.Т2_Количество КАК НакопительныйИтог,
    | Данные.Количество - Данные.Т2_Количество КАК ОсталосьСписать
    |ПОМЕСТИТЬ Данные3
    |ИЗ
    | Данные2 КАК Данные
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |ВЫБРАТЬ
    | Данные3.Номенклатура,
    | Данные3.ХарактеристикаНоменклатуры,
    | ВЫБОР
    | КОГДА Данные3.ОсталосьСписать < Данные3.Количество
    | ТОГДА Данные3.ОсталосьСписать
    | ИНАЧЕ Данные3.Количество
    | КОНЕЦ КАК Количество
    |ИЗ
    | Данные3 КАК Данные3
    |ГДЕ
    | Данные3.НакопительныйИтог < Данные3.КоличествоДок";
    Запрос.УстановитьПараметр("Данные", ТаблицаЗначений);
    Результат = Запрос.Выполнить().Выгрузить();
```

Помогла следующая публикация =) http://infostart.ru/public/266377/
---
как вариант, можно вот так попробовать:

```1c
    ИЗ
    РегистрНакопления.ТоварыНаСкладах.Остатки(
    ,
    Склад = &Склад
    И (Номенклатура, ХарактеристикаНоменклатуры) В
    (ВЫБРАТЬ
    Т.Номенклатура , Т.ХарактеристикаНоменклатуры
    ИЗ
    ВТДанные КАК Т)) КАК ТоварыНаСкладахОстатки
```
---
Allexe8.1, дело в том, что в таблице ВТДанные характеристики везде пустые. При таком формировании запроса в перемещение попадут только позиции без характеристик.
---
Shilov, зачем тогда ВТДанные нужна? можно просто получить таблицу остатков по условию (Номенклатура В (&Номенклатура). Т.е.

```1c
    ТаблицаТоваров= ЭтотОбъект.Товары.Выгрузить();
    ТаблицаТоваров.Свернуть("Номенклатура", "Количество");

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

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

    // ну и далее обход ТаблицаТоваров и перекидывание остатков из ДЗ в ТЧ документа
```
---
К ВТДанные присоединяешь левым соединением Остатки по номенклатуре в таблицу вида
Номенклатура
Характеристика
Количество
КоличествоОстаток
Берешь итоги по номенклатуре, ресурсы Максимум(Количество) Сумма(КоличествоОстаток). Потом делаешь обход сначало по номенклатуре (запоминаешь Количество) потом по характеристикам (набираешь характиристики по КоличествоОстаток пока не наберешь Количество, потом к следующей номенклатуре). Алгоритм типа списания по партиям получается, только у тебя вместо партий - характеристики.
---
fnxash, Ход мыслей понятен. Но не представляю как это можно сделать запросом.
---
Shilov, только запросом такое не сделать. В любом случае нужен обход в цикле после выбора данных.
---
Тему можно закрывать. Задача решена

```1c
    ТаблицаЗначений = ТабличнаяЧасть.Выгрузить();

    Запрос = Новый Запрос;
    МенеджерВТ = Новый МенеджерВременныхТаблиц;
    Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
    Запрос.Текст = "ВЫБРАТЬ
    | Таб.Номенклатура,
    | Таб.Количество
    |ПОМЕСТИТЬ ВТДанные
    |ИЗ
    | &Данные КАК Таб
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |ВЫБРАТЬ
    | ТоварыНаСкладахОстатки.Номенклатура,
    | ТоварыНаСкладахОстатки.ХарактеристикаНоменклатуры,
    | ТоварыНаСкладахОстатки.КоличествоОстаток КАК Количество
    |ПОМЕСТИТЬ Остатки
    |ИЗ
    | РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |ВЫБРАТЬ
    | ВТДанные.Номенклатура,
    | ВТДанные.Количество,
    | Остатки1.ХарактеристикаНоменклатуры КАК Т1_ХарактеристикаНоменклатуры,
    | Остатки1.Количество КАК Т1_Количество,
    | ЕСТЬNULL(Остатки2.Количество, 0) КАК Т2_Количество
    |ПОМЕСТИТЬ Данные
    |ИЗ
    | ВТДанные КАК ВТДанные
    | ЛЕВОЕ СОЕДИНЕНИЕ Остатки КАК Остатки1
    | ПО ВТДанные.Номенклатура = Остатки1.Номенклатура
    | ЛЕВОЕ СОЕДИНЕНИЕ Остатки КАК Остатки2
    | ПО ВТДанные.Номенклатура = Остатки2.Номенклатура
    | И (Остатки1.ХарактеристикаНоменклатуры > Остатки2.ХарактеристикаНоменклатуры)
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |ВЫБРАТЬ
    | ВремТаб.Номенклатура,
    | ВремТаб.Т1_ХарактеристикаНоменклатуры,
    | МАКСИМУМ(ВремТаб.Количество) КАК Количество,
    | МАКСИМУМ(ВремТаб.Т1_Количество) КАК Т1_Количество,
    | СУММА(ВремТаб.Т2_Количество) КАК Т2_Количество
    |ПОМЕСТИТЬ Данные2
    |ИЗ
    | Данные КАК ВремТаб
    |
    |СГРУППИРОВАТЬ ПО
    | ВремТаб.Номенклатура,
    | ВремТаб.Т1_ХарактеристикаНоменклатуры
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |ВЫБРАТЬ
    | Данные.Номенклатура,
    | Данные.Т1_ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
    | Данные.Количество КАК КоличествоДок,
    | Данные.Т1_Количество КАК Количество,
    | Данные.Т2_Количество КАК НакопительныйИтог,
    | Данные.Количество - Данные.Т2_Количество КАК ОсталосьСписать
    |ПОМЕСТИТЬ Данные3
    |ИЗ
    | Данные2 КАК Данные
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |ВЫБРАТЬ
    | Данные3.Номенклатура,
    | Данные3.ХарактеристикаНоменклатуры,
    | ВЫБОР
    | КОГДА Данные3.ОсталосьСписать < Данные3.Количество
    | ТОГДА Данные3.ОсталосьСписать
    | ИНАЧЕ Данные3.Количество
    | КОНЕЦ КАК Количество
    |ИЗ
    | Данные3 КАК Данные3
    |ГДЕ
    | Данные3.НакопительныйИтог < Данные3.КоличествоДок";
    Запрос.УстановитьПараметр("Данные", ТаблицаЗначений);
    Результат = Запрос.Выполнить().Выгрузить();
```

Помогла следующая публикация =) http://infostart.ru/public/266377/