Есть таблица значений, с колонками "Номенклатура", "Характеристика", "Склад", "Количество", которую формирует обработка и содержит данные типа:
Товар1, Красный, Основной, -3
Товар1, Красный, Оптовый, 1
Товар1, Красный, Отгрузка, 2
Товар2, Зеленый, Основной, 2
Товар2, Зеленый, Отгрузка, -1
Товар2, Зеленый, Оптовый, -1
Необходимо из движений в ТЗ создать документы "ПеремещениеТоваров". Как построить запрос, который создаст выборку типа:
Номенклатура, Характеристика, СкладОтправитель, СкладПолучатель, Количество.
Попробовал

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

Но когда движения имеют одинаковое количество (по модулю) - то все как надо, а если расход с двух - то удваивает - условие соединение не полное
---
ssa,
FIFO предполагает учет времени, чего я не увидел нигде.
Фифо предполагает направление сортировки, время тут не причем.

Итоговый текст запроса

```1c
    |ВЫБРАТЬ
    | ТЗ.Номенклатура КАК Товар,
    | ТЗ.Размер КАК Размер,
    | ТЗ.Склад,
    | ТЗ.Количество
    |ПОМЕСТИТЬ ВТ
    |ИЗ &ТЗ КАК ТЗ
    |ИНДЕКСИРОВАТЬ ПО ТЗ.Номенклатура, ТЗ.Размер, ТЗ.Склад
    |;
    |
    |//////////////////////////////////
    |ВЫБРАТЬ
    | ВТ.Товар,
    | ВТ.Склад,
    | ВТ.Размер,
    | -ВТ.Количество КАК Количество,
    | СУММА(-ВТ1.Количество) КАК КоличествоНИ
    |ПОМЕСТИТЬ Минусы
    |ИЗ ВТ КАК ВТ
    |ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ КАК ВТ1
    | ПО ВТ.Товар = ВТ1.Товар И ВТ.Размер = ВТ1.Размер И ВТ.Склад <= ВТ1.Склад
    |ГДЕ ВТ.Количество < 0 И ВТ1.Количество < 0
    |
    |СГРУППИРОВАТЬ ПО ВТ.Склад, ВТ.Товар, ВТ.Размер, -ВТ.Количество
    |ИНДЕКСИРОВАТЬ ПО ВТ.Товар, ВТ.Склад, ВТ.Размер
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |
    |ВЫБРАТЬ
    | ВТ.Товар,
    | ВТ.Склад,
    | ВТ.Размер,
    | ВТ.Количество,
    | СУММА(ВТ1.Количество) КАК КоличествоНИ
    |ПОМЕСТИТЬ Плюсы
    |ИЗ ВТ КАК ВТ
    |ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ КАК ВТ1
    | ПО ВТ.Товар = ВТ1.Товар И ВТ.Размер = ВТ1.Размер И ВТ.Склад <= ВТ1.Склад
    |ГДЕ ВТ.Количество > 0 И ВТ1.Количество > 0
    |СГРУППИРОВАТЬ ПО ВТ.Склад, ВТ.Товар, ВТ.Размер, ВТ.Количество
    |ИНДЕКСИРОВАТЬ ПО ВТ.Товар, ВТ.Склад, ВТ.Размер
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |
    |ВЫБРАТЬ
    | Минусы.Товар,
    | Минусы.Размер,
    | Минусы.Склад КАК СкладПолучатель,
    | Плюсы.Склад КАК СкладОтправитель,
    | ВЫБОР
    | КОГДА Плюсы.КоличествоНИ < Минусы.КоличествоНИ
    | ТОГДА Плюсы.КоличествоНИ
    | ИНАЧЕ Минусы.КоличествоНИ
    | КОНЕЦ - ВЫБОР
    | КОГДА Плюсы.КоличествоНИ - Плюсы.Количество < Минусы.КоличествоНИ - Минусы.Количество
    | ТОГДА Минусы.КоличествоНИ - Минусы.Количество
    | ИНАЧЕ Плюсы.КоличествоНИ - Плюсы.Количество
    | КОНЕЦ КАК Количество
    |ИЗ Минусы КАК Минусы
    |ВНУТРЕННЕЕ СОЕДИНЕНИЕ Плюсы КАК Плюсы
    | ПО Минусы.Товар = Плюсы.Товар И Минусы.Размер = Плюсы.Размер
    |ГДЕ
    | ВЫБОР
    | КОГДА Плюсы.КоличествоНИ < Минусы.КоличествоНИ
    | ТОГДА Плюсы.КоличествоНИ
    | ИНАЧЕ Минусы.КоличествоНИ
    | КОНЕЦ - ВЫБОР
    | КОГДА Плюсы.КоличествоНИ - Плюсы.Количество < Минусы.КоличествоНИ - Минусы.Количество
    | ТОГДА Минусы.КоличествоНИ - Минусы.Количество
    | ИНАЧЕ Плюсы.КоличествоНИ - Плюсы.Количество
    | КОНЕЦ > 0
```
---
newbas, сделайте вместо:

```1c
    | Приходы.Количество
```

так

```1c
    | Расходы.Количество * -1
```
---
LordTime,
Зачем?
Я мыслю так:
- Отбираю все приходы - склад - в склад получатель,
- Левым соединением присоединяю расходы - склад в склад отправитель. Соединение "Товар" и "Характеристика".
Но еще нужно условие, проверяющее достаточное количество
---
newbas, но расход же у вас может идти с разных складов, и тогда в итоге получается:
Товар2, Зеленый, Основной, Отгрузка, 2
Товар2, Зеленый, Основной, Оптовый, 2
Вместо:
Товар2, Зеленый, Основной, Отгрузка, 1
Товар2, Зеленый, Основной, Оптовый, 1
---
LordTime,
Знаю, именно это у меня и получилось и спрашиваю, как это исключить
---
newbas, да в (2) действительно не правильно. Нужно так:

```1c
    ВЫБОР
    КОГДА Приходы.Количество <= Расходы.Количество
    ТОГДА Приходы.Количество
    ИНАЧЕ Расходы.Количество
    КОНЕЦ КАК Количество
```
---
К тому же согласен с SSA, вариант предложенный в (9) будет работать, но только на том наборе данных, который вы указали в (1), если возникнет ситуация описанная в (10), то все равно данные задвоятся.
---
LordTime,
Вот и надо как-то предотвратить задвоение
---
newbas, Раз как-то, то боюсь одним запросом не отделаетесь.
Надо будет перебирать в цикле и проверять, а не спишем ли мы со склада больше чем пришло.
Если Спишем, то брать следующий приходник и так далее.
Хотя странное это как-то... вы не знаете с какого на какой склад отправлять?
---
newbas,
вы можете предложить решение в примере из (10)? На уровне логики.
---
ssa,

```1c
    даже логически невозможно однозначно определить, с какого склада (1 или 4) было поступление на склад 3, например.
```

А однозначно и нет необходимости определять - достаточно метода FIFO как в (15) или http://www.forum.mista.ru/topic.php?id=673883
---
newbas, такие вещи делаются не через соединение а через объединение и сгруппировать
---
m-serg74,
Приведите пример
---
newbas, в общем случае как то примерно так:

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

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    Вложение.Номенклатура,
    Вложение.Размер,
    Вложение.СкладПолучатель,
    Вложение.СкладОтправитель,
    СУММА(Вложение.Приход) КАК Приход,
    СУММА(Вложение.Расход) КАК Расход
    ИЗ
    (ВЫБРАТЬ
    иТЗ.Номенклатура КАК Номенклатура,
    иТЗ.Размер КАК Размер,
    иТЗ.Склад КАК СкладПолучатель,
    " КАК СкладОтправитель,
    иТЗ.Количество КАК Приход,
    0 КАК Расход
    ИЗ
    иТЗ КАК иТЗ
    ГДЕ
    иТЗ.Количество > 0

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

    ВЫБРАТЬ
    иТЗ.Номенклатура,
    иТЗ.Размер,
    ",
    иТЗ.Склад,
    0,
    -иТЗ.Количество
    ИЗ
    иТЗ КАК иТЗ
    ГДЕ
    иТЗ.Количество < 0) КАК Вложение

    СГРУППИРОВАТЬ ПО
    Вложение.Номенклатура,
    Вложение.Размер,
    Вложение.СкладПолучатель,
    Вложение.СкладОтправитель
```
---
ну дык сверни таблички в подзапросе
---
Ёпрст,
А что это даст?
Вот сверни
Товар1, Красный, Основной, -3
Товар1, Красный, Оптовый, 1
Товар1, Красный, Отгрузка, 2
Товар2, Зеленый, Основной, 2
Товар2, Зеленый, Отгрузка, -1
Товар2, Зеленый, Оптовый, -1
- получится тоже самое или я чего-то не пойму
---
Никак. Поскольку однозначного решения задачи по исходным условиям не существует.
---
Предположим, по одной и той же аналитике были движения:
Склад1 Склад2 2шт.
Склад4 Склад3 2шт.
Имея исходные данные:
Склад1 -2,
Склад4 -2,
Склад2 2,
Склад3 2,
даже логически невозможно однозначно определить, с какого склада (1 или 4) было поступление на склад 3, например.
---
|ЛЕВОЕ СОЕДИНЕНИЕ
      | (ВЫБРАТЬ
      | иТЗ.Номенклатура,
      | иТЗ.Размер,
      | иТЗ.Склад,
      | -иТЗ.Количество КАК Количество
      | ИЗ иТЗ
      | ГДЕ иТЗ.Количество<0
      | ) КАК Расходы
      |ПО Приходы.Номенклатура=Расходы.Номенклатура И Приходы.Размер = Расходы.Размер

Этот кусок убери

-иТЗ.Количество КАК Количество

Тут зачем - ?
---
coder,
-иТЗ.Количество КАК Количество
Тут зачем - ?
Затем, что сначала было

```1c
    ПО Приходы.Номенклатура=Расходы.Номенклатура И Приходы.Размер = Расходы.Размер И Приходы.Количество=Расходы.Количество
```
---
А после обьединишь и сгрупируешь вместо левого соединения
---
Непонял как сначало ?
---
Я имел ввиду минус впереди зачем ?
---
coder,
Затем, что числа отрицательные
---
достаточно метода FIFO
FIFO предполагает учет времени, чего я не увидел нигде.
А однозначно и нет необходимости определять
Может, я чего-то не догоняю, но в этом случае в "Перемещениях товаров" склады могут быть перепутаны.
Ну да ладно, хозяин - барин )
---
ssa,
FIFO предполагает учет времени, чего я не увидел нигде.
Фифо предполагает направление сортировки, время тут не причем.

Итоговый текст запроса

```1c
    |ВЫБРАТЬ
    | ТЗ.Номенклатура КАК Товар,
    | ТЗ.Размер КАК Размер,
    | ТЗ.Склад,
    | ТЗ.Количество
    |ПОМЕСТИТЬ ВТ
    |ИЗ &ТЗ КАК ТЗ
    |ИНДЕКСИРОВАТЬ ПО ТЗ.Номенклатура, ТЗ.Размер, ТЗ.Склад
    |;
    |
    |//////////////////////////////////
    |ВЫБРАТЬ
    | ВТ.Товар,
    | ВТ.Склад,
    | ВТ.Размер,
    | -ВТ.Количество КАК Количество,
    | СУММА(-ВТ1.Количество) КАК КоличествоНИ
    |ПОМЕСТИТЬ Минусы
    |ИЗ ВТ КАК ВТ
    |ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ КАК ВТ1
    | ПО ВТ.Товар = ВТ1.Товар И ВТ.Размер = ВТ1.Размер И ВТ.Склад <= ВТ1.Склад
    |ГДЕ ВТ.Количество < 0 И ВТ1.Количество < 0
    |
    |СГРУППИРОВАТЬ ПО ВТ.Склад, ВТ.Товар, ВТ.Размер, -ВТ.Количество
    |ИНДЕКСИРОВАТЬ ПО ВТ.Товар, ВТ.Склад, ВТ.Размер
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |
    |ВЫБРАТЬ
    | ВТ.Товар,
    | ВТ.Склад,
    | ВТ.Размер,
    | ВТ.Количество,
    | СУММА(ВТ1.Количество) КАК КоличествоНИ
    |ПОМЕСТИТЬ Плюсы
    |ИЗ ВТ КАК ВТ
    |ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ КАК ВТ1
    | ПО ВТ.Товар = ВТ1.Товар И ВТ.Размер = ВТ1.Размер И ВТ.Склад <= ВТ1.Склад
    |ГДЕ ВТ.Количество > 0 И ВТ1.Количество > 0
    |СГРУППИРОВАТЬ ПО ВТ.Склад, ВТ.Товар, ВТ.Размер, ВТ.Количество
    |ИНДЕКСИРОВАТЬ ПО ВТ.Товар, ВТ.Склад, ВТ.Размер
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |
    |ВЫБРАТЬ
    | Минусы.Товар,
    | Минусы.Размер,
    | Минусы.Склад КАК СкладПолучатель,
    | Плюсы.Склад КАК СкладОтправитель,
    | ВЫБОР
    | КОГДА Плюсы.КоличествоНИ < Минусы.КоличествоНИ
    | ТОГДА Плюсы.КоличествоНИ
    | ИНАЧЕ Минусы.КоличествоНИ
    | КОНЕЦ - ВЫБОР
    | КОГДА Плюсы.КоличествоНИ - Плюсы.Количество < Минусы.КоличествоНИ - Минусы.Количество
    | ТОГДА Минусы.КоличествоНИ - Минусы.Количество
    | ИНАЧЕ Плюсы.КоличествоНИ - Плюсы.Количество
    | КОНЕЦ КАК Количество
    |ИЗ Минусы КАК Минусы
    |ВНУТРЕННЕЕ СОЕДИНЕНИЕ Плюсы КАК Плюсы
    | ПО Минусы.Товар = Плюсы.Товар И Минусы.Размер = Плюсы.Размер
    |ГДЕ
    | ВЫБОР
    | КОГДА Плюсы.КоличествоНИ < Минусы.КоличествоНИ
    | ТОГДА Плюсы.КоличествоНИ
    | ИНАЧЕ Минусы.КоличествоНИ
    | КОНЕЦ - ВЫБОР
    | КОГДА Плюсы.КоличествоНИ - Плюсы.Количество < Минусы.КоличествоНИ - Минусы.Количество
    | ТОГДА Минусы.КоличествоНИ - Минусы.Количество
    | ИНАЧЕ Плюсы.КоличествоНИ - Плюсы.Количество
    | КОНЕЦ > 0
```