Добрый день!

Имеем
Таблица «Номенклатура»:

Номенклатура | Количество
Гайка | 4
Гайка | 6

Таблица "Остатки"

Номенклатура | Остаток
Гайка | 8

Надо запросом получить таблицу Результат, распределить остатки следующим образом:

№ | Номенклатура | Количество
1 | Гайка | 4
2 | Гайка | 4 (8-4)
3 | Гайка | 2 (10-4-4)

То есть, мы распределяем остатки по строкам таблицы Номенклатура, а то, чего нам не хватает - вывести в новую строку (№3). Так мы узнаем, сколько нам еще надо товара "заказать".
Важное условие: сворачивать первую таблицу "Номенклатура" нельзя!

Поломал мозг... Жду ваших конструктивных предложений!
---
Во вложении пример только запросом.
ТекстЗапроса
```1c
    ВЫБРАТЬ
    1 КАК НомерСтроки,
    "Гайка" КАК Деталь,
    4 КАК Требуется
    ПОМЕСТИТЬ ДанныеДок

    ОБЪЕДИНИТЬ ВСЕ

    ВЫБРАТЬ
    2,
    "Гайка",
    6
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    "Гайка" КАК Деталь,
    8 КАК Остаток
    ПОМЕСТИТЬ ОстаткиДеталей
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    ДанныеДок.НомерСтроки,
    ДанныеДок.Деталь,
    ДанныеДок.Требуется,
    СУММА(ЕСТЬNULL(ДанныеДок1.Требуется, 0)) КАК ПрошлыйРезерв
    ПОМЕСТИТЬ ДанныеСРезервом
    ИЗ
    ДанныеДок КАК ДанныеДок
    ЛЕВОЕ СОЕДИНЕНИЕ ДанныеДок КАК ДанныеДок1
    ПО ДанныеДок.НомерСтроки > ДанныеДок1.НомерСтроки
    И ДанныеДок.Деталь = ДанныеДок1.Деталь

    СГРУППИРОВАТЬ ПО
    ДанныеДок.НомерСтроки,
    ДанныеДок.Деталь,
    ДанныеДок.Требуется
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    ДанныеСРезервом.НомерСтроки,
    ДанныеСРезервом.Деталь,
    ДанныеСРезервом.Требуется,
    ВЫБОР
    КОГДА ОстаткиДеталей.Остаток - ДанныеСРезервом.ПрошлыйРезерв >= 0
    И ДанныеСРезервом.Требуется <= ОстаткиДеталей.Остаток - ДанныеСРезервом.ПрошлыйРезерв
    ТОГДА ДанныеСРезервом.Требуется
    КОГДА ОстаткиДеталей.Остаток - ДанныеСРезервом.ПрошлыйРезерв >= 0
    И ДанныеСРезервом.Требуется > ОстаткиДеталей.Остаток - ДанныеСРезервом.ПрошлыйРезерв
    ТОГДА ОстаткиДеталей.Остаток - ДанныеСРезервом.ПрошлыйРезерв
    ИНАЧЕ 0
    КОНЕЦ КАК Наличие
    ИЗ
    ДанныеСРезервом КАК ДанныеСРезервом
    ЛЕВОЕ СОЕДИНЕНИЕ ОстаткиДеталей КАК ОстаткиДеталей
    ПО ДанныеСРезервом.Деталь = ОстаткиДеталей.Деталь

    ОБЪЕДИНИТЬ ВСЕ

    ВЫБРАТЬ
    NULL,
    ОстаткиДеталей.Деталь,
    0,
    ВЫБОР
    КОГДА ОстаткиДеталей.Остаток - ДанныеСРезервом.ПрошлыйРезерв - ДанныеСРезервом.Требуется < 0
    ТОГДА -(ОстаткиДеталей.Остаток - ДанныеСРезервом.ПрошлыйРезерв - ДанныеСРезервом.Требуется)
    ИНАЧЕ 0
    КОНЕЦ
    ИЗ
    ДанныеСРезервом КАК ДанныеСРезервом
    ЛЕВОЕ СОЕДИНЕНИЕ ОстаткиДеталей КАК ОстаткиДеталей
    ПО ДанныеСРезервом.Деталь = ОстаткиДеталей.Деталь
    ГДЕ
    ВЫБОР
    КОГДА ОстаткиДеталей.Остаток - ДанныеСРезервом.ПрошлыйРезерв - ДанныеСРезервом.Требуется < 0
    ТОГДА -(ОстаткиДеталей.Остаток - ДанныеСРезервом.ПрошлыйРезерв - ДанныеСРезервом.Требуется)
    ИНАЧЕ 0
    КОНЕЦ > 0
```
---
Важное условие: сворачивать первую таблицу нельзя!
... но можно сделать копию ТЗ и свернуть её...
---
можно. Но задачу нужно решить именно запросом... В запросе можно использовать временные таблицы, сворачивать их и прочая. Но не выходя за рамки запроса, то есть выгрузить результат запроса в ТЗ и обработать нельзя
---
Это лабораторная по информатике?
---
нет, это нужно мне для решения конкретной задачи. Суть: заказать товар, которого не хватает на складе. Всё работает до тех пор, пока не встречаются случаи, когда товар в табличной части документа встречается больше одного раза. Ломать громоздкий механизм, в котором накручено очень много всего, нет ни желания, ни времени. Нужно переписать запрос так, чтобы работал...
---
- запретить дубли номенклатуры в ТЧ документа
- подсунуть в запрос ТЗ вместо ТЧ
- (совсем изврат) сделать дополнительную ТЧ в документе, где хранить свернутую ТЧ1

совсем не предлагать?

Ну, тогда придётся крепко подумать...
---
да, не предлагать. Если бы можно было - давно бы сделал. Вот "башька ломаю"...
---
запретить дубли номенклатуры в ТЧ документа - поддерживаю
---
лучше все-таки вариант с ТЗ вместо ТЧ, но автор вопроса не хочет переделывать текст запроса.

Изменений-то немного:
*ввести в запрос ТЗ как ВТ
*заменить обращение ТабЧасть. на ВТ. в тексте запроса...
---
Во вложении пример только запросом.
ТекстЗапроса
```1c
    ВЫБРАТЬ
    1 КАК НомерСтроки,
    "Гайка" КАК Деталь,
    4 КАК Требуется
    ПОМЕСТИТЬ ДанныеДок

    ОБЪЕДИНИТЬ ВСЕ

    ВЫБРАТЬ
    2,
    "Гайка",
    6
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    "Гайка" КАК Деталь,
    8 КАК Остаток
    ПОМЕСТИТЬ ОстаткиДеталей
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    ДанныеДок.НомерСтроки,
    ДанныеДок.Деталь,
    ДанныеДок.Требуется,
    СУММА(ЕСТЬNULL(ДанныеДок1.Требуется, 0)) КАК ПрошлыйРезерв
    ПОМЕСТИТЬ ДанныеСРезервом
    ИЗ
    ДанныеДок КАК ДанныеДок
    ЛЕВОЕ СОЕДИНЕНИЕ ДанныеДок КАК ДанныеДок1
    ПО ДанныеДок.НомерСтроки > ДанныеДок1.НомерСтроки
    И ДанныеДок.Деталь = ДанныеДок1.Деталь

    СГРУППИРОВАТЬ ПО
    ДанныеДок.НомерСтроки,
    ДанныеДок.Деталь,
    ДанныеДок.Требуется
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    ДанныеСРезервом.НомерСтроки,
    ДанныеСРезервом.Деталь,
    ДанныеСРезервом.Требуется,
    ВЫБОР
    КОГДА ОстаткиДеталей.Остаток - ДанныеСРезервом.ПрошлыйРезерв >= 0
    И ДанныеСРезервом.Требуется <= ОстаткиДеталей.Остаток - ДанныеСРезервом.ПрошлыйРезерв
    ТОГДА ДанныеСРезервом.Требуется
    КОГДА ОстаткиДеталей.Остаток - ДанныеСРезервом.ПрошлыйРезерв >= 0
    И ДанныеСРезервом.Требуется > ОстаткиДеталей.Остаток - ДанныеСРезервом.ПрошлыйРезерв
    ТОГДА ОстаткиДеталей.Остаток - ДанныеСРезервом.ПрошлыйРезерв
    ИНАЧЕ 0
    КОНЕЦ КАК Наличие
    ИЗ
    ДанныеСРезервом КАК ДанныеСРезервом
    ЛЕВОЕ СОЕДИНЕНИЕ ОстаткиДеталей КАК ОстаткиДеталей
    ПО ДанныеСРезервом.Деталь = ОстаткиДеталей.Деталь

    ОБЪЕДИНИТЬ ВСЕ

    ВЫБРАТЬ
    NULL,
    ОстаткиДеталей.Деталь,
    0,
    ВЫБОР
    КОГДА ОстаткиДеталей.Остаток - ДанныеСРезервом.ПрошлыйРезерв - ДанныеСРезервом.Требуется < 0
    ТОГДА -(ОстаткиДеталей.Остаток - ДанныеСРезервом.ПрошлыйРезерв - ДанныеСРезервом.Требуется)
    ИНАЧЕ 0
    КОНЕЦ
    ИЗ
    ДанныеСРезервом КАК ДанныеСРезервом
    ЛЕВОЕ СОЕДИНЕНИЕ ОстаткиДеталей КАК ОстаткиДеталей
    ПО ДанныеСРезервом.Деталь = ОстаткиДеталей.Деталь
    ГДЕ
    ВЫБОР
    КОГДА ОстаткиДеталей.Остаток - ДанныеСРезервом.ПрошлыйРезерв - ДанныеСРезервом.Требуется < 0
    ТОГДА -(ОстаткиДеталей.Остаток - ДанныеСРезервом.ПрошлыйРезерв - ДанныеСРезервом.Требуется)
    ИНАЧЕ 0
    КОНЕЦ > 0
```
---
(15) спасибо огроменное! Это то, что нужно.
Остался один момент... Ну теперь сам допилю.
---
Гуглим "нарастающий итог в запросе".
---
Дело в том, что при свертке ТЧ мы теряем коды строк. А терять их нельзя, так как в таком случае в дальнейшем теряется привязка к этим строкам.
Так мы должны знать, сколько товара по данной строке есть в наличии на складе, а сколько мы заказали на соседнем складе (Заказ на перемещение) или у поставщика (Заказ поставщику).
А строки разбиваются в связи со спецификой Заказов клиентов, загружаемых с сайта...
---
мы должны знать, сколько товара по данной строке есть в наличии на складе, а сколько мы заказали на соседнем складе (Заказ на перемещение) или у поставщика (Заказ поставщику)
чем гайка, которая "есть в наличии на складе" для первой строки заказа, отличается от гайки, которая тоже на складе, но "для другой строки заказа"?
По идее, ничем.
Основное - обеспечение потребности производства, а не учет, из какого источника покрывается потребность данного конкретного заказа.

Задача преобразуется к реализации удобочитаемого вывода из таблиц:
Потребность (заказ; деталь; количество)
ОстатокЦеха(деталь; количество)
ОстатокСкладов(деталь; количество)
ЗаказатьУпоставщика(деталь; количество)
---
Как то я не понимаю ваших извращений.
То есть, мы распределяем остатки по строкам таблицы Номенклатура, а то, чего нам не хватает - вывести в новую строку (№3). Так мы узнаем, сколько нам еще надо товара "заказать".
Как это сочетается с тем, что нельзя использовать пост. обработку запроса в коде?
Запрос ну никак не выведет вам в табличную часть строку.
В чем смысл ограничения на использование только запроса?
---
```1c
    ВЫБРАТЬ
    1 КАК Ном,
    "гайка" КАК товар,
    4 КАК Колво
    ПОМЕСТИТЬ тТаб

    ОБЪЕДИНИТЬ ВСЕ

    ВЫБРАТЬ
    2,
    "гайка",
    6

    ОБЪЕДИНИТЬ ВСЕ

    ВЫБРАТЬ
    3,
    "шайба",
    7

    ОБЪЕДИНИТЬ ВСЕ

    ВЫБРАТЬ
    4,
    "шайба",
    5
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    "гайка" КАК товар,
    8 КАК Остаток
    ПОМЕСТИТЬ тОст

    ОБЪЕДИНИТЬ ВСЕ

    ВЫБРАТЬ
    "шайба",
    20
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    тТаб.Ном,
    тТаб.товар,
    тТаб.Колво,
    СУММА(тТаб1.Колво) КАК КолвоОбщ
    ПОМЕСТИТЬ тТабНараст
    ИЗ
    тТаб КАК тТаб
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ тТаб КАК тТаб1
    ПО тТаб.товар = тТаб1.товар
    И тТаб.Ном >= тТаб1.Ном

    СГРУППИРОВАТЬ ПО
    тТаб.Ном,
    тТаб.товар,
    тТаб.Колво
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    тТабНараст.Ном,
    тТабНараст.товар,
    тТабНараст.Колво,
    тТабНараст.КолвоОбщ,
    ВЫБОР
    КОГДА тОст.Остаток >= тТабНараст.КолвоОбщ
    ТОГДА тТабНараст.Колво
    ИНАЧЕ ВЫБОР
    КОГДА тОст.Остаток - тТабНараст.КолвоОбщ + тТабНараст.Колво > 0
    ТОГДА тОст.Остаток - тТабНараст.КолвоОбщ + тТабНараст.Колво
    ИНАЧЕ 0
    КОНЕЦ
    КОНЕЦ КАК Взять
    ИЗ
    тТабНараст КАК тТабНараст
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ тОст КАК тОст
    ПО тТабНараст.товар = тОст.товар

    объединить все

    ВЫБРАТЬ
    "+",
    общ.товар, 0, 0,
    общ.Колво - тОст.Остаток КАК Поле1
    ИЗ
    (ВЫБРАТЬ
    тТаб.товар КАК товар,
    СУММА(тТаб.Колво) КАК Колво
    ИЗ
    тТаб КАК тТаб

    СГРУППИРОВАТЬ ПО
    тТаб.товар) КАК общ
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ тОст КАК тОст
    ПО общ.товар = тОст.товар
    И общ.Колво > тОст.Остаток
```
---
Упс, опередели.
---
Думаю, помочь должна вот эта статья: http://infostart.ru/public/266377/ .

Хотя там задача более стандартная: требуемое скалярное количество расписывается по остаткам партий.

А у вас исходные данные формируются наоборот: имеющийся скалярный остаток расписывается по требуемым "партиям строк заказа".
---
Спасибо! Полезная статья, вникну