Имя: Пароль:
1C
1С v8
Связать несколько таблиц в запросе
,
0 MRAK
 
05.04.12
11:27
Уважаемые коллеги, что-то никак не соображу.

Имеется таблица Остатки с измерениями Склад, Номенклатура.
Имеется таблица Аналоги с измерениями Номенклатура, Аналог.
Нужен запрос, выводящий сумму остатков в разрезе склада по номенклатуре и аналогу.

ВЫБРАТЬ
   ОстаткиОстатки.КоличествоОстаток + ОстаткиОстатки1.КоличествоОстаток КАК Поле1
ИЗ
   РегистрНакопления.Остатки.Остатки КАК ОстаткиОстатки
       ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Остатки.Остатки КАК уатОстаткиГСМнаТСОстатки1
       ПО Остатки.Склад = Остатки.Склад,
   РегистрСведений.Аналоги КАК Аналоги
       ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Аналоги КАК Аналоги
       ПО Остатки.Номенклатура = Аналоги.Номенклатура

А как теперь присоединить в аналогам Остатки1, чтобы не было противоречивой связи?
1 vmv
 
05.04.12
11:28
Радченко "Коротко о главном" "Пример запроса с остатками", изучай
2 Wobland
 
05.04.12
11:28
РегистрНакопления.Остатки.Остатки КАК ОстаткиОстатки
мда...
3 Kashemir
 
05.04.12
11:28
Это зачем ? "РегистрНакопления.Остатки.Остатки КАК ОстаткиОстатки
       ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Остатки.Остатки КАК уатОстаткиГСМнаТСОстатки1"
4 salvator
 
05.04.12
11:29
Прямо MRAK какой-то!..
5 MRAK
 
05.04.12
11:30
(3) пусть так будет. Писал вручную
ВЫБРАТЬ
   ОстаткиОстатки.КоличествоОстаток + ОстаткиОстатки1.КоличествоОстаток КАК Поле1
ИЗ
   РегистрНакопления.Остатки.Остатки КАК ОстаткиОстатки
       ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Остатки.Остатки КАК Остатки1
       ПО Остатки.Склад = Остатки.Склад,
   РегистрСведений.Аналоги КАК Аналоги
       ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Аналоги КАК Аналоги
       ПО Остатки.Номенклатура = Аналоги.Номенклатура
6 vmv
 
05.04.12
11:30
(5) конструктор у вас не пашет?
7 MRAK
 
05.04.12
11:30
может, так:

ВЫБРАТЬ
   Остатки.КоличествоОстаток + Остатки1.КоличествоОстаток КАК Поле1
ИЗ
   РегистрНакопления.уатОстаткиГСМнаТС.Остатки КАК Остатки,
   РегистрНакопления.уатОстаткиГСМнаТС.Остатки КАК Остатки1,
   РегистрСведений.Аналоги КАК Аналоги
ГДЕ
   Остатки.ТС = Остатки1.ТС
   И Аналоги.ГСМ = Остатки.ГСМ
   И Аналоги.Аналог = Остатки1.ГСМ
8 Kashemir
 
05.04.12
11:31
Если аналогов не больше 1 для каждой номенклатуры - достаточно левой связи. Если больше - то пользуйся соединением наборов СКД либо как нибудь размазывай остаток по номенклатуре по всем аналогам.
9 MRAK
 
05.04.12
11:31
(7) + то есть, без соединений?
10 Kashemir
 
05.04.12
11:31
(0) Вот нафига тебе 2 обращения к остатком - что за бред ?
11 MRAK
 
05.04.12
11:32
(10) а как надо? у меня что-то конкретный тупняк
12 КМ155
 
05.04.12
11:32
(10) ТС ответь на один вопрос,
у одного товара один аналог или несколько
13 Buster007
 
05.04.12
11:33
(10) чем больше, тем лучше ))
14 Kashemir
 
05.04.12
11:34
(11) Начни с логики. Возьми эксель и попробуй нарисовать таблицы источники и финальную таблицу.
15 MRAK
 
05.04.12
11:35
(12) пусть будет несколько
16 Kashemir
 
05.04.12
11:36
(15) Ну и как ты будешь остаток по номенклатуре распределять по аналогам ?
17 MRAK
 
05.04.12
11:36
(16) сливать в одну номенклатуру
18 Kashemir
 
05.04.12
11:37
(17) Ник не зря себе выбрал
19 MRAK
 
05.04.12
11:37
(18) :)))
20 Buster007
 
05.04.12
11:38
присоединяешь аналоги к остаткам и из РС тащишь Ресурс (наверное в нем содержится объединяющая номенклатура) и группируешь потом...
непонятно в чем проблема...
21 MRAK
 
05.04.12
11:39
(18) задача такая:
выводим список документов, номенклатуру, которая фигурирует в документе + остаток по ней и аналогам (не разбивая по аналогам)
22 Kashemir
 
05.04.12
11:39
(19) У тебя есть 2 таблицы
Остатки:
Склад1 Номенклатура1 Остаток 100

Аналоги:
Номенклатура1 Аналог1
Номенклатура1 Аналог2
Номенклатура1 Аналог3

Покажи состав финальной таблицы, которую ты хочешь получить
23 MRAK
 
05.04.12
11:41
(22)
Склад1 Номенклатура1 Остаток 100
Склад1 Номенклатура2 Остаток 50

Номенклатура1 Аналог Номенклатура2

Финальная:
Склад1 Номенклатура1 Остаток 150
24 MRAK
 
05.04.12
11:41
(23) + см (21)
25 MRAK
 
05.04.12
11:42
+ то есть, ключевая номенклатура (Номенклатура1) - та, которая присутствует в документе
26 Kashemir
 
05.04.12
11:42
(23) А что будет если

Склад1 Номенклатура1 Остаток 100
Склад1 Номенклатура2 Остаток 50

Номенклатура1 Аналог Номенклатура2
Номенклатура2 Аналог Номенклатура1

?
27 Kashemir
 
05.04.12
11:43
(23) Так же что будет если

Склад1 Номенклатура1 Остаток 100
Склад1 Номенклатура2 Остаток 50
Склад1 Номенклатура3 Остаток 20

Номенклатура1 Аналог Номенклатура2
Номенклатура1 Аналог Номенклатура3
Номенклатура2 Аналог Номенклатура3

?
28 MRAK
 
05.04.12
11:44
(26) написал же в (21) и (25).
Сейчас детальней напишу

Склад1 Номенклатура1 Остаток 100
Склад1 Номенклатура2 Остаток 50

Мы выводим таблицу
Документ1 Склад1 Номенклатура1

Соединяем ее с таблицей остатков

Получаем
Документ1 Склад1 Номенклатура1 Остаток 150
29 MRAK
 
05.04.12
11:46
(27) будем считать упрощенно. Нужно только

Номенклатура1 Аналог Номенклатура2
Номенклатура1 Аналог Номенклатура3
30 Kashemir
 
05.04.12
11:47
(28) Я просил ответить на мой вопрос, а не задавать свои.
(29) Упрощенно это не так как хочется, а так как может быть согласно исходным данным.

Ладно я умываю руки, трачу время впустую.
31 MRAK
 
05.04.12
11:48
(30) где я вопросы задаю? 8-О
32 ssh2006
 
05.04.12
11:57
Остатки с учетом аналогов можно получить сделав левое соединение таблицы остатков с регистром аналогов:
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Аналоги КАК Аналоги
       ПО Остатки.Номенклатура = Аналоги.АНАЛОГ

и затем сгруппировать по полю ЕСТЬNULL(Аналоги.АНАЛОГ, Остатки.Номенклатура)
Искомый остаток - Сумма(Остаток)
33 КМ155
 
05.04.12
11:59
(31) не отвлекайся:
ВЫБРАТЬ
   АналогиНоменклатуры.Номенклатура,
   Аналоги.Склад КАК Складаналога,
   СУММА(Аналоги.КоличествоОстаток) КАК ОстатокАналогов
ПОМЕСТИТЬ ОстаткиАналогов
ИЗ
   РегистрСведений.АналогиНоменклатуры КАК АналогиНоменклатуры
       ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки КАК Аналоги
       ПО АналогиНоменклатуры.Аналог = Аналоги.Номенклатура

СГРУППИРОВАТЬ ПО
   АналогиНоменклатуры.Номенклатура,
   Аналоги.Склад
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ТоварыНаСкладахОстатки.Номенклатура,
   ТоварыНаСкладахОстатки.Склад,
   ТоварыНаСкладахОстатки.КоличествоОстаток,
   ОстаткиАналогов.Складаналога КАК СкладАналога,
   ОстаткиАналогов.ОстатокАналогов
ИЗ
   РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки
       ЛЕВОЕ СОЕДИНЕНИЕ ОстаткиАналогов КАК ОстаткиАналогов
       ПО ТоварыНаСкладахОстатки.Номенклатура = ОстаткиАналогов.Номенклатура
           И ТоварыНаСкладахОстатки.Склад = ОстаткиАналогов.Складаналога
34 КМ155
 
05.04.12
12:00
(33) с выводом аналога:
ВЫБРАТЬ
   АналогиНоменклатуры.Номенклатура,
   Аналоги.Склад КАК Складаналога,
   СУММА(Аналоги.КоличествоОстаток) КАК ОстатокАналогов
ПОМЕСТИТЬ ОстаткиАналогов
ИЗ
   РегистрСведений.АналогиНоменклатуры КАК АналогиНоменклатуры
       ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки КАК Аналоги
       ПО АналогиНоменклатуры.Аналог = Аналоги.Номенклатура

СГРУППИРОВАТЬ ПО
   АналогиНоменклатуры.Номенклатура,
   Аналоги.Склад
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ТоварыНаСкладахОстатки.Номенклатура,
   ТоварыНаСкладахОстатки.Склад,
   ТоварыНаСкладахОстатки.КоличествоОстаток,
   ОстаткиАналогов.Складаналога КАК СкладАналога,
   ОстаткиАналогов.ОстатокАналогов
ИЗ
   РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки
       ЛЕВОЕ СОЕДИНЕНИЕ ОстаткиАналогов КАК ОстаткиАналогов
       ПО ТоварыНаСкладахОстатки.Номенклатура = ОстаткиАналогов.Номенклатура
           И ТоварыНаСкладахОстатки.Склад = ОстаткиАналогов.Складаналога
35 КМ155
 
05.04.12
12:01
(34) вернее так:
ВЫБРАТЬ
   АналогиНоменклатуры.Номенклатура,
   Аналоги.Склад КАК Складаналога,
   СУММА(Аналоги.КоличествоОстаток) КАК ОстатокАналогов,
   АналогиНоменклатуры.Аналог
ПОМЕСТИТЬ ОстаткиАналогов
ИЗ
   РегистрСведений.АналогиНоменклатуры КАК АналогиНоменклатуры
       ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки КАК Аналоги
       ПО АналогиНоменклатуры.Аналог = Аналоги.Номенклатура

СГРУППИРОВАТЬ ПО
   АналогиНоменклатуры.Номенклатура,
   Аналоги.Склад,
   АналогиНоменклатуры.Аналог
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ТоварыНаСкладахОстатки.Номенклатура,
   ТоварыНаСкладахОстатки.Склад,
   ТоварыНаСкладахОстатки.КоличествоОстаток,
   ОстаткиАналогов.Складаналога КАК СкладАналога,
   ОстаткиАналогов.ОстатокАналогов,
   ОстаткиАналогов.Аналог
ИЗ
   РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки
       ЛЕВОЕ СОЕДИНЕНИЕ ОстаткиАналогов КАК ОстаткиАналогов
       ПО ТоварыНаСкладахОстатки.Номенклатура = ОстаткиАналогов.Номенклатура
           И ТоварыНаСкладахОстатки.Склад = ОстаткиАналогов.Складаналога
36 ssh2006
 
05.04.12
12:05
+(32) *группировка по полю ЕСТЬNULL(Аналоги.Номенклатура, Остатки.Номенклатура)
37 ssh2006
 
05.04.12
12:10
(35) Если самого товара нет на остатке, но есть остаток аналогов неверно  покажет
38 MRAK
 
05.04.12
12:14
Спасибо большое всем участникам!

Я просто сказочно тупил)))
39 cw014
 
05.04.12
12:18
Меня одного смутила строка:

ПО Остатки.Склад = Остатки.Склад

???
40 КМ155
 
05.04.12
12:19
(35) ну а совсем красиво будет так:



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

СГРУППИРОВАТЬ ПО
   АналогиНоменклатуры.Номенклатура,
   Аналоги.Склад,
   АналогиНоменклатуры.Аналог
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ОстаткиАналогов.Номенклатура,
   ОстаткиАналогов.Складаналога,
   СУММА(ОстаткиАналогов.ОстатокАналогов) КАК ОстатокАналогов
ПОМЕСТИТЬ РасчётКоэффициента
ИЗ
   ОстаткиАналогов КАК ОстаткиАналогов

СГРУППИРОВАТЬ ПО
   ОстаткиАналогов.Номенклатура,
   ОстаткиАналогов.Складаналога
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ТоварыНаСкладахОстатки.Номенклатура,
   ТоварыНаСкладахОстатки.Склад,
   ВЫБОР
       КОГДА РасчётКоэффициента.ОстатокАналогов ЕСТЬ NULL
           ТОГДА ТоварыНаСкладахОстатки.КоличествоОстаток
       ИНАЧЕ ОстаткиАналогов.ОстатокАналогов / РасчётКоэффициента.ОстатокАналогов * ТоварыНаСкладахОстатки.КоличествоОстаток
   КОНЕЦ КАК ОстатокТовара,
   ОстаткиАналогов.Аналог,
   ОстаткиАналогов.Складаналога КАК СкладАналога,
   ОстаткиАналогов.ОстатокАналогов
ИЗ
   РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки
       ЛЕВОЕ СОЕДИНЕНИЕ ОстаткиАналогов КАК ОстаткиАналогов
       ПО ТоварыНаСкладахОстатки.Номенклатура = ОстаткиАналогов.Номенклатура
           И ТоварыНаСкладахОстатки.Склад = ОстаткиАналогов.Складаналога
       ЛЕВОЕ СОЕДИНЕНИЕ РасчётКоэффициента КАК РасчётКоэффициента
       ПО ТоварыНаСкладахОстатки.Склад = РасчётКоэффициента.Складаналога
           И ТоварыНаСкладахОстатки.Номенклатура = РасчётКоэффициента.Номенклатура
41 MRAK
 
05.04.12
12:28
(40) замечательно!
42 КМ155
 
05.04.12
12:32
(41) ты понимаешь, что если аналогов несколько, то будет ошибка огругления и что надо делать приведение  ВЫБОР
       КОГДА РасчётКоэффициента.ОстатокАналогов ЕСТЬ NULL
           ТОГДА ТоварыНаСкладахОстатки.КоличествоОстаток
       ИНАЧЕ ОстаткиАналогов.ОстатокАналогов / РасчётКоэффициента.ОстатокАналогов * ТоварыНаСкладахОстатки.КоличествоОстаток


к число 15.3 ?
43 КМ155
 
05.04.12
12:36
(42) как то так


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

СГРУППИРОВАТЬ ПО
   АналогиНоменклатуры.Номенклатура,
   Аналоги.Склад,
   АналогиНоменклатуры.Аналог
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ОстаткиАналогов.Номенклатура,
   ОстаткиАналогов.Складаналога,
   СУММА(ОстаткиАналогов.ОстатокАналогов) КАК ОстатокАналогов
ПОМЕСТИТЬ РасчётКоэффициента
ИЗ
   ОстаткиАналогов КАК ОстаткиАналогов

СГРУППИРОВАТЬ ПО
   ОстаткиАналогов.Номенклатура,
   ОстаткиАналогов.Складаналога
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ТоварыНаСкладахОстатки.Номенклатура,
   ТоварыНаСкладахОстатки.Склад,
   ВЫРАЗИТЬ(ВЫБОР
           КОГДА РасчётКоэффициента.ОстатокАналогов ЕСТЬ NULL
               ТОГДА ТоварыНаСкладахОстатки.КоличествоОстаток
           ИНАЧЕ ОстаткиАналогов.ОстатокАналогов / РасчётКоэффициента.ОстатокАналогов * ТоварыНаСкладахОстатки.КоличествоОстаток
       КОНЕЦ КАК ЧИСЛО(15, 3)) КАК ТоварОстаток,
   ОстаткиАналогов.Аналог,
   ОстаткиАналогов.Складаналога КАК СкладАналога,
   ОстаткиАналогов.ОстатокАналогов
ИЗ
   РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки
       ЛЕВОЕ СОЕДИНЕНИЕ ОстаткиАналогов КАК ОстаткиАналогов
       ПО ТоварыНаСкладахОстатки.Номенклатура = ОстаткиАналогов.Номенклатура
           И ТоварыНаСкладахОстатки.Склад = ОстаткиАналогов.Складаналога
       ЛЕВОЕ СОЕДИНЕНИЕ РасчётКоэффициента КАК РасчётКоэффициента
       ПО ТоварыНаСкладахОстатки.Склад = РасчётКоэффициента.Складаналога
           И ТоварыНаСкладахОстатки.Номенклатура = РасчётКоэффициента.Номенклатура
44 ssh2006
 
05.04.12
12:42
(43) Если самого товара нет на остатках, но есть остатки аналогов, то запрос не покажет такого товара. Если остаток товара есть на ином складе, нежели его аналоги, то остаток по аналогам не будет показан
45 КМ155
 
05.04.12
12:51
(44) думаешь стоит усовершенствовать и ТС сам не справиться ?
46 ssh2006
 
05.04.12
12:58
(45) думаю запрос кривоват, его не нужно усовершенствовать
Основная теорема систематики: Новые системы плодят новые проблемы.