Добрый день! Помогите пожалуйста с запросом.

УПП 1.3. Нужен небольшой отчет, который бы выводил список заказов покупателей в статусе "согласован" с датой согласования.

Составляю запрос

```1c
    ВЫБРАТЬ
    СтатусыЗаказов.Период КАК ДатаСогласования,
    СтатусыЗаказов.Заказ,
    СтатусыЗаказов.Статус
    ИЗ
    РегистрСведений.СтатусыЗаказов КАК СтатусыЗаказов
    ГДЕ
    СтатусыЗаказов.Статус = &Согласован
    И СтатусыЗаказов.Период МЕЖДУ &НачалоПериода И &КонецПериода

    УПОРЯДОЧИТЬ ПО
    ДатаСогласования
```

В результате получаю список всех заказов которые получили статус "согласован", но мне нужны только те, которые согласованы на данный момент.

Понимаю, что нужно еще что то вроде

```1c
    ВЫБРАТЬ
    МАКСИМУМ(СтатусыЗаказовСрезПоследних.Период) КАК Период,
    СтатусыЗаказовСрезПоследних.Заказ КАК Заказ
    ИЗ
    РегистрСведений.СтатусыЗаказов.СрезПоследних КАК СтатусыЗаказовСрезПоследних

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

но не могу эти два запроса объединить.

У РС СтатусыЗаказов два измерения - Заказ и ДокуменОснование.
---
Вот еще решение:

```1c
    ВЫБРАТЬ
    МАКСИМУМ(СтатусыЗаказовСрезПоследних.Период) КАК Период,
    СтатусыЗаказовСрезПоследних.Заказ КАК Заказ
    ПОМЕСТИТЬ вт_заказы
    ИЗ
    РегистрСведений.СтатусыЗаказов.СрезПоследних(, ) КАК СтатусыЗаказовСрезПоследних

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

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    СтатусыЗаказов.Период КАК Период,
    СтатусыЗаказов.Заказ КАК Заказ,
    СтатусыЗаказов.Статус КАК Статус
    ИЗ
    вт_заказы КАК вт_заказы
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СтатусыЗаказов КАК СтатусыЗаказов
    ПО (вт_заказы.Период = СтатусыЗаказов.Период)
    И (вт_заказы.Заказ = СтатусыЗаказов.Заказ)
    И (СтатусыЗаказов.Статус = &Статус)
```
---
Упс. Забыл группировку в (60)

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

```1c
    ВЫБРАТЬ
    СтатусыЗаказов.Период КАК ДатаСогласования,
    СтатусыЗаказов.Заказ,
    СтатусыЗаказов.Статус
    ИЗ
    РегистрСведений.СтатусыЗаказов.СрезПоследних(, Статус = &Согласован) КАК СтатусыЗаказов

    УПОРЯДОЧИТЬ ПО
    ДатаСогласования
```
---
но мне нужны только те, которые согласованы на данный момент
---
тогда вот так:

```1c
    ВЫБРАТЬ
    Максимум(СтатусыЗаказов.Период) КАК ДатаСогласования,
    СтатусыЗаказов.Заказ,
    СтатусыЗаказов.Статус
    ИЗ
    РегистрСведений.СтатусыЗаказов.СрезПоследних КАК СтатусыЗаказов
    ГДЕ
    СтатусыЗаказов.Статус = &Согласован

    СГРУППИРОВАТЬ ПО
    СтатусыЗаказов.Заказ,
    СтатусыЗаказов.Статус

    УПОРЯДОЧИТЬ ПО
    ДатаСогласования
```
---
Так уже пробовал
---
Не, в (46) та же проблема - можно получить не последний статус, если заказ потом закрыли по другому основанию.
---
в (46) как раз и убирает вообще такие заказы из выборки. Там останутся только заказы, у которых последний статус = &Статус/
---
Там еще измерение "Основание". Если после согласования заказ закрыли по другому основанию, то ты это теряешь.
---
это да. По другому измерению возможно.
---
А у него именно этот случай. Смотри (49)
---
СГРУППИРОВАТЬ ПО
    СтатусыЗаказов.Заказ,
    СтатусыЗаказов.Статус

добавили?
---
Добавил. Но снова в отчете все заказы у которых когда либо был статус "согласован", а не на данный момент.
---
достаточно последнего запроса - группировть виртуальную таблицу не надо она сама группируется а период задать как параметр виртуальной таблицы
---
Спасибо, но так я максимум получу текущие статусы всех заказов, а мне нужны только заказы у которых статус "согласован" на текущий момент (момент формирования отчета). Плюс нужна возможность задавать интервал дат в пределах которого произошло согласование.
---
Выбрать вт1.Заказ из РезультатПервогоЗапроса как вт1 внутреннее соединение РезультатВторогоЗапроса как вт2 по
вт1.Заказ = вт2.Заказ
---
К сожалению не работает. Первый запрос дает заказы которые согласовывались в пределах периода. Второй - все заказы и их текущие статусы. Это бы работало, если бы второй запрос давал только заказы, у которых текущий статус "согласован"...
---
Попробуйте объяснить вашу фразу
"В результате получаю список всех заказов которые получили статус "согласован", но мне нужны только те, которые согласованы на данный момент. "

Что значит "согласован на данный момент"? Заказ или согласован или имеет другой статус, который, скорее всего лежит в перечислении.
У Вас РС и вы можете выбрать из него либо все согласованные, либо все согласованные за период, "на данный момент" - это очень похоже на остаток, но остатка на РС нет. Поясните подробнее - что вы все таки хотите.
---
это же очередная задачка на логику - кто как догадается раз срез последних значит регистр периодический и есть понятие согласован на данный момент, вчера мог быть не согласован
---
Я хочу выбрать все согласованные за период, но у которых текущий статус (в данный момент времени) "согласован". Так как после зака может быть например "закрыт".
---
Это ваш первый запрос, когда КонецПериода равен текущей дате.
---
вам кто мешает поставить у второго запроса условие ГДЕ статус = согласован? - система сначала возьмет все заказы по их статусам на последнюю дату а вы потом из них выберете те что согласованы
---
```1c
    ВЫБРАТЬ
    СЗ.Период КАК ДатаСогласования,
    СЗ.Заказ КАК Заказ
    ИЗ
    РегистрСведений.СтатусыЗаказов.СрезПоследних КАК СЗ
    ГДЕ
    СЗ.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыЗаказов.Согласован)
    И СЗ.Период МЕЖДУ &НачалоПериода И КОНЕЦПЕРИОДА(&КонецПериода, ДЕНЬ)
```
---
:) по сути первый запрос автора. при условии КонецПериода = Текущий день.
---
Нет. У автора запрос к основной таблице, а не к срезу.
---
Не работает. Так я по прежнему получаю все заказы (которые были согласованы между НачалоПериода и КонецПериода). Но большинство этих заказов уже имеют другой статус и они в отчет попадать не должны.
---
А при изменении статуса добавляется новая запись?
Какой документ основание для установки статуса согласован?
Если другой документ меняет этот статус, то в условие надо добавить документ основание, который ставит статус согласован, и при этом нет других записей по данному заказу с датой позже даты документа основания на согласование. Как то так...
---
да
---
Тогда почему нигде в запросе не участвует это измерение. Оно ведь меняет статус.
---
Правильно, попадают все записи у которых есть согласован, но так как запись не меняется а создается другая с новым статусом то они сюда и не попадают. Уберите условие СтатусыЗаказовСрезПоследних.Статус = &Согласован
 и вы увидите все статусы.
Вам надо сделать таблицу заказов с закрытыми статусами и соединить ее с согласованными, что бы остались те у кого нет закрытого статуса.
---
Так там между "согласован" и "закрыт" еще куча статусов может быть)
---
Не тупи. Там срез последних, а не как у тебя - основная таблица. В результат попадут только согласованные на сейчас. Просто скопируй и выполни.
---
вот что у меня сейчас

```1c
    ВЫБРАТЬ
    СтатусыЗаказовСрезПоследних.Период КАК ДатаСогласования,
    СтатусыЗаказовСрезПоследних.Заказ,
    СтатусыЗаказовСрезПоследних.Статус
    ИЗ
    РегистрСведений.СтатусыЗаказов.СрезПоследних(, ) КАК СтатусыЗаказовСрезПоследних
    ГДЕ
    СтатусыЗаказовСрезПоследних.Статус = &Согласован
    И WСтатусыЗаказовСрезПоследних.Период МЕЖДУ &НачалоПериода И &КонецПериода
```

И в результат попадают согласованные не только "на сейчас", но и давно закрытые (статус=закрыт)! На скрине выделенный заказ на самом деле уже имеет статус "закрыт".
---
давно закрытые сюда попасть не могут если параметр = Согласован, ты имеешь ввиду сюда попадают согласованные у которых сейчас закрыт - попробуй и меня услышать и перенес ти отбор по периоду в параметры таблицы - только отбор по периоду))
---
Ты прав. Извини. Тогда так:

```1c
    ВЫБРАТЬ
    СогласованныеЗаказы.Заказ,
    СогласованныеЗаказы.ДатаСогласования
    ИЗ
    (ВЫБРАТЬ
    СтатусыЗаказовСрезПоследних.Период КАК ДатаСогласования,
    СтатусыЗаказовСрезПоследних.Заказ
    ИЗ
    РегистрСведений.СтатусыЗаказов.СрезПоследних(, ) КАК СтатусыЗаказовСрезПоследних
    ГДЕ
    СтатусыЗаказовСрезПоследних.Статус = &Согласован) КАК СогласованныеЗаказы
    ГДЕ
    СогласованныеЗаказы.ДатаСогласования МЕЖДУ &НачалоПериода И &КонецПериода
```

Но производительность этого запроса вряд ли будет оптимальной. Можно написать более производительный запрос, но он будет сложнее.
Быстрее будет сначала по основной таблице получить все согласованные за период, а потом отдельным запросом с отбором по полученным заказам отфильтровать те из них, которые согласованы на сейчас. Но если в процессе жизни заказа возможны циклические изменения статуса (несколько согласований и отмен в процессе), то можно получить не совсем корректный результат.
---
Хотя стоп. Не понимаю, как так может получаться. Что-то у тебя не так. Не могут закрытые попадать в результат. Мы же их явно отбрасываем.
---
А если так

```1c
    ВЫБРАТЬ РАЗЛИЧНЫЕ
    СтатусыЗаказов.Заказ
    ПОМЕСТИТЬ ЗаказыСогласованныеВТеченииПериода
    ИЗ
    РегистрСведений.СтатусыЗаказов КАК СтатусыЗаказов
    ГДЕ
    СтатусыЗаказов.Период МЕЖДУ &НачалоПериода И &КонецПериода
    И СтатусыЗаказов.Статус = &Согласован
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    СтатусыЗаказовСрезПоследних.Заказ
    ИЗ
    РегистрСведений.СтатусыЗаказов.СрезПоследних(, Статус = &Согласован) КАК СтатусыЗаказовСрезПоследних
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ ЗаказыСогласованныеВТеченииПериода КАК ЗаказыСогласованныеВТеченииПериода
    ПО СтатусыЗаказовСрезПоследних.Заказ = ЗаказыСогласованныеВТеченииПериода.Заказ
```
---
да достаточно вируалки - срез последних че вы человека путаете - в параметрах отбор по периоду, будут все заказы - условием ГДЕ из них берем только = Согласован, если конечно человеку нужны согласованные на дату: ликбез указание параметра в виртуалке группирует таблицу - все равно что отбор условие поставить, но условие на согласован должно быть внешним это редкое исключение когда условие в виртуалке задаются через ГДЕ, в случае когда нужен отбор по ПЕРИОДУ и по ИЗМЕРЕНИЮ одновременно
---
Я догадался. Наверное структура регистра дебильная и статус там в измерениях, а не ресурсах. Я прав или я прав?
---
```1c
    ГДЕ
    СтатусыЗаказовСрезПоследних.Статус = &Согласован
    И WСтатусыЗаказовСрезПоследних.Период МЕЖДУ &НачалоПериода И &КонецПериода
```

Этот отбор явно некорректно работает по отношению к виртуальной таблице СрезПоследних, отбор нужно задавать в скобках

```1c
    РегистрСведений.СтатусыЗаказов.СрезПоследних(, )]КАК СтатусыЗаказовСрезПоследних
```

Статус это единственный ресурс.
---
Наоборот. "В скобках" можно указывать только отборы по измерениям. Отбор по ресурсу приведет к некорректному результату среза.
---
У меня просто типовой нет. Опиши измерения и ресурсы твоего регистра.
---
Тогда я не понимаю. Смотри за логикой:
1) срез последних без параметров и отборов вернет ТЕКУЩИЕ статусы всех заказов.
2) если из результата отобрать только согласованные, то это будут ТЕКУЩИЕ согласованные
А ты говоришь, что у тебя попадают текущие ЗАКРЫТЫЕ
Либо ты что-то не то делаешь, либо куда-то не туда смотришь.
Может, закрыли, а потом опять согласовали? :)
---
О! Я кажется понял! Ты же это в СКД делаешь? Тогда стопудово путаница с неявными параметрами СКД. Т.е. срез на самом деле ты получаешь не по текущим статусам, а на конец указанного периода.
Выполни запрос в чистом виде (без СКД). Должно отработать правильно.
---
он не будет работать везде как нужно. Для виртуальной таблицы фильтр не указан. Выбираются все статусы. Уже на полученную выборку накладывается дополнительный фильтр.
---
ТС нужно отобрать из тех заказов, которые согласованы СЕЙЧАС те, которые согласовали в указанном периоде и вывести даты их согласования.
---
1) срез последних без параметров и отборов вернет ТЕКУЩИЕ статусы всех заказов.
Насколько я понимаю он возвращает в разрезе измерений, а так как статус-ресурс, то вернутся все статусы всех заказов. Разве нет?
---
Да. Вернутся все ТЕКУЩИЕ статусы всех заказов. И вторым этапом (в ГДЕ) мы отбираем из них только ТЕКУЩИЕ СОГЛАСОВАННЫЕ
---
Дело в том что у автора вчера у заказа статус согласован, а сегодня уже статус закрыт и это две записи, а завтра его снова сделают согласован и это будет третья запись.
Это если я правильно понял логику формирования записей в регистр.
---
все так
---
Все верно. И?
---
Всё ;). У меня нет под рукой УПП.
---
вот что дает срезпоследних без отборов, как я и говорил это все последние комбинации измерений
---
Если это в самом деле срез, то это бред с документом-основанием. Т.е. у тебя один и тот же заказ имеет два статуса по разным основаниям.
---
все верно. Так работает срез последних. Статус это второе измерение. А по измерениям могут быть разные данные на первое измерение.
А... Статус не измерение. Упс. Только что заметил.
---
Статус - это ресурс.
(49) Получается чтобы получить последний статус заказа, нужно еще дополнительно схлопывать по основаниям (получать последнее изменение).
---
Тогда придется писать портянку по аналогии с получением "среза последних на каждую дату"
---
```1c
    ВЫБРАТЬ
    СтатусыЗаказов.Заказ,
    СтатусыЗаказов.Период КАК ДатаСогласования
    ИЗ
    (ВЫБРАТЬ
    СЗ.Заказ,
    МАКСИМУМ(СЗ.Период) КАК ДатаПоследнегоСостояния
    ИЗ
    РегистрСведений.СтатусыЗаказов.СрезПоследних КАК СЗ) КАК ДатыПоследнихСостояний
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СтатусыЗаказов.СрезПоследних КАК СтатусыЗаказов
    ПО СтатусыЗаказов.Заказ = ДатыПоследнихСостояний.Заказ И СтатусыЗаказов.Период = ДатыПоследнихСостояний.ДатаПоследнегоСостояния
    ГДЕ
    СтатусыЗаказов.Статус = &Согласовано И СтатусыЗаказов.Период МЕЖДУ &НачалоПериода И &КонецПериода
```

Можно сделать эффективнее, но сложнее и менее корректно в случае возможности повторных согласований
---
ошибка поле не найдено СтатусыЗаказов.Заказ...
---
смотрите внимательнее запрос. Что-то не так скопировали, заполнили. Проверьте со своими реквизитами. У меня нет вашей базы.
---
это я к запросу выше... Ваш запрос дает пустой отчет с двумя колонками заказ/статус
---
значит последние статусы не "Согласован". Смотрите сам регистр. Или поле Согласован не выбран.
И мой запрос не может давать только 2 колонки. Там 3 колонки. Где его выполняете?
Да, у меня в запросе указан &Статус, а не &Согласовано.
---
(68) Работает! Просто уже начал тупо копировать текст. Огромное спасибо за помощь!
---
Упс. Забыл группировку в (60)

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

```1c
    ВЫБРАТЬ
    МАКСИМУМ(СтатусыЗаказовСрезПоследних.Период) КАК Период,
    СтатусыЗаказовСрезПоследних.Заказ КАК Заказ
    ПОМЕСТИТЬ вт_заказы
    ИЗ
    РегистрСведений.СтатусыЗаказов.СрезПоследних(, ) КАК СтатусыЗаказовСрезПоследних

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

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