Добрый день!

В УТ 11 есть регистр сведений ЦеныНоменклатурыПоставщиков (периодичность: В пределах секунды; режим записи: Подчинение регистратору).

Мне нужно получить последние цены для каждого товара из этого регистра, приведенные к рублям по текущему курсу.

Я делаю левое соединение виртуальной таблицы ЦеныНоменклатурыПоставщиковСрезПоследних и КурсыВалютСрезПоследних по полю Валюта. Передаю дату как параметр в поле Период этих виртуальных таблиц.

В результатах запроса получаются дубли строк из-за того, что Соглашение и УсловиеЦеныПоставщика я не вывожу (нет такой надобности), но они у этих строк отличаются.

Применить группировку не представляется возможным потому, что ресурсы Цена и Валюта у строк с одинаковыми Номенклатурой и Характеристикой могут отличаться.

Как мне получить одну единственную строку для каждой номенклатурной позиции, соответствующую самому последнему регистратору по дате?
---
Alexey26, удалось снизить до 1%. Принимаются предложения по оптимизации его производительности) снизить не удастся скорее всего именно потмоу что попадаются моменты как я эмулировал в (33), с производительностью у Вас все нормально.

(37) anterehin, Выбрать первые 1 получится всего одна строка с номенклатурой, а ТСу надо чтоб выбирались несколько номенклатур но записи чтоб не задваивались...
---
Alexey26,
В результатах запроса получаются дубли строк из-за того, что Соглашение и УсловиеЦеныПоставщика я не вывожу
"Глупо поставленная задача влечет еще более глупое решение" (с)
(4) andrewks, (11) Lyns_owner, (10) Sverhnovaya,
"Если программист видит, что задача - глупа, он должен указать на это заказчику" (с)
---
AlexO, не могу судить о том, насколько умно сформулирована данная конкретная задача, но мне кажется, что в общем случае задача получения неповторяющихся записей из среза последних по регистру сведений, не все измерения которого нас интересуют (или нам известны), является не такой уж и экзотической.
---
наверное, тут лучше использовать соединение подзапросов (или врем.таблиц) с выборкой максимума по дате
---
andrewks, не могли бы Вы, пожалуйста, написать чуть подробнее (если у Вас есть демо-база типовой УТ 11, консоль запросов и 30 сек. свободного времени)?
---
Alexey26, примерно так

```1c
    select
    Даты.Дата as Дата
    ,ТабКурсов.Валюта as Валюта
    ,max(ТабКурсов.Период) as Период
    from
    Даты
    left join
    РегистрСведений.КурсыВалют as ТабКурсов
    on
    (ТабКурсов.Валюта=&ВыбВалюта) and (ТабКурсов.Период<=Даты.Дата)
    group by
    Даты.Дата
    ,ТабКурсов.Валюта
```
---
andrewks, я не могу передать валюту через параметр, так как не знаю её. Единственным передаваемым параметром должна являться дата, на которую требуется получить срез последних...
---
Задача простая) зачем тему создавать :)

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

    СГРУППИРОВАТЬ ПО
    ЦеныНоменклатурыКонтрагентовСрезПоследних.Номенклатура,
    ЦеныНоменклатурыКонтрагентовСрезПоследних.ХарактеристикаНоменклатуры,
    ЦеныНоменклатурыКонтрагентовСрезПоследних.Валюта,
    ЦеныНоменклатурыКонтрагентовСрезПоследних.Цена,
    ЦеныНоменклатурыКонтрагентовСрезПоследних.Номенклатура.Артикул) КАК ДатыКурсов
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК КурсыВалют
    ПО ДатыКурсов.Валюта = КурсыВалют.Валюта
    И ДатыКурсов.МаксимальнаяДата = КурсыВалют.Период
```
---
Lyns_owner, спасибо, конечно!.. У Вас этот запрос выполняется на демо-базе УТ 11? Я пытаюсь его проверить, переименовал даже РС ЦеныНоменклатурыПоставщиков на ЦеныНоменклатурыКонтрагентов, но не помогло... Продолжу разбираться завтра)
---
Alexey26, мда, тяжелый случай. Что значит это ваше "не работает"?

На будущее: описывайте проблему максимально подробно, если конечно хотите, чтобы вам помогли.
---
Lyns_owner, вот текст ошибки:

"Таблица не найдена "РегистрСведений.ЦеныНоменклатурыКонтрагентов.СрезПоследних"
<<?>>РегистрСведений.ЦеныНоменклатурыКонтрагентов.СрезПоследних(&Период, ) КАК ЦеныНоменклатурыКонтрагентовСрезПоследних"
---
Alexey26, А заменить "ЦеныНоменклатурыКонтрагентов" на "ЦеныНоменклатурыПоставщиков" вам религия не позволяет? или вам все расписать надо до запятой? Хотите, чтобы кто-то работал за вас - оплачивайте его услуги.

(10) Sverhnovaya, Плохой вариант) чем вас мой не устроил?
---
Lyns_owner, после нескольких циклов переименований добился от Вашего запроса выполнения без синтаксических ошибок. Сейчас начну искать в нем наличие логических:

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

    СГРУППИРОВАТЬ ПО
    ЦеныНоменклатурыПоставщиковСрезПоследних.Номенклатура,
    ЦеныНоменклатурыПоставщиковСрезПоследних.Характеристика,
    ЦеныНоменклатурыПоставщиковСрезПоследних.Валюта,
    ЦеныНоменклатурыПоставщиковСрезПоследних.Цена,
    ЦеныНоменклатурыПоставщиковСрезПоследних.Номенклатура.Артикул) КАК ДатыКурсов
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК КурсыВалют
    ПО ДатыКурсов.Валюта = КурсыВалют.Валюта
    И ДатыКурсов.МаксимальнаяДата = КурсыВалют.Период
```
---
Alexey26, "после нескольких циклов переименований добился от Вашего запроса выполнения без синтаксических ошибок. Сейчас начну искать в нем наличие логических:"

Коллега в (4) дал вам готовый запрос, его только чуток под себя подстроить, а вы носом крутите :(
---
Hany, я благодарен каждому из коллег, кто выложил текст запроса в том или ином виде. В настоящее время я пытаюсь подстроить их под себя, чтобы определить, кому именно присудить денежный приз.
---
Alexey26, Вы их никогда не подстроите, потому что Вам надо определиться по какому соглашению брать Цену, если их в регистре несколько? а я в выложенных запросах что то не вижу решения этой проблемы... а еще в УТ есть регистр сведений ЦеныНоменклатуры, если Вам не нужен разрез Контрагентов, то может правильнее использовать его?
---
Alexey26, Я признателен человеку только за то, что он показал мне, в какую сторону копать) Вы же хотите получить готовое решение, ничего при этом не сделав. Обладая элементарными знаниями языка запросов, надо лишь немного подумать, чтобы написать данный запрос. Я надеюсь вы не считаете, что вам отвечают из-за объявленного вами вознаграждения?)
---
Lyns_owner, мне кажется, Вы забываете о тех людях, которые будут находить эту тему при поиске решения своей аналогичной проблемы. Я не понимаю, если человек может и начинает помогать другому, то почему не сделать этого до конца?
---
Alexey26,
аналогичной проблемы
Вы сами ответили на свой вопрос. Они увидят ответ на АНАЛОГИЧНУЮ проблему, а потом применяют его к своей, чего и вам советую.
Я не понимаю, если человек может и начинает помогать другому, то почему не сделать этого до конца?
Потому, что я не одобряю лень. Включите уже мозг и подумайте немного сами. Форум существует для помощи, а не для реализации ваших задач чужими силами.
---
Как вариант перекинуть весь этот запрос во вложенный, только добавить поле регистратор, сделать еще один вложенный запрос где выбрать срез последних записей по регистру ЦеныНоменклатурыПоставщиков без поля валюта(т.е только нужные поля по измерениям), и добавить поле регистратор. Затем соединить эти два вложенных запроса, по полю регистратор номенклатура характеристика , выбрав только те что встречаются во втором запросе. Изврат конечно, но сработать должно.
---
Sverhnovaya, спасибо Вам за вариант, но, если возможно, то, конечно, хотелось бы вначале попробовать обойтись без изврата)
---
подскажите пожалуйста. возможно ли одним документом внести цены по двум и более УсловиямЦеныПоставщика?, если да, то уточните политику партии по выбору из них одной
---
Sverhnovaya,
подскажите пожалуйста. возможно ли одним документом внести цены по двум и более УсловиямЦеныПоставщика?, если да, то уточните политику партии по выбору из них одной

да, есть такая проблема - если вводить одним документом, то возникнут задвоения, от которых уже не избавиться прежним способом. Но предполагается, что таких случаев будет относительно мало, так что на них можно закрыть глаза)
---
Alexey26, если вводить одним документом, то возникнут задвоения
читайте (21) и (27) документы разные были, дата документов разная, результат по одной и той же номенклатуре 2 сроки, см. (21)
---
ВЫБРАТЬ
 ЦеныНоменклатурыКонтрагентовСрезПоследних.Номенклатура КАК Номенклатура,
 ЦеныНоменклатурыКонтрагентовСрезПоследних.ХарактеристикаНоменклатуры,
 МАКСИМУМ(ЦеныНоменклатурыКонтрагентовСрезПоследних.Цена * КурсыВалютСрезПоследних.Курс * КурсыВалютСрезПоследних.Кратность) КАК МаксимальнаяЦенаВРублях
ИЗ
 РегистрСведений.ЦеныНоменклатурыКонтрагентов.СрезПоследних(&Дата, ) КАК ЦеныНоменклатурыКонтрагентовСрезПоследних
  ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних(, ) КАК КурсыВалютСрезПоследних
  ПО ЦеныНоменклатурыКонтрагентовСрезПоследних.Валюта = КурсыВалютСрезПоследних.Валюта

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

УПОРЯДОЧИТЬ ПО
 Номенклатура
---
Sverhnovaya,
Применить группировку не представляется возможным потому, что ресурсы Цена и Валюта у строк с одинаковыми Номенклатурой и Характеристикой могут отличаться.

не получится у (0) то что он хотит пока не определится - какую цену из рег. брать, если есть записи по двум или более соглашениям, задвоение идет не от валюты, а именно от соглашений
---
Двоение не из-за соглашения, а из-за того что в один момент времени есть записи для нескольких соглашение, таким образом есть 2 решения: 1 одним документом вносить данные по одному соглашению 2е привести к одной валюте, те получить цену в базовой валюте и выбрать одну исходя из решения заказчика(максимальную минимальную среднюю).
---
Sverhnovaya, именно это я и написал (0) в (19)
потому что Вам надо определиться по какому соглашению брать Цену

и еще не понятно почему, если Соглашения по боку, не ипользовать РС ЦеныНоменклатуры???
о чем тоже в принципе спросил у ТСа...
---
m-serg74, мне нужны цены из документа РегистрацияЦенНоменклатурыПоставщика, а он делает проводки только по РС ЦеныНоменклатурыПоставщиков.
---
Alexey26, Вы не ответили на главное
потому что Вам надо определиться по какому соглашению брать Цену

(23) Sverhnovaya, двоение именно из за соглашений, вот картинка регистра, а результат запроса в (21)
---
m-serg74, цену надо брать из соглашения, которое относится к записи регистра с самым последним значением периода (кстати, у Вас отличный скриншот, который наглядно всё демонстрирует!).
---
Alexey26, вот Вам два разных документа, в одно время с разными соглашениями, разными ценами, опять повторю главный вопрос!!! Какую цену брать???

Ваше самым последним значением периода не подходит, в качестве варианта для выбора
---
m-serg74, случай на скриншоте относительно редкий, поэтому можно брать обе цены.
---
Alexey26, жду ответ на вопрос к Вам в (27).
---
Sverhnovaya,
Двоение не из-за соглашения, а из-за того что в один момент времени есть записи для нескольких соглашение
Именно из-за Соглашений - которые определяют валюту, цену....
Это ОСНОВНОЕ измерение данного документа, и его в принципе нельзя не учитывать.
О чем и сообщает запрос к регистру ЦеныНоменклатурыПоставщика.
---
а как же выбрать первые и выбирать одну запись при сортировке по убыванию?
---
Публикую свой запрос. Процент дублей строк на моих тестовых данных (это около 100 тыс. номенклатурных позиций) удалось снизить до 1%. Принимаются предложения по оптимизации его производительности)

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

    СГРУППИРОВАТЬ ПО
    ЦеныНоменклатурыПоставщиковМаксимальныеПериоды.Характеристика,
    ЦеныНоменклатурыПоставщиковМаксимальныеПериоды.Номенклатура

    ИНДЕКСИРОВАТЬ ПО
    Номенклатура,
    Характеристика
    ;

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

    ИНДЕКСИРОВАТЬ ПО
    Номенклатура,
    Характеристика
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ РАЗРЕШЕННЫЕ
    ЦеныНоменклатурыПоставщиковВТ.Номенклатура КАК Наименование,
    ЦеныНоменклатурыПоставщиковВТ.Номенклатура.Артикул КАК Артикул,
    ЦеныНоменклатурыПоставщиковВТ.Цена * ЕСТЬNULL(КурсыВалютСрезПоследних.Курс, 0) / ЕСТЬNULL(КурсыВалютСрезПоследних.Кратность, 1) КАК ЦенаВРуб,
    ЦеныНоменклатурыПоставщиковВТ.Номенклатура.Производитель КАК Производитель,
    ЦеныНоменклатурыПоставщиковВТ.Характеристика,
    ЦеныНоменклатурыПоставщиковВТ.Цена,
    ЦеныНоменклатурыПоставщиковВТ.Валюта
    ИЗ
    ЦеныНоменклатурыПоставщиковВТ КАК ЦеныНоменклатурыПоставщиковВТ
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних(&Период, ) КАК КурсыВалютСрезПоследних
    ПО ЦеныНоменклатурыПоставщиковВТ.Валюта = КурсыВалютСрезПоследних.Валюта
```
---
Alexey26, удалось снизить до 1%. Принимаются предложения по оптимизации его производительности) снизить не удастся скорее всего именно потмоу что попадаются моменты как я эмулировал в (33), с производительностью у Вас все нормально.

(37) anterehin, Выбрать первые 1 получится всего одна строка с номенклатурой, а ТСу надо чтоб выбирались несколько номенклатур но записи чтоб не задваивались...
---
Принимаются предложения по оптимизации его производительности)
Делаете вложенный запрос, в нём два запроса.. первый это номенклатура из табличной части документа, второй
Выбрать первые 1+сортировка по убыванию по периоду и связываете по номенклатуре
---
anterehin, по производительности вложенные запросы уступают временным таблицам.
---
Alexey26, чем то всегда приходится жертвовать.. а какова изначальная задача? вы описали механизм который нужно получить. А какова его конечная цель?
---
anterehin, жертвовать производительностью при оптимизации производительности - это за гранью моего понимания) Конечная цель оптимизации производительности видится мне в минимизации времени формирования отчета, в основе которого лежит данный запрос.
---
m-serg74,получится всего одна строка с номенклатурой, а ТСу надо чтоб выбирались несколько номенклатур но записи чтоб не задваивались...
Одна она получится если использовать это условие на запросе Алексея, а если сделать вложенный то он будет выбирать как раз первую для каждой номенклатуры
---
anterehin, как там говорится? - назвался груздем? ))) пример в студию... иначе (42) просто слова
---
и какой идиот из 1С придумал запихать Валюту и Упаковку в РЕСУРСЫ регистра?!
Они там совсем уже ... забыли, зачем нужны ресурсы? И зачем введены Реквизиты?
---
AlexO, какой идиот из 1С охаить то что делают другие всегда проще чем сделать самому
---
если из регистра сведений не выбирается в запросе поле то он его учитывать не должен, как ни старалась повторить задвоение так и не удалось. даже без номенклатуры он выбирал последние записи. а если попробовать переименовать таблицу в запросе. Просто пару раз это меня спасало, правда со справочниками такая история была не с регистрами. Предлагаю попробовать Вам, а не сама пробую из-за того что повторить вашу ситуацию не удалось.
---
ВЫБРАТЬ
    КОЛИЧЕСТВО(ФизическиеЛица_1.Наименование) КАК Номер,
    ФизическиеЛица.Ссылка КАК ФИО
ИЗ
    Справочник.ФизическиеЛица КАК ФизическиеЛица
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ФизическиеЛица КАК ФизическиеЛица_1
        ПО (ФизическиеЛица.Наименование + ФизическиеЛица.Код >= ФизическиеЛица_1.Наименование + ФизическиеЛица_1.Код)

СГРУППИРОВАТЬ ПО
    ФизическиеЛица.Ссылка

УПОРЯДОЧИТЬ ПО
    Номер