Имя: Пароль:
1C
1С v8
СКД: изменение текста запроса системой компоновки
0 Kaidend
 
14.03.13
14:31
Всем привет. Столкнулся с одной проблемкой в СКД, не могу сообразить, как ее решить.

В общем, есть простейшая таблица вида Документ - Номенклатура - Количество. Номенклатура может несколько раз повторяться в пределах одного документа, т. е. поля Документ и Номенклатура не образуют вместе первичный ключ.

Есть такой запрос:

ВЫБРАТЬ
 Таблица.Документ,
 Таблица.Номенклатура,
 СУММА(Таблица.Количеств) КАК Количество
ПОМЕСТИТЬ
 СгруппированнаяТаблица
ИЗ
 Таблица КАК Таблица
СГРУППИРОВАТЬ ПО
 Таблица.Документ,
 Таблица.Номенклатура
;
//////////////////////////////
ВЫБРАТЬ
 СгруппированнаяТаблица.Документ,
 СУММА(ВЫБОР КОГДА СгруппированнаяТаблица.Количество > 3 ТОГДА 1 ИНАЧЕ 0) КОНЕЦ
ИЗ
 СгруппированнаяТаблица КАК СгруппированнаяТаблица
СГРУППИРОВАТЬ ПО
 СгруппированнаяТаблица.Документ

СКД, когда выполняет запрос, убирает из временной таблицы группировку по номенклатуре, т. к. ее нет ни в выводимых полях, ни в группировочных, ну в общем, нигде (ну, собственно, номенклатуры нет и в результирующем запросе, так что попасть в какие-либо поля она не может).  

То есть запрос такой получается:

ВЫБРАТЬ
 Таблица.Документ
 СУММА(Таблица.Количеств) КАК Количество
ПОМЕСТИТЬ
 СгруппированнаяТаблица
ИЗ
 Таблица КАК Таблица
СГРУППИРОВАТЬ ПО
 Таблица.Документ,
 Таблица.Номенклатура
;
//////////////////////////////
ВЫБРАТЬ
 СгруппированнаяТаблица.Документ,
 СУММА(ВЫБОР КОГДА СгруппированнаяТаблица.Количество > 3 ТОГДА 1 ИНАЧЕ 0) КОНЕЦ
ИЗ
 СгруппированнаяТаблица КАК СгруппированнаяТаблица
СГРУППИРОВАТЬ ПО
 СгруппированнаяТаблица.Документ

В итоге отчет выводит совсем не то, что нужно. Кто-нибудь знает, как справиться с таким самовольным поведением СКД?
1 Kaidend
 
14.03.13
14:32
Прощу прощения, неудачно скопипастил второй запрос. Он такой получается:

ВЫБРАТЬ
 Таблица.Документ
 СУММА(Таблица.Количеств) КАК Количество
ПОМЕСТИТЬ
 СгруппированнаяТаблица
ИЗ
 Таблица КАК Таблица
СГРУППИРОВАТЬ ПО
 Таблица.Документ
;
//////////////////////////////

ВЫБРАТЬ
 СгруппированнаяТаблица.Документ,
 СУММА(ВЫБОР КОГДА СгруппированнаяТаблица.Количество > 3 ТОГДА 1 ИНАЧЕ 0) КОНЕЦ
ИЗ
 СгруппированнаяТаблица КАК СгруппированнаяТаблица
СГРУППИРОВАТЬ ПО
 СгруппированнаяТаблица.Документ
2 Kaidend
 
14.03.13
15:02
Апнем, пожалуй.
3 Пеппи
 
14.03.13
15:23
тебе нужно сгруппировать номенклатуру в пределах одного документа?
4 YAGolova
 
14.03.13
15:24
У меня тоже были подобные случаи, я помещал еще в одну временную таблицу и уже потоб брал оттуда данные - мне помогало...
5 Kaidend
 
14.03.13
15:25
(3) Да, и определить, сколько раз в пределах одного документа какая-то номенклатура имеет количество более 3.

На самом деле, задача чуть более сложная, но я упростил, поэтому она может казаться немного странной.

Но меня даже сам принцип удивляет какого-то крайне неаккуратного вмешательства СКД в текст запроса.
6 Kaidend
 
14.03.13
15:26
(4) Типа до первой временной таблицы СКД не доберется? :) Хотя попробовать можно...
7 Пеппи
 
14.03.13
15:26
(5)в бесплатных видео Гилева чтото было на эту тему.
8 Vakhrin
 
14.03.13
15:28
ВЫБРАТЬ
 Таблица.Документ,
 СУММА(ВЫБОР КОГДА СгруппированнаяТаблица.Количество > 3 ТОГДА 1 ИНАЧЕ 0) КОНЕЦ КАК Поле1
Поместить ТаблицаДокумент
ИЗ
 Таблица КАК Таблица
СГРУППИРОВАТЬ ПО
 СгруппированнаяТаблица.Документ;

ВЫБРАТЬ
 Таблица.Документ,
 Таблица.Номенклатура,
 СУММА(Таблица.Количеств) КАК Количество,
 ТаблицаДокумент.Поле1
ИЗ
 Таблица КАК Таблица
 ЛЕВОЕ СОЕДИНЕНИЕ ТаблицаДокумент КАК ТаблицаДокумент
 ПО ТаблицаДокумент.Документ = Таблица.Документ
СГРУППИРОВАТЬ ПО
 Таблица.Документ,
 Таблица.Номенклатура,
 ТаблицаДокумент.Поле1
9 Vakhrin
 
14.03.13
15:30
к (8) сори... работать не будет, потому как обращение к несуществующей таблице в первом запросе, но общий смысл должен быть понятен вроде )
10 Defender aka LINN
 
14.03.13
15:35
1465-я жертва автозаполнения...
11 Vakhrin
 
14.03.13
15:37
(10) Где?! Оо
12 Defender aka LINN
 
14.03.13
15:45
(11) в (0)
13 Kaidend
 
14.03.13
16:07
(4) Как ни странно помогло, хех.

(10) А поподробнее можно? А то уж больно намек туманный. Я включил в результирующий запрос поле Номенклатура, засунув его в агрегатную функцию, и включил этому полю признак "Обязательное" в наборе данных (в диалоге "Роль"). Проблема как бы решилась, но какой-то кривой способ все равно.
14 Defender aka LINN
 
14.03.13
16:41
(13) Надо знать, как работает построитель запроса / СКД.
Если поле не выбрано в настройках нигде и не является обязательным, СКД его из запроса недолго думая выкидывает. Чтобы этого избежать, надо самому в {} поля прописывать
15 Kaidend
 
14.03.13
17:31
(14) Хм, не пойму все-таки, какое отношение к данной проблеме имеет метод заполнения полей набора данных - через автозаполнение или вручную через фигурные скобки. Мне же все равно придется включать поле Номенклатура в результирующий запрос и указывать в его свойствах в наборе данных, что оно обязательное, иначе СКД его решительно выкинет. Какая в этом случае разница, как были заполнены поля набора данных - автозаполнением или вручную?
16 Defender aka LINN
 
14.03.13
19:34
(15) Следи за руками:

ВЫБРАТЬ
 Таблица.Документ,
 Таблица.Номенклатура,
 СУММА(Таблица.Количеств) КАК Количество
{ВЫБРАТЬ
 Документ.*}
ПОМЕСТИТЬ
 СгруппированнаяТаблица
ИЗ
 Таблица КАК Таблица
СГРУППИРОВАТЬ ПО
 Таблица.Документ,
 Таблица.Номенклатура
;
//////////////////////////////

ВЫБРАТЬ
 СгруппированнаяТаблица.Документ,
 СУММА(ВЫБОР КОГДА СгруппированнаяТаблица.Количество > 3 ТОГДА 1 ИНАЧЕ 0) КОНЕЦ КАК Поле
{ВЫБРАТЬ
 Документ.*,
 Поле}
ИЗ
 СгруппированнаяТаблица КАК СгруппированнаяТаблица
СГРУППИРОВАТЬ ПО
 СгруппированнаяТаблица.Документ
17 rphosts
 
14.03.13
19:38
(0) отключ автозаполнение и бдет тебе счастье!
18 Kaidend
 
15.03.13
10:07
(16) Видимо, я отчаянно туплю, но не работает.

Скопипастил твой запрос в СКД, выключил автозаполнение. Выполнил отчет. Посмотрел результат, он такой, как будто СКД выкинула группировку по номенклатуре из запроса, формирующего временную таблицу.

Посмотрел отчет в консоли системы компоновки данных - точно. СКД преобразует запрос следующим образом:

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

СГРУППИРОВАТЬ ПО
   Таблица.Документ
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   СгруппированнаяТаблица.Документ КАК Документ,
   СУММА(ВЫБОР
           КОГДА СгруппированнаяТаблица.Количество > 3
               ТОГДА 1
           ИНАЧЕ 0
       КОНЕЦ) КАК Поле,
   ПРЕДСТАВЛЕНИЕССЫЛКИ(СгруппированнаяТаблица.Документ) КАК ДокументПредставление
ИЗ
   СгруппированнаяТаблица КАК СгруппированнаяТаблица

СГРУППИРОВАТЬ ПО
   СгруппированнаяТаблица.Документ