Имя: Пароль:
1C
1С v8
Запрос с номером строки
0 abda123
 
23.12.13
08:17
Доброго времени суток. Есть задача сделать отчет по остаткам и продажам за период. По сути стандартный отчет с детальными записями по номенклатуре. Хочу сделать отчет в СКД, соответственно нужно сделать все одним запросом (либо несколькими запросами). Сложность отчета в том что помимо стандартных полей требуется вывести в отчете
1. количество приходов (партий) за период
2. дату последнего прихода (партии)
3. наибольшую разность дат м/у соседними приходами (партиями) так называемая наибольшая пауза в днях между приходами
В итоге запрос написал. Но при написании запроса использовал условие по номенклатуре, чтобы легче было отлаживать. Запрос отлично отрабатывал. Но когда убрал условие по номенклатуре запрос начал выводить некорректные данные. Есть подозрение что это возникло из за неправильного порядка сортировки в той части запроса где считается пункт №3. Добавил туда сортировку, но теперь он не хочет этот запрос формировать во временной таблице. Пишет вот такую ошибку "при формировании временной таблицы предложение упорядочить может использоваться только совместно с предложением первые". Подскажите как обойти эту проблему.
Вот текст рабочего запроса с условием по номенклатуре.
1 abda123
 
23.12.13
08:17
ВЫБРАТЬ
    ТоварыНаСкладахОстаткиИОбороты.Период КАК Период,
    ТоварыНаСкладахОстаткиИОбороты.КоличествоПриход КАК КоличествоПриход,
    ТоварыНаСкладахОстаткиИОбороты.Номенклатура
ПОМЕСТИТЬ ВТ
ИЗ
    РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, Регистратор, ДвиженияИГраницыПериода, ) КАК ТоварыНаСкладахОстаткиИОбороты
ГДЕ
    ТоварыНаСкладахОстаткиИОбороты.Номенклатура = &Номенклатура
    И ТоварыНаСкладахОстаткиИОбороты.Регистратор ССЫЛКА Документ.ПоступлениеТоваровУслуг

ИНДЕКСИРОВАТЬ ПО
    Период
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    КОЛИЧЕСТВО(ВТ1.Период) КАК Номер,
    ВТ.Период КАК Период,
    ВТ.КоличествоПриход,
    ВТ.Номенклатура
ПОМЕСТИТЬ ВТСНомеромСтроки
ИЗ
    ВТ КАК ВТ
        ЛЕВОЕ СОЕДИНЕНИЕ ВТ КАК ВТ1
        ПО ВТ.Период > ВТ1.Период

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    СУММА(ВТСНомеромСтроки.КоличествоПриход) КАК КоличествоПриход,
    ВТСНомеромСтроки.Номенклатура,
    МАКСИМУМ(РАЗНОСТЬДАТ(ВТСНомеромСтроки1.Период, ВТСНомеромСтроки.Период, ДЕНЬ)) КАК РазностьДат
ПОМЕСТИТЬ ВТРазностьДат
ИЗ
    ВТСНомеромСтроки КАК ВТСНомеромСтроки
        ЛЕВОЕ СОЕДИНЕНИЕ ВТСНомеромСтроки КАК ВТСНомеромСтроки1
        ПО (ВТСНомеромСтроки.Номер = ВТСНомеромСтроки1.Номер + 1)

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

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

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

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТОстаткиИПродажи.Номенклатура,
    ВТОстаткиИПродажи.КоличествоНачальныйОстаток,
    ВТОстаткиИПродажи.КоличествоПриход,
    ВТОстаткиИПродажи.КоличествоПриходов,
    ВТОстаткиИПродажи.ДатаПоследнегоПрихода,
    ВТОстаткиИПродажи.НаибольшаяРазностьДатМеждуПриходами,
    ВТОстаткиИПродажи.КоличествоКонечныйОстаток,
    ВТОстаткиИПродажи.КоличествоОборот КАК Продажи,
    ЦеныНоменклатурыСрезПоследних.Цена,
    РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, МЕСЯЦ) КАК КоличествоМесяцевВПериоде
ИЗ
    ВТОстаткиИПродажи КАК ВТОстаткиИПродажи
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних
        ПО ВТОстаткиИПродажи.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура
ГДЕ
    ЦеныНоменклатурыСрезПоследних.ТипЦен = &ТипЦен
2 abda123
 
23.12.13
08:25
Изменил первую часть запроса для того чтобы он по всей номенклатуре выводил дату
ВЫБРАТЬ
    ТоварыНаСкладахДляФасовкиОстаткиИОбороты.Период КАК Период,
    ТоварыНаСкладахДляФасовкиОстаткиИОбороты.КоличествоПриход КАК КоличествоПриход,
    ТоварыНаСкладахДляФасовкиОстаткиИОбороты.Номенклатура
ПОМЕСТИТЬ ВТ
ИЗ
    РегистрНакопления.ТоварыНаСкладахДляФасовки.ОстаткиИОбороты(&НачПериода, &КонПериода, Регистратор, ДвиженияИГраницыПериода, ) КАК ТоварыНаСкладахДляФасовкиОстаткиИОбороты
ГДЕ
    ТоварыНаСкладахДляФасовкиОстаткиИОбороты.Регистратор ССЫЛКА Документ.ПоступлениеТоваровУслуг

ИНДЕКСИРОВАТЬ ПО
    Период
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    КОЛИЧЕСТВО(ВТ1.Период) КАК Номер,
    ВТ.Период КАК Период,
    ВТ.КоличествоПриход,
    ВТ.Номенклатура КАК Номенклатура
//ПОМЕСТИТЬ ВТСНомеромСтроки вот в этой строке проблема. нужно поместить реузультат запроса в ВТ, а пишет ошибку!!!!!!    
ИЗ
    ВТ КАК ВТ
        ЛЕВОЕ СОЕДИНЕНИЕ ВТ КАК ВТ1
        ПО ВТ.Период > ВТ1.Период
            И ВТ.Номенклатура = ВТ1.Номенклатура

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

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

////////////////////////////////////////////////////////////////////////////////
3 Defender aka LINN
 
23.12.13
08:25
(0) "Есть подозрение что это возникло из за неправильного порядка сортировки в той части запроса где считается пункт №3" - никогда больше не кури эту гадость.
(1) Ты реально думаешь, что это кто-то читать будет?
4 abda123
 
23.12.13
08:28
Ошибка связана с тем что добавил сортировку по номенклатуре.
Т.е. по сути запрос работает но с условием по одной номенклатуре. Нужно что бы работал по все номенклатуре. Загвоздка возникла с тем что при формировании таблицы с периодом прихода и номером строки таблица выходит не отсортированная, для этого добавлена сортировка по номенклатуре, но теперь не хочет помещать её во ВТ. Вариант работы с ТЗ не предлагать, Хочу сделать все запросом.
5 Лефмихалыч
 
23.12.13
08:30
"ГДЕ
    ТоварыНаСкладахОстаткиИОбороты.Номенклатура = &Номенклатура"
минус 2 балла
6 Defender aka LINN
 
23.12.13
08:30
(4) Что за человек... Я же сказал тебе - не кури больше эту траву.
7 abda123
 
23.12.13
08:37
не курю)
8 SeraFim
 
23.12.13
08:38
я знаю, что тут неправильно!
Тут неправильно - ВСЁ
9 Лефмихалыч
 
23.12.13
08:39
ну и за не оптимальность еще 0.5...3

1. надо это получать из того регистра, где у тебя партии хранятся. Тогда основая таблица - это тупо оборты за период с группировкой по партиям.
2. берем эти обороты и, памятуя о том, в партии всегда хранится ее дата, ресурсы отчета 2 и 3 получаем срезом последних и срезом последних на каждую дата среза последних, каковые берутся элементарнейшим соединением с "самсебя"
10 abda123
 
23.12.13
08:44
(9) насчет партий это я так выразился чтобы объяснить что такое приход, на самом учет по партиям не ведется. Остатки товаров корректно ведутся только в регистре "Товары на складах".
11 abda123
 
23.12.13
08:46
Задам вопрос по другому. В запрос по остаткам и продажам за период необходимо вывести наибольший интервал между соседними датами приходов. Как это можно сделать?
12 SeraFim
 
23.12.13
09:26
(11)наибольший интервал между соседними датами приходов - не понял

01.01.2013 Яблоки 20кг
01.06.2013 Яблоки 10кг
01.06.2013 Груши 12кг
01.08.2013 Яблоки 20кг
01.09.2013 Груши 5кг

что в итоге должно получиться?
Яблоки 6 месяцев
Груши 3 месяца ?
13 SeraFim
 
23.12.13
09:29
+(12) тьфу, туплю. в (0) же разжевано
14 SeraFim
 
23.12.13
09:33
ВЫБРАТЬ
    Максимум(ВТ1.Период) КАК ПредыдущийПриход,
    ВТ.Период КАК Период,
    ВТ.Номенклатура
ПОМЕСТИТЬ ВТСНомеромСтроки
ИЗ
    ВТ КАК ВТ
        ЛЕВОЕ СОЕДИНЕНИЕ ВТ КАК ВТ1
        ПО ВТ.Номенклатура = ВТ1.Номенклатура
        И ВТ.Период > ВТ1.Период

СГРУППИРОВАТЬ ПО
    ВТ.Период,
    ВТ.Номенклатура
;
Вот так ты можешь получить для каждой номенклатуры и прихода - дату предыдущего прихода.
15 abda123
 
23.12.13
09:35
(14) спасибо за подсказку сейчас попробую
16 abda123
 
23.12.13
10:55
(14) Спасибо проверил вроде бы все как надо.
если интересно (что вряд ли) вот окончательный вариант запроса.

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

ИНДЕКСИРОВАТЬ ПО
    Период
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    МАКСИМУМ(ВТ1.Период) КАК ПредыдущийПриход,
    ВТ.Период КАК Период,
    ВТ.Номенклатура
ПОМЕСТИТЬ ВТСНомеромСтроки
ИЗ
    ВТ КАК ВТ
        ЛЕВОЕ СОЕДИНЕНИЕ ВТ КАК ВТ1
        ПО ВТ.Номенклатура = ВТ1.Номенклатура
            И ВТ.Период > ВТ1.Период

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

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

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

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

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

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТОстаткиИПродажи.Номенклатура,
    ВТОстаткиИПродажи.КоличествоНачальныйОстаток,
    ВТОстаткиИПродажи.КоличествоПриход,
    ВТОстаткиИПродажи.КоличествоПриходов,
    ВТОстаткиИПродажи.ДатаПоследнегоПрихода,
    ВТОстаткиИПродажи.НаибольшаяРазностьДатМеждуПриходами,
    ВТОстаткиИПродажи.КоличествоКонечныйОстаток,
    ВТОстаткиИПродажи.КоличествоОборот,
    ЦеныНоменклатурыСрезПоследних.Цена,
    РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, МЕСЯЦ) КАК КоличествоМесяцевВПериоде
ИЗ
    ВТОстаткиИПродажи КАК ВТОстаткиИПродажи
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних
        ПО ВТОстаткиИПродажи.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура
ГДЕ
    ЦеныНоменклатурыСрезПоследних.ТипЦен = &ТипЦен
17 abda123
 
23.12.13
10:58
Факт в том что запрос в консоли по быстродействию отрабатывает нормально. Загоняю его в СКД и получаю рабочий отчет с дополнительной аналитикой по остаткам. Мне кажется так более оптимально чем использовать ТЗ и построитель отчета.
18 abda123
 
23.12.13
11:02
Будет интересно услышать замечания по доработке запроса.