Имя: Пароль:
1C
1С v8
Почему может не работать СУММА() в СКД?
0 jk3
 
09.11.11
15:36

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

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

В консоли запросов Количество = разные числа
В консоли отчетов с группировкой Детальные записи = везде единичка

КАК такое может быть?
1 jk3
 
09.11.11
15:49
Хотя бы идею какую-нибудь подкиньте ...
2 Господин ПЖ
 
09.11.11
15:50
>с группировкой Детальные записи

кагбынамекает...
3 g_frost
 
09.11.11
15:52
А может просто 1 как количество
а в СКД добавь количество в ресурс
4 acsent
 
09.11.11
15:53
Количество - ресурс?
5 jk3
 
09.11.11
15:53
(2) Чего намекает?
Такой же вывод простым списком, как в консоли запросов.
6 jk3
 
09.11.11
15:55
(3)(4) пробовал добавлять Количество в ресурс с выражением МАКСИМУМ(Количество) с нулевым эффектом.

Мне не надо ресурсом ничего суммировать, просто вывести линейным списком то, что получилось в результате запроса.
7 AAlexandra
 
09.11.11
16:01
(0) а ВТРазличныеПоставщики и ВТПотребители как формируются?
Отборы накладываешь в запросе?
8 jk3
 
09.11.11
16:03
(7) А эти обе таблицы формируются из другой общей временной таблицы, только по разному группируются.

Кому интересно, вот так:

ВЫБРАТЬ РАЗЛИЧНЫЕ
   База.ПоставщикУслугПодразделение,
   База.ПоставщикУслугНоменклатурнаяГруппа
ПОМЕСТИТЬ ВТРазличныеПоставщики
ИЗ
   ВТБаза КАК База
;

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

СГРУППИРОВАТЬ ПО
   База.ПоставщикУслугПодразделение,
   База.ПоставщикУслугНоменклатурнаяГруппа,
   База.ПотребительУслугПодразделение,
   База.ПотребительУслугНоменклатурнаяГруппа
;
9 DmitrO
 
09.11.11
16:03
может просто так:
Количество(*) КАК Количество,
то что надо будет? :)
10 jk3
 
09.11.11
16:07
(9) Нет. Не помогает.
Результат тот же: в конструкторе запросов всё нормально, в СКД косяк.
11 jk3
 
09.11.11
16:10
(2) Ваш выход, Маэстро.
12 Amiralnar
 
09.11.11
16:12
Используйте консоль СКД, и проанализируйте запрос формируемый в макете. Телепаты в отпуске.
13 AAlexandra
 
09.11.11
16:14
(10) База.ПоставщикУслугНоменклатурнаяГруппа, База.ПотребительУслугНоменклатурнаяГруппа из ВТПотребители где-то дальше используются? Если нет, СКД их уберет из запроса и при формировании твоей ВТПотребители получится запрос:

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

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

Действительно единички останутся..
14 jk3
 
09.11.11
16:18
(13) Первый раз о таком самовольстве слышу.
ПотребительУслугНоменклатурнаяГруппа дальше используется, см (0)
15 AAlexandra
 
09.11.11
16:24
(13) В запросе: ПоставщикУслугПодразделение -> ПотребительУслугНоменклатурнаяГруппа

В принципе, лечится, например, добавлением в запрос (0) полей:
 КОЛИЧЕСТВО(Потребители.ПотребительУслугНоменклатурнаяГруппа) КАК Количество2,  
 КОЛИЧЕСТВО(Потребители.ПоставщикУслугНоменклатурнаяГруппа) КАК Количество3  

(14) СКД перед выполнением запроса анализирует его на предмет использования полей временных таблиц. И если поля в дальнейшем не используются - она их не вычисляет, "оптимизируя" запрос.
Все это на практике можно посмотреть в консоли СКД, как правильно посоветовали в (12), там на какой-то из вкладок можно увидеть итоговый запрос, который будет реально выполняться - он 100% отличается от твоего кода в (8).
16 AAlexandra
 
09.11.11
16:27
(15) надо 2 поля про поставщика добавить.. Опять промахнулась 8(
 КОЛИЧЕСТВО(Потребители.ПоставщикУслугПодразделение) КАК Количество2,  
 КОЛИЧЕСТВО(Потребители.ПоставщикУслугНоменклатурнаяГруппа) КАК Количество3
17 jk3
 
09.11.11
16:29
(15)(16) Да не помогает это всё.
ОК, буду пробовать в консоли СКД ковырять где там что "оптимизируется".
18 AAlexandra
 
09.11.11
16:31
(17) и в итоговую таблицу с детальными записями ты поля эти вывел, и все равно не помогает?
Значит обрезано еще выше, где твоя ВТБаза формируется.. Но смысл в том же.
19 jk3
 
09.11.11
16:53
(18) Всё верно. СКД слишком "умная".

Из таблицы ВТПотребители автоматически вырезаются поля

База.ПоставщикУслугПодразделение,
База.ПоставщикУслугНоменклатурнаяГруппа

т.к. они далее не используются.

Причем добавление в последний запрос строк

КОЛИЧЕСТВО(Потребители.ПоставщикУслугПодразделение) КАК КоличествоДляСКД1,
КОЛИЧЕСТВО(Потребители.ПоставщикУслугНоменклатурнаяГруппа) КАК КоличествоДляСКД2,

недостаточно!!!

Нужен именно вывод этих полей в результирующий табличный документ.

Как избежать этой оптимизации без вывода юзеру этих ничего не значащих полей?
20 acsent
 
09.11.11
16:58
Автозаполнение????
21 IronDemon
 
09.11.11
16:59
(19) Указать насильно эти поля.
{ВЫБРАТЬ
   ПоставщикУслугПодразделение,
   ПоставщикУслугНоменклатурнаяГруппа
22 jk3
 
09.11.11
17:20
(20) Автополе вы имеете ввиду? Не помогает.
(21) В какой именно запрос?
23 IronDemon
 
09.11.11
17:23
Выключи автозаполнение и укажи сам поля.
24 jk3
 
09.11.11
17:26
(23) Так я и так сам всегда вручную указываю поля.
Если в вовод включены колонки КоличествоДляСКД1 и КоличествоДляСКД2, то и Количество правильно считается.
Если в вывод НЕ включены колонки КоличествоДляСКД1 и КоличествоДляСКД2, то Количество везде = 1
25 unregistered
 
09.11.11
17:28
(24) Ты не понял.
Речь не об Автополе, а о галке Автозаполнение. Это в конструкторе СКД под текстом запроса.
26 jk3
 
09.11.11
17:34
(25) Ээээ, я просто эту галку никогда не снимал.
Когда снимаю, не могу добавить элемент вручную, только папку можно.
Что нужно сделать?
27 IronDemon
 
09.11.11
17:38
Закладка "Компоновка данных". Поля и Условия. Ну и для ВТ условия.
28 jk3
 
09.11.11
17:45
(27) Спасибо.
Всё получилось и со включенным автозаполнением.

Нужно только на полях КоличествоДляСКД1 и КоличествоДляСКД2 установить в колонке Роль галочку Обязательное.
Тогда даже без вывода этих колонок пользователю всё работает.

Всем спасибо за помощь!
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший