Имя: Пароль:
1C
1С v8
Злой запрос
0 al_zzz
 
28.03.12
23:20
Требуется получить цену закупа на по каждой позиции из регистра накопления "Продажи" на момент продажи, а потом из регистра накопления "Себестоимость" получить себестоимость по сгруппированной по номенклатуре таблице. Прочитал Книга знаний: Срез последних на каждую дату в запросе , как это делается с помощью подзапроса, составил свой:
ВЫБРАТЬ
   ПродажиОбороты.Номенклатура КАК Номенклатура,
   СУММА(ПродажиОбороты.КоличествоОборот) КАК Количество,
   СУММА(ПродажиОбороты.СтоимостьОборот) КАК Выручка,
   СУММА(СебестоимостьОбороты.СтоимостьОборот) КАК Себестоимость,
   СРЕДНЕЕ(ЦеныЗакупа.Цена) КАК Цена
ПОМЕСТИТЬ _1_Продажи
{ВЫБРАТЬ
   Номенклатура.*,
   Количество,
   Выручка,
   Себестоимость,
   Цена}
ИЗ
   РегистрНакопления.Продажи.Обороты(, , Регистратор, (НЕ Контрагент В ИЕРАРХИИ (&СобственныеКонтрагенты))) КАК ПродажиОбороты
       ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Себестоимость.Обороты(, , Регистратор, ) КАК СебестоимостьОбороты
       ПО ПродажиОбороты.Номенклатура = СебестоимостьОбороты.Номенклатура
           И ПродажиОбороты.Регистратор = СебестоимостьОбороты.Регистратор
       ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
           ЦенаЗакупаМакс.Номенклатура КАК Номенклатура,
           ЦенаЗакупаМакс.Регистратор КАК Регистратор,
           ЦеныНоменклатуры.Цена КАК Цена
       ИЗ
           (ВЫБРАТЬ
               ПродажиОбороты.Номенклатура КАК Номенклатура,
               МАКСИМУМ(ЦеныНоменклатуры.Период) КАК Период,
               ПродажиОбороты.Регистратор КАК Регистратор
           ИЗ
               РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, Регистратор, (НЕ Контрагент В ИЕРАРХИИ (&СобственныеКонтрагенты))) КАК ПродажиОбороты
                   ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
                   ПО ПродажиОбороты.Номенклатура >= ЦеныНоменклатуры.Номенклатура
                       И (ЦеныНоменклатуры.ТипЦен = &Закуп)
                       И ПродажиОбороты.Регистратор.Дата >= ЦеныНоменклатуры.Период
           
           СГРУППИРОВАТЬ ПО
               ПродажиОбороты.Номенклатура,
               ПродажиОбороты.Регистратор) КАК ЦенаЗакупаМакс
               ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
               ПО ЦенаЗакупаМакс.Номенклатура = ЦеныНоменклатуры.Номенклатура
                   И ЦенаЗакупаМакс.Период = ЦеныНоменклатуры.Период
                   И (ЦеныНоменклатуры.ТипЦен = &Закуп)) КАК ЦеныЗакупа
       ПО ПродажиОбороты.Номенклатура = ЦеныЗакупа.Номенклатура
           И ПродажиОбороты.Регистратор = ЦеныЗакупа.Регистратор
{ГДЕ
   ПродажиОбороты.Номенклатура.*}

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   _1_Продажи.Номенклатура КАК Номенклатура,
   _1_Продажи.Количество КАК Количество,
   _1_Продажи.Выручка КАК Выручка,
   _1_Продажи.Себестоимость КАК Себестоимость,
   ВложенныйЗапрос.СебестоимостьНаКонец КАК СебестоимостьНаКонец,
   _1_Продажи.Цена КАК Цена
{ВЫБРАТЬ
   Номенклатура.*,
   Количество,
   Выручка,
   Себестоимость,
   СебестоимостьНаКонец,
   Цена}
ИЗ
   _1_Продажи КАК _1_Продажи
       ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
           СебестоимостьОстатки.Номенклатура КАК Номенклатура,
           СебестоимостьОстатки.СтоимостьОстаток / СебестоимостьОстатки.КоличествоОстаток КАК СебестоимостьНаКонец
       ИЗ
           РегистрНакопления.Себестоимость.Остатки(&КонецПериода, ) КАК СебестоимостьОстатки
       ГДЕ
           СебестоимостьОстатки.КоличествоОстаток > 0) КАК ВложенныйЗапрос
       ПО _1_Продажи.Номенклатура = ВложенныйЗапрос.Номенклатура
{ГДЕ
   _1_Продажи.Номенклатура.*}
Но, видимо, получился очень тяжелый - выполняется уже около получаса и конца и краю не видно. Подскажите, как оптимизировать или где и чего я делаю не так. Запрос для СКД. 1с81.
1 sda553
 
28.03.12
23:43
временные таблицы юзай
2 acsent
 
28.03.12
23:45
есть вариант создать временную таблицу
номенклатура , ... , период, дата окончания
а уже потом соединять
3 acsent
 
28.03.12
23:46
ПродажиОбороты.Номенклатура >= ЦеныНоменклатуры.Номенклатура
что это за х..ня?
4 acsent
 
28.03.12
23:46
и ПродажиОбороты.Регистратор.Дата
заменить на
ПродажиОбороты.Период
5 ILM
 
гуру
28.03.12
23:51
Что это за "Требуется получить цену закупа на по каждой позиции из регистра накопления "Продажи" на момент продажи" -ня?

Особенно впечатлило сочетание "на по ... на"

Я бы сделал последовательно
ВТ_1. Запрос Номенклатура и Дата - Регистр "Продажи"
ВТ_2. Максимальная цена закупа по номенклатуре со всеми условиями
ВТ_3. Себестоимость
4. Последний запрос из ВТ_1, ВТ_2, ВТ_3.
6 al_zzz
 
28.03.12
23:58
(3) Ага, согласен. Собственно, это и оказалось причиной.
7 al_zzz
 
29.03.12
00:01
(5) Воспользуюсь вашим советом. :-).
8 al_zzz
 
29.03.12
01:03
Переделал. Вот ещё вопрос - возможно ли вывести несколько ресурсов в СКД в одной колонке? Как это указать в настройке?
9 ILM
 
гуру
29.03.12
20:50
(8) В макете группируй, там есть вывод в одной колонке.