Есть УНФ , последняя версия. У меня попросили в отчете по продажам добавить колонку " последняя цена закупки". Понятно, что ее можно взять из оборотного регистра "Закупки", но это в том случае, если были закупки в периоде отчета, а если их не было, то откуда взять такую цену? Подскажите...
---
Период вынести в запрос .СрезПоследних(&ЦеныНаДату, ). Потом в настройках СКД во вкладке Параметры его заполнить выражением, сославшись на другой параметр: Имя - ЦеныНаДату, в колонке Выражение - &ИмяДругогоПараметра (например &КонецПериода, или какой параметр там у Вас на вкладке СКД-Параметры отвечает за последнюю дату отчета)
---
из регистра "ЦеныНоменклатурыКонтрагентов", брать срез последних на конец периода отчета.
---
Если не было закупок то нет и продаж по нему, либо это товар из производства. Тогда нужно анализировать другой регистр. Но в этом регистре товар чисто по себестоимости
---
Почему именно в периоде отчета? В любом периоде - лишь бы была в регистре. Если несколько вариантов цены - взять последний.
---
не есть хороший вариант. Замедляет и очень существенно скорость формирования отчета.
---
Если используется регистрация цен поставщика, то см. (4).
(3) абсолютно прав. Сделай отдельную выборку с группировкой по номенклатуре, и максимальным периодом. И из регистра получай запись с этими параметрами.
---
Ну вот прикрутил левое соединение к запросу СКД

```1c
    ....
    ЦеныНоменклатурыКонтрагентовСрезПоследних.Цена КАК ЦенаПокупки

    ИЗ
    РегистрНакопления.Продажи.Обороты(, , Авто, ) КАК ПродажиОбороты
    {ЛЕВОЕ СОЕДИНЕНИЕ ПроданныеНаборы КАК ПроданныеНаборы
    ПО ПродажиОбороты.Документ = ПроданныеНаборы.Документ
    И ПродажиОбороты.НоменклатураНабора = ПроданныеНаборы.НоменклатураНабора
    И ПродажиОбороты.ХарактеристикаНабора = ПроданныеНаборы.ХарактеристикаНабора}
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатурыКонтрагентов.СрезПоследних(, ) КАК ЦеныНоменклатурыКонтрагентовСрезПоследних
    ПО ПродажиОбороты.Номенклатура = ЦеныНоменклатурыКонтрагентовСрезПоследних.Номенклатура
    И ПродажиОбороты.Характеристика = ЦеныНоменклатурыКонтрагентовСрезПоследних.Характеристика
```

Но при формировании отчета ругается на
 Ошибка обработки представления "РегистрСведений.ЦеныКонтрагентов.СрезПоследних: Несоответствие типов (параметр Номер 1)

Подозреваю , что не удалось найти цену контрагента в регистре. И как тут проверить на NULL?
---
Ориентируясь по скриншоту, нужно указать в поле период на какой момент времени берется срез последних.
По второму вопросу: ЕстьNULL(). Очень полезная вещь.
---
Но это запрос СКД там период в параметрах СКД.
---
Скорее всего соединять нужно не в запросе, а два набора данных.
---
IsNULL(ЦеныНоменклатурыКонтрагентовСрезПоследних.Цена,0) КАК ЦенаПокупки
---
Просто указав параметры здесь, мы сокращаем количество данных полученных для обработки.
Посмотри статью:
https://1cguide.ru/obuchenie-yazyku-zaprosov/konstruktor-zaprosov-1s.html/6
---
тут работает компоновщик данных. То есть параметры заранее не известны.
---
Скриншот можно? и Какой тип передается в параметр.
---
Скриншот в файле

{(6, 2)}: Ошибка обработки представления "РегистрСведений.ЦеныНоменклатурыКонтрагентов.СрезПоследних:Несоответствие типов (Параметр номер ""1"")"
<<?>>РегистрСведений.ЦеныНоменклатурыКонтрагентов.СрезПоследних(&П3, Номенклатура = &Номенклатура) КАК ЦеныНоменклатурыКонтрагентовСрезПоследних

ПЗ - это я так понимаю параметр запрос.

Добавил второй набор данных и описал его запросом

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

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

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

Если проблема в том, что формирование отчета и настройка параметров происходит через форму отчета "ФормаОтчетаУНФ". И там только один параметр "Период".
---
Период вынести в запрос .СрезПоследних(&ЦеныНаДату, ). Потом в настройках СКД во вкладке Параметры его заполнить выражением, сославшись на другой параметр: Имя - ЦеныНаДату, в колонке Выражение - &ИмяДругогоПараметра (например &КонецПериода, или какой параметр там у Вас на вкладке СКД-Параметры отвечает за последнюю дату отчета)
---
Если регистр сведений не ведется - то можно через регистр накопления попробовать ускорить - виртуальную таблицу сразу брать по нужной номенклатуре, использовать индексированную временную таблицу.
---
Регистр сведений ведется.
---
у РС ЦеныНоменклатурыКонтрагентов помимо Номенклатура и Характеристика есть еще измерение ВидЦенКонтрагента. Если по какой-нибудь номенклатуре зарегистрируется более одного вида цен - то в Вашем запросе из (8) обороты начнут задваиваться - т.к. по этой номенклатуре будет выводиться два вида цен с одним и тем же оборотом.
---
Это не решает проблему. Вот тут похожая ошибка рассматривается https://forum.infostart.ru/forum9/topic112492/
---
Да, когда-то раньше сталкивался, что параметр запроса выставляешь в СКД, но безрезультатно - нужно еще в инструкции построителя вмешиваться, которые в фигурных скобках {}. Но последнее время вроде и без этого проходило. У Вас какая платформа?
---
Платформа 8.3.14.2095
---
8.3.14.2095 Пробовал недавно на 8.3.17.1851 - там к инструкциям построителя обращаться не пришлось. По крайней мере посмотрел результаты без добавок инструкций пострителя - вернуло то, что ожидал.
---
Заработало. Спасибо.
Вот тут запрос второй набора данных

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

Связь наборов по Номенклатуре.
---
Вот моё. Для УНФ

```1c
    Функция ТекстЗапросаТаблицыБазовыхЦенПоПоследнимЗакупочнымЦенам()
    Возврат
    "ВЫБРАТЬ
    | Т.Номенклатура КАК Номенклатура,
    | Т.Характеристика КАК Характеристика,
    | Т.Период КАК Период,
    | ВЫБОР
    | КОГДА Т.Количество = 0
    | ТОГДА 0
    | ИНАЧЕ Т.Сумма / Т.Количество
    | КОНЕЦ КАК Цена
    |ПОМЕСТИТЬ ТПриходИсх
    |ИЗ
    | РегистрНакопления.Закупки КАК Т
    | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТОтбор КАК ТОтбор
    | ПО (Т.Номенклатура = ТОтбор.Номенклатура
    | И Т.Характеристика = ТОтбор.Характеристика
    | ИЛИ &ОтборНеЗаполнен)
    |ГДЕ
    | Т.Регистратор ССЫЛКА Документ.ПриходнаяНакладная
    | И Т.Период <= &Дата
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |ВЫБРАТЬ
    | ТПриходИсх.Номенклатура КАК Номенклатура,
    | ТПриходИсх.Характеристика КАК Характеристика,
    | МАКСИМУМ(ТПриходИсх.Период) КАК Период
    |ПОМЕСТИТЬ ТПриходМакс
    |ИЗ
    | ТПриходИсх КАК ТПриходИсх
    |
    |СГРУППИРОВАТЬ ПО
    | ТПриходИсх.Номенклатура,
    | ТПриходИсх.Характеристика
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |ВЫБРАТЬ
    | ТПриходИсх.Номенклатура КАК Номенклатура,
    | ТПриходИсх.Характеристика КАК Характеристика,
    | ТПриходИсх.Номенклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
    | МАКСИМУМ(ТПриходИсх.Цена) КАК Цена
    |ПОМЕСТИТЬ ТБ
    |ИЗ
    | ТПриходИсх КАК ТПриходИсх
    | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТПриходМакс КАК ТПриходМакс
    | ПО ТПриходИсх.Номенклатура = ТПриходМакс.Номенклатура
    | И ТПриходИсх.Характеристика = ТПриходМакс.Характеристика
    | И ТПриходИсх.Период = ТПриходМакс.Период
    |
    |СГРУППИРОВАТЬ ПО
    | ТПриходИсх.Номенклатура,
    | ТПриходИсх.Характеристика,
    | ТПриходИсх.Номенклатура.ЕдиницаИзмерения";

    КонецФункции
```