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

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

Но когда движения имеют одинаковое количество (по модулю) - то все как надо, а если расход с двух - то удваивает - условие соединение не полное
1 Ненавижу 1С
 
гуру
22.07.13
12:49
как быть с такой таблицей?

Товар1, Красный, Верхний, -1
Товар1, Красный, Нижний, -1
Товар1, Красный, Левый, 1
Товар1, Красный, Правый, 1
2 cw014
 
22.07.13
12:51
Замени:

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

на

|   ВЫБОР КОГДА Приходы.Количество > Расходы.Количество ТОГДА Расходы.Количество ИНАЧЕ Приходы.Количество КОНЕЦ КАК Количество
3 cw014
 
22.07.13
12:51
+(1) Да, вот хороший вопрос
4 newbas
 
22.07.13
12:57
(1)
Должно быть 2 перемещения:
Верхний Левый 1
Нижний Правый 1
(2)
Зачем?
5 cw014
 
22.07.13
13:02
(4) 1.А почему не так?
Нижний Левый 1
Верхний Правый 1
2. Потому что у тебя дублируются строки и в одной из колонок "количество" у прихода и у расхода дублируются количество. Если брать минимальное значение, то тогда ты будешь перемещать либо то, что есть на приходе, либо то, чего не хватает на втором
Например:
Товар1, Красный, Основной, -3
Товар1, Красный, Оптовый, 1
Товар1, Красный, Отгрузка, 2

При этом у тебя таблицы "Приход"
Товар1, Красный, Оптовый, 1
Товар1, Красный, Отгрузка, 2

Расход
Товар1, Красный, Основной, 3

при соединении создадут

Товар1, Красный, Оптовый, Основной, 1, 3
Товар1, Красный, Отгрузка, Основной, 2, 3

При таком повороте у тебя в таблице останутся:
Товар1, Красный, Оптовый, Основной, 1
Товар1, Красный, Отгрузка, Основной, 2
6 newbas
 
22.07.13
13:05
(5) согласен, однако (1) это не решает
7 Ненавижу 1С
 
гуру
22.07.13
13:05
(4) почему:
Верхний Левый 1
Нижний Правый 1
а не:
Нижний Левый 1
Верхний Правый 1
8 newbas
 
22.07.13
13:06
(7) а все равно либо 1 вариант, либо второй - разницы нет.
9 Ненавижу 1С
 
гуру
22.07.13
13:12
(8) это тебе разницы нет, а тут системе выбор делать
10 newbas
 
22.07.13
22:02
Быстрого и красивого решения видимо нет - придется делать перебором ТЗ
11 RomanYS
 
22.07.13
22:12
можно подготовить 2 ВТ нарастающим итогом положительную и отрицательную, а потом соединять их по пересечению. Ищи "ФИФО запросом", смысл такой же.
12 RomanYS
 
22.07.13
22:38
+(11) как-то так:

ВЫБРАТЬ
   ТЗ.Товар,
   ТЗ.Склад,
   ТЗ.Количество
ПОМЕСТИТЬ ВТ
ИЗ
   &ТЗ КАК ТЗ
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ВТ.Товар,
   ВТ.Склад,
   -ВТ.Количество КАК Количество,
   СУММА(-ВТ1.Количество) КАК КоличествоНИ
ПОМЕСТИТЬ Минусы
ИЗ
   ВТ КАК ВТ
       ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ КАК ВТ1
       ПО ВТ.Товар = ВТ1.Товар
           И ВТ.Склад <= ВТ1.Склад
ГДЕ
   ВТ.Количество < 0
   И ВТ1.Количество < 0

СГРУППИРОВАТЬ ПО
   ВТ.Склад,
   ВТ.Товар,
   -ВТ.Количество
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ВТ.Товар,
   ВТ.Склад,
   ВТ.Количество,
   СУММА(ВТ1.Количество) КАК КоличествоНИ
ПОМЕСТИТЬ Плюсы
ИЗ
   ВТ КАК ВТ
       ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ КАК ВТ1
       ПО ВТ.Товар = ВТ1.Товар
           И ВТ.Склад <= ВТ1.Склад
ГДЕ
   ВТ.Количество > 0
   И ВТ1.Количество > 0

СГРУППИРОВАТЬ ПО
   ВТ.Склад,
   ВТ.Товар,
   ВТ.Количество
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   Минусы.Товар,
   Минусы.Склад КАК СкладПолучатель,
   Плюсы.Склад КАК СкладОтправитель,
   ВЫБОР
       КОГДА Плюсы.КоличествоНИ < Минусы.КоличествоНИ
           ТОГДА Плюсы.КоличествоНИ
       ИНАЧЕ Минусы.КоличествоНИ
   КОНЕЦ - ВЫБОР
       КОГДА Плюсы.КоличествоНИ - Плюсы.Количество < Минусы.КоличествоНИ - Минусы.Количество
           ТОГДА Минусы.КоличествоНИ - Минусы.Количество
       ИНАЧЕ Плюсы.КоличествоНИ - Плюсы.Количество
   КОНЕЦ КАК Количество
ИЗ
   Минусы КАК Минусы
       ВНУТРЕННЕЕ СОЕДИНЕНИЕ Плюсы КАК Плюсы
       ПО Минусы.Товар = Плюсы.Товар
ГДЕ
   ВЫБОР
           КОГДА Плюсы.КоличествоНИ < Минусы.КоличествоНИ
               ТОГДА Плюсы.КоличествоНИ
           ИНАЧЕ Минусы.КоличествоНИ
       КОНЕЦ - ВЫБОР
           КОГДА Плюсы.КоличествоНИ - Плюсы.Количество < Минусы.КоличествоНИ - Минусы.Количество
               ТОГДА Минусы.КоличествоНИ - Минусы.Количество
           ИНАЧЕ Плюсы.КоличествоНИ - Плюсы.Количество
       КОНЕЦ > 0
13 RomanYS
 
22.07.13
22:46
(10) если складов не слишком много, (12) будет быстрее перебора, только индексы надо ещё в ВТ добавить на товар (и характеристику)
14 newbas
 
23.07.13
21:08
(13) Спасибо - все отлично работает.
15 newbas
 
23.07.13
21:16
Спасибо (13) полный текст запроса

   |ВЫБРАТЬ
   |   ТЗ.Номенклатура КАК ТОвар,
   |   ТЗ.Размер        КАК Размер,
   |   ТЗ.Склад,
   |   ТЗ.Количество
   |ПОМЕСТИТЬ ВТ
   |ИЗ &ТЗ КАК ТЗ
   |ИНДЕКСИРОВАТЬ ПО ТЗ.Номенклатура, ТЗ.Размер, ТЗ.Склад
   |;
   |
   |//////////////////////////////////
   |ВЫБРАТЬ
   |    ВТ.Товар,
   |   ВТ.Склад,
   |    ВТ.Размер,
   |   -ВТ.Количество КАК Количество,
   |   СУММА(-ВТ1.Количество) КАК КоличествоНИ
   |ПОМЕСТИТЬ Минусы
   |ИЗ ВТ КАК ВТ
   |ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ КАК ВТ1
   |    ПО ВТ.Товар = ВТ1.Товар И ВТ.Размер = ВТ1.Размер И ВТ.Склад <= ВТ1.Склад
   |ГДЕ ВТ.Количество < 0 И ВТ1.Количество < 0
   |
   |СГРУППИРОВАТЬ ПО ВТ.Склад, ВТ.Товар, ВТ.Размер, -ВТ.Количество
   |ИНДЕКСИРОВАТЬ ПО
   |    ВТ.Товар,
   |   ВТ.Склад,
   |    ВТ.Размер
   |;
   |
   |////////////////////////////////////////////////////////////////////////////////
   |
   |ВЫБРАТЬ
   |   ВТ.Товар,
   |   ВТ.Склад,
   |    ВТ.Размер,
   |   ВТ.Количество,
   |   СУММА(ВТ1.Количество) КАК КоличествоНИ
   |ПОМЕСТИТЬ Плюсы
   |ИЗ ВТ КАК ВТ
   |ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ КАК ВТ1
   |    ПО ВТ.Товар = ВТ1.Товар И ВТ.Размер = ВТ1.Размер И ВТ.Склад <= ВТ1.Склад
   |ГДЕ ВТ.Количество > 0 И ВТ1.Количество > 0
   |СГРУППИРОВАТЬ ПО ВТ.Склад, ВТ.Товар, ВТ.Размер, ВТ.Количество
   |ИНДЕКСИРОВАТЬ ПО
   |    ВТ.Товар,
   |   ВТ.Склад,
   |    ВТ.Размер
   |;
   |
   |////////////////////////////////////////////////////////////////////////////////
   |
   |ВЫБРАТЬ
   |   Минусы.Товар,
   |    Минусы.Размер,
   |   Минусы.Склад КАК СкладПолучатель,
   |   Плюсы.Склад КАК СкладОтправитель,
   |   ВЫБОР
   |       КОГДА Плюсы.КоличествоНИ < Минусы.КоличествоНИ
   |           ТОГДА Плюсы.КоличествоНИ
   |       ИНАЧЕ Минусы.КоличествоНИ
   |   КОНЕЦ - ВЫБОР
   |       КОГДА Плюсы.КоличествоНИ - Плюсы.Количество < Минусы.КоличествоНИ - Минусы.Количество
   |           ТОГДА Минусы.КоличествоНИ - Минусы.Количество
   |       ИНАЧЕ Плюсы.КоличествоНИ - Плюсы.Количество
   |   КОНЕЦ КАК Количество
   |ИЗ Минусы КАК Минусы
   |ВНУТРЕННЕЕ СОЕДИНЕНИЕ Плюсы КАК Плюсы
   |    ПО Минусы.Товар = Плюсы.Товар И Минусы.Размер = Плюсы.Размер
   |ГДЕ
   |   ВЫБОР
   |      КОГДА Плюсы.КоличествоНИ < Минусы.КоличествоНИ
   |              ТОГДА Плюсы.КоличествоНИ
   |       ИНАЧЕ Минусы.КоличествоНИ
   |   КОНЕЦ - ВЫБОР
   |           КОГДА Плюсы.КоличествоНИ - Плюсы.Количество < Минусы.КоличествоНИ - Минусы.Количество
   |               ТОГДА Минусы.КоличествоНИ - Минусы.Количество
   |           ИНАЧЕ Плюсы.КоличествоНИ - Плюсы.Количество
   |   КОНЕЦ > 0
16 RomanYS
 
23.07.13
21:18
(14) пожалуйста
есть одно условие: входящая таблица должна быть свёрнута, т.е. все строки должны быть уникальны по набору измерений