Имя: Пароль:
1C
1С v8
Туплю с запросом по УТ 10.3
0 tertva_1C
 
09.02.12
15:59
Всем привет, есть задачка вывести в отчет из УТ 10.3 в котором бы выводилось следующее :

Документ поступления, номенклатура, кол-во, цена поступления и последняя цена номенк на дату документа поступления делаю так
ВЫБРАТЬ РАЗЛИЧНЫЕ
   ПоступлениеТоваровУслугТовары.Ссылка КАК Ссылка,
   ПоступлениеТоваровУслугТовары.Номенклатура,
   ПоступлениеТоваровУслугТовары.Цена КАК ЦенаПоступления,
   ПоступлениеТоваровУслугТовары.Количество КАК Количество
ПОМЕСТИТЬ пе6рвая
ИЗ
   Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
ГДЕ
   ПоступлениеТоваровУслугТовары.Ссылка.Проведен = ИСТИНА
   И ПоступлениеТоваровУслугТовары.Ссылка.Дата >= НАЧАЛОПЕРИОДА(&ДатаНачала, ДЕНЬ)
   И ПоступлениеТоваровУслугТовары.Ссылка.Дата <= КОНЕЦПЕРИОДА(&ДатаОкончания, ДЕНЬ)

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

ДЛЯ ИЗМЕНЕНИЯ
;

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

СГРУППИРОВАТЬ ПО
   ЦеныНоменклатурыСрезПоследних.Номенклатура

ДЛЯ ИЗМЕНЕНИЯ
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
   пе6рвая.Ссылка КАК Ссылка,
   вторая.Номенклатура,
   пе6рвая.Количество КАК Количество,
   СУММА(пе6рвая.ЦенаПоступления) КАК ЦенаПоступления
ИЗ
   пе6рвая КАК пе6рвая
       ЛЕВОЕ СОЕДИНЕНИЕ вторая КАК вторая
       ПО пе6рвая.Номенклатура = вторая.Номенклатура
ГДЕ
   ВЫБОР
           КОГДА вторая.Номенклатура ЕСТЬ NULL
                   ИЛИ вторая.Номенклатура = НЕОПРЕДЕЛЕНО
               ТОГДА ЛОЖЬ
           ИНАЧЕ ИСТИНА
       КОНЕЦ

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

ДЛЯ ИЗМЕНЕНИЯ

УПОРЯДОЧИТЬ ПО
   Ссылка
но ни как не могу прикрутить регистр цены номеклатуры чтобы взять оттуда цену, ткните меня пожалуйста ....
1 tertva_1C
 
09.02.12
16:07
UP
2 2S
 
09.02.12
16:08
мне не понять всю глубину ваших глубин
для чего это? почему не просто левое соединение?
3 tertva_1C
 
09.02.12
16:09
пробовал, ни хрена не пашет
4 tertva_1C
 
09.02.12
16:09
либо мозг совсем усох
5 Nagaru
 
09.02.12
16:13
Стандартная задача при приеме на  работу в большинство организаций, если вкратце, то:
1. берешь первую таблицу и связываешь её с талицей регистра цен номенклатуры(не срез последних, а сама таблица) по условию Док.номенклатура = Рег.Номенклатура (если нужно, то склады, организации и так далее) и по условию Док.Дата > Рег.Период
и группируешь получившиеся данные по документу с получением максимума по периоду регистра. Таким образом ты получишь таблицу данных по приходным документам и период последней установки цены.
Затем эти данные соединяешь снова с регистром цен номенклатуры по условию (вложенныйзапрос.номенклатура = рег.номенклатура и ВложенныйЗапрос.Период = Рег.период) и уже в этом соединении ты можешь получить цену из регистра сведений.

Попробуй, должно помочь.
6 tertva_1C
 
09.02.12
16:23
ВЫБРАТЬ РАЗЛИЧНЫЕ
   ВложенныйЗапрос.Ссылка,
   ВложенныйЗапрос.Период,
   ВложенныйЗапрос.Номенклатура,
   ВложенныйЗапрос.Количество,
   ВложенныйЗапрос.Цена,
   ЦеныНоменклатуры.Цена КАК Цена1
ИЗ
   (ВЫБРАТЬ РАЗЛИЧНЫЕ
       ПоступлениеТоваровУслугТовары.Ссылка КАК Ссылка,
       МАКСИМУМ(ЦеныНоменклатуры.Период) КАК Период,
       ПоступлениеТоваровУслугТовары.Номенклатура КАК Номенклатура,
       ПоступлениеТоваровУслугТовары.Количество КАК Количество,
       ПоступлениеТоваровУслугТовары.Цена КАК Цена
   ИЗ
       Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
           ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
           ПО ПоступлениеТоваровУслугТовары.Номенклатура = ЦеныНоменклатуры.Номенклатура
               И ПоступлениеТоваровУслугТовары.Ссылка.Дата >= ЦеныНоменклатуры.Период
   ГДЕ
       ПоступлениеТоваровУслугТовары.Ссылка.Проведен = ИСТИНА
       И ПоступлениеТоваровУслугТовары.Ссылка.Дата >= НАЧАЛОПЕРИОДА(&ДатаНачала, ДЕНЬ)
       И ПоступлениеТоваровУслугТовары.Ссылка.Дата <= КОНЕЦПЕРИОДА(&ДатаОкончания, ДЕНЬ)
   
   СГРУППИРОВАТЬ ПО
       ПоступлениеТоваровУслугТовары.Ссылка,
       ПоступлениеТоваровУслугТовары.Номенклатура,
       ПоступлениеТоваровУслугТовары.Количество,
       ПоступлениеТоваровУслугТовары.Цена
   
   ДЛЯ ИЗМЕНЕНИЯ) КАК ВложенныйЗапрос
       ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
       ПО ВложенныйЗапрос.Номенклатура = ЦеныНоменклатуры.Номенклатура
           И ВложенныйЗапрос.Период = ЦеныНоменклатуры.Период

ДЛЯ ИЗМЕНЕНИЯ

ТАК ? не взлетело...
7 tertva_1C
 
09.02.12
16:27
а все сам дурак взлетело, спасибо
8 Nagaru
 
09.02.12
16:32
(7) Плохой вариант, объясню на пальцах:

Всего в базе у тебя 1000 документов по 10 строк в каждом, итого таблица ПоступлениеТоваровУслугТовары у тебя состоит из 10 000 строк.

Цены устанавливались 5 раз для каждой номенклатуры, к примеру 3 раза до выбранного периода и 2 раза после, после левого соединения твоя таблица будет состоять из 30 000 записей.

В выбранный тобой период подходят 50 документов.

Если ты вместо таблицы ПоступлениеТоваровУслугТовары будешь использовать временную таблицу Первая (на которую уже наложен фильтр по периоду), то записей после лвого соединения будет 50 (документов) * 10 (в среднем строк в документе) * 3 (установки цен до выбранного периода) = 1500.

Таким образом второй вариант сделает эту часть запроса быстрее в 20 раз, перепиши лучше правильно.
9 Nagaru
 
09.02.12
16:34
Ах, да, за счет чего быстрее-то, после получения данных по соединению, на каждую запись отдельно накладывается условие указанное в блоке "Где" и в первом случае этих проверок будет сделано 30 000, а во втором - 1 500.