Имя: Пароль:
1C
1С v8
Ошибка в запросе, таблицы соединились неожиданно
0 fazendoid
 
21.01.13
12:44
Добрый день.
Есть такой лапшезапрос:

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

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

УПОРЯДОЧИТЬ ПО
   Номенклатура

По моей логике он должен вывести товары из поступлений за период и, если за тот же период есть и допрасходы с такими наименованиями, приджойнить информацию из них сюда. Но на деле получается, что выводится только та номенклатура, которая есть в допрасходах.
Если же убрать И ПоступлениеДопРасходовТовары.Ссылка.Дата МЕЖДУ &НачалоПериода И &КонецПериода, то вся нужная номенклатура выводится, но, естественно, ломается логика вывода.
Как победить сие?
1 Wobland
 
21.01.13
12:46
естьNULL победит
2 Reset
 
21.01.13
12:47
"таблицы соединились неожиданно"
"ПО ПоступлениеТоваровУслугТовары.Номенклатура = ПоступлениеДопРасходовТовары.Номенклатура"

В условии соединения написано соединять с любым документом, лишь бы номенклатура совпала.
3 sapphire
 
21.01.13
12:47
!@#$%^&*()_!!!!!!
использовать UNION и агрегировать результат.
4 dauster
 
21.01.13
12:47
(0) во-первых, правильнее строить запрос по регистрам, а не по документам.
во-вторых, условие по ДопРасходам нужно поставить в условие соединения соединение , а не в ГДЕ.
5 Reset
 
21.01.13
12:49
Если (2) устраивает, то см (1) на дату
6 Reset
 
21.01.13
12:50
ну или (4)
7 fazendoid
 
21.01.13
13:04
(4)
1. Учту
2. Помогло, спасибо :)
8 fazendoid
 
21.01.13
13:13
(2) Ну для меня же неожиданно :)
9 fazendoid
 
21.01.13
13:43
Видоизменил так:

ВЫБРАТЬ
   ПоступлениеТоваровУслугТовары.Номенклатура КАК Номенклатура,
   ВЫРАЗИТЬ(СУММА(ПоступлениеТоваровУслугТовары.Сумма) КАК ЧИСЛО(10, 2)) КАК СуммаПоступлений,
   ВЫРАЗИТЬ(СУММА(ПоступлениеТоваровУслугТовары.Количество) КАК ЧИСЛО(10, 4)) КАК КоличествоПоступлений,
   ВЫРАЗИТЬ(СРЕДНЕЕ(ПоступлениеТоваровУслугТовары.Цена) КАК ЧИСЛО(10, 2)) КАК СредняяЦенаПоступления,
   ВЫРАЗИТЬ(СУММА(ЕСТЬNULL(ПоступлениеДопРасходовТовары.Количество,0)) КАК ЧИСЛО(10, 4)) КАК КоличествоДопрасходов,
   ВЫРАЗИТЬ(СУММА(ЕСТЬNULL(ПоступлениеДопРасходовТовары.Сумма,0)) КАК ЧИСЛО(10, 4)) КАК СуммаДопрасходов,
   ВЫРАЗИТЬ(СУММА(ПоступлениеДопРасходовТовары.Сумма) / СУММА(ПоступлениеДопРасходовТовары.Количество) КАК ЧИСЛО(10, 2)) КАК ЗатратыПоКоличествуПоступлений,
   ВЫРАЗИТЬ(СУММА(ПоступлениеДопРасходовТовары.Сумма) / СУММА(ПоступлениеТоваровУслугТовары.Количество) КАК ЧИСЛО(10, 2)) КАК ЗатратыПоКоличествуДопрасходов,
   ВЫРАЗИТЬ((СРЕДНЕЕ(ПоступлениеТоваровУслугТовары.Цена) + СУММА(ПоступлениеДопРасходовТовары.Сумма) / СУММА(ПоступлениеДопРасходовТовары.Количество)) КАК ЧИСЛО(10, 2)) КАК СебестоимостьПоКоличествуПоступлений,
   ВЫРАЗИТЬ((СРЕДНЕЕ(ПоступлениеТоваровУслугТовары.Цена) + СУММА(ПоступлениеДопРасходовТовары.Сумма) / СУММА(ПоступлениеТоваровУслугТовары.Количество)) КАК ЧИСЛО(10, 2)) КАК СебестоимостьПоКоличествуДопрасходов
ИЗ
   Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
       ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПоступлениеДопРасходов.Товары КАК ПоступлениеДопРасходовТовары
       ПО ПоступлениеТоваровУслугТовары.Номенклатура = ПоступлениеДопРасходовТовары.Номенклатура
           И (ПоступлениеДопРасходовТовары.Ссылка.Дата МЕЖДУ &НачалоПериода И &КонецПериода)
ГДЕ
   ПоступлениеТоваровУслугТовары.Ссылка.Дата МЕЖДУ &НачалоПериода И &КонецПериода

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

УПОРЯДОЧИТЬ ПО
   Номенклатура

В СебестоимостьПоКоличествуДопрасходов и СебестоимостьПоКоличествуПоступлений (при пустых допрасходах) тоже идет ноль хотя вроде должно быть СРЕДНЕЕ(ПоступлениеТоваровУслугТовары.Цена). Или если выражение натыкается на деление на 0, оно не считается совсем?
10 pessok
 
21.01.13
13:44
(9) а как оно должно считаться?
11 Reset
 
21.01.13
13:48
(9) Там не 0 встречается, а NULL
12 fazendoid
 
21.01.13
13:49
(11) Там же ж ЕСТЬNULL(ПоступлениеДопРасходовТовары.Сумма,0)
13 Reset
 
21.01.13
13:50
Вообще, если связи м/у документами отсутствуют или не важны, напрашивается (3) - т.е. соединение не нужно
14 Reset
 
21.01.13
13:51
(12) Где?
ВЫРАЗИТЬ((СРЕДНЕЕ(ПоступлениеТоваровУслугТовары.Цена) + СУММА(ПоступлениеДопРасходовТовары.Сумма) / СУММА(ПоступлениеДопРасходовТовары.Количество)) КАК ЧИСЛО(10, 2)) КАК СебестоимостьПоКоличествуПоступлений
15 fazendoid
 
21.01.13
13:52
(10) (СРЕДНЕЕ(ПоступлениеТоваровУслугТовары.Цена) + СУММА(ПоступлениеДопРасходовТовары.Сумма) / СУММА(ПоступлениеТоваровУслугТовары.Количество))
Я бы на месте выражения вернул СРЕДНЕЕ(ПоступлениеТоваровУслугТовары.Цена)
16 fazendoid
 
21.01.13
13:57
(14) Чёрт. Все никак не привыкну.
Теперь "Деление на ноль значения типа Numeric"
17 fazendoid
 
21.01.13
14:09
Сделал так:

ВЫБРАТЬ
   ПоступлениеТоваровУслугТовары.Номенклатура КАК Номенклатура,
   ВЫРАЗИТЬ(СУММА(ПоступлениеТоваровУслугТовары.Сумма) КАК ЧИСЛО(10, 2)) КАК СуммаПоступлений,
   ВЫРАЗИТЬ(СУММА(ПоступлениеТоваровУслугТовары.Количество) КАК ЧИСЛО(10, 4)) КАК КоличествоПоступлений,
   ВЫРАЗИТЬ(СРЕДНЕЕ(ПоступлениеТоваровУслугТовары.Цена) КАК ЧИСЛО(10, 2)) КАК СредняяЦенаПоступления,
   ВЫРАЗИТЬ(СУММА(ЕСТЬNULL(ПоступлениеДопРасходовТовары.Количество, 0)) КАК ЧИСЛО(10, 4)) КАК КоличествоДопрасходов,
   ВЫРАЗИТЬ(СУММА(ЕСТЬNULL(ПоступлениеДопРасходовТовары.Сумма, 0)) КАК ЧИСЛО(10, 4)) КАК СуммаДопрасходов,
   ВЫБОР
       КОГДА ЕСТЬNULL(СУММА(ПоступлениеДопРасходовТовары.Количество), 0) = 0
           ТОГДА 0
       ИНАЧЕ ВЫРАЗИТЬ(СУММА(ЕСТЬNULL(ПоступлениеДопРасходовТовары.Сумма, 0)) / СУММА(ЕСТЬNULL(ПоступлениеДопРасходовТовары.Количество, 0)) КАК ЧИСЛО(10, 2))
   КОНЕЦ КАК ЗатратыПоКоличествуПоступлений,
   ВЫРАЗИТЬ(СУММА(ЕСТЬNULL(ПоступлениеДопРасходовТовары.Сумма, 0)) / СУММА(ЕСТЬNULL(ПоступлениеТоваровУслугТовары.Количество, 0)) КАК ЧИСЛО(10, 2)) КАК ЗатратыПоКоличествуДопрасходов,
   ВЫБОР
       КОГДА ЕСТЬNULL(СУММА(ПоступлениеДопРасходовТовары.Количество), 0) = 0
           ТОГДА СРЕДНЕЕ(ПоступлениеТоваровУслугТовары.Цена)
       ИНАЧЕ ВЫРАЗИТЬ(СРЕДНЕЕ(ПоступлениеТоваровУслугТовары.Цена) + СУММА(ЕСТЬNULL(ПоступлениеДопРасходовТовары.Сумма, 0)) / СУММА(ЕСТЬNULL(ПоступлениеДопРасходовТовары.Количество, 0)) КАК ЧИСЛО(10, 2))
   КОНЕЦ КАК СебестоимостьПоКоличествуПоступлений,
   ВЫРАЗИТЬ(СРЕДНЕЕ(ПоступлениеТоваровУслугТовары.Цена) + СУММА(ЕСТЬNULL(ПоступлениеДопРасходовТовары.Сумма, 0)) / СУММА(ПоступлениеТоваровУслугТовары.Количество) КАК ЧИСЛО(10, 2)) КАК СебестоимостьПоКоличествуДопрасходов
ИЗ
   Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
       ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПоступлениеДопРасходов.Товары КАК ПоступлениеДопРасходовТовары
       ПО ПоступлениеТоваровУслугТовары.Номенклатура = ПоступлениеДопРасходовТовары.Номенклатура
           И (ПоступлениеДопРасходовТовары.Ссылка.Дата МЕЖДУ &НачалоПериода И &КонецПериода)
ГДЕ
   ПоступлениеТоваровУслугТовары.Ссылка.Дата МЕЖДУ &НачалоПериода И &КонецПериода

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

УПОРЯДОЧИТЬ ПО
   Номенклатура

Но это ведь безумно громоздко!
18 fazendoid
 
21.01.13
15:52
(4) Насчет регистров: у меня «Поступление доп. расходов» по регистрам вообще не идет. Каким образом мне тогда их учитывать здесь?
19 Reset
 
21.01.13
15:53
(18) Если оно не идет по регистрам, значит его не нужно учитывать :)
20 fazendoid
 
21.01.13
16:11
(19) Ага, теперь это надо начальнику объяснить, которая хочет видеть расчет себестоимости и прибыли :)
21 Reset
 
21.01.13
16:16
(20) Я не шутил в (19), несмотря на смайлик.
Объяснять начальнику нужно не "почему не нужно учитывать", а почему нет движений.
22 Reset
 
21.01.13
16:17
Нет движений - значит документ на расчет не влияет
23 fazendoid
 
21.01.13
16:22
(22) Так и я тоже не шутил, требуют. В том и дело, «что есть движения, нет движений — нам сугубо фиолетово, выньте да положьте наглядственно». (и почему их нет? КА, РАУЗ — упр и регл)
24 Reset
 
21.01.13
16:25
Ну тогда нужно искать профессионала, могущего нарисовать семь перпендикулярных друг другу линий красного цвета, нарисованных разными цветами.
25 fazendoid
 
21.01.13
16:27
Тут дело в том, что хотят видеть цену = закупка + доп.расход. в связи с этим одно время был суперкостыль, изобретенный шабашником, — в обработке проведения ПоступлениеТоваровУслуг вткнул кусок, расчитывающий и записывающий эту самую цену в регистр.
Ну и плюс — нерабочий отчет «Валовая прибыль»…
26 fazendoid
 
21.01.13
16:27
(24) Ну, тут все просто: берем семимерное пространство и дальтоника :)
27 Reset
 
21.01.13
16:29
(25) Уууууу :\
Сочувствую
28 fazendoid
 
21.01.13
16:33
(27) Да сейчас соображу что-нибудь, вариант, черпающий инфу из ТЧ документов, уже работает. Похоже даже, что правильно :) Сейчас переделываю на оборотные регистры.
А насчет профессионалов-дальтоников у меня свое мнение. Его только в личку, а то еще они заметят :)
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой