Имя: Пароль:
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) пожалуйста
есть одно условие: входящая таблица должна быть свёрнута, т.е. все строки должны быть уникальны по набору измерений
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn