Версия для печати темы (https://pro1c.org.ua/index.php?s=4014695e6927c08b3de419a4529b1e8c&showtopic=54554)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование в 1С Предприятие 8.3 _ Как программно получить цену по договору

Автор: TailorMade 09.10.19, 11:58

Здравствуйте. Есть документ Заказ Покупателя. В нем есть Договор, у которого установлен тип цен. И по этому типу цен документов "Установка цен номенклатуры" установлена цена. Как программно с модуля документа Заказ Покупателя получить эту цену?
УТП 8.3

Автор: sava1 09.10.19, 13:13

запрос к рег. сведений ЦеныНоменклатуры с отбором по указанной цене и Номенклатуре

Автор: Vofka 09.10.19, 13:20

Посмотрите модуль Ценообразование, там есть много функций для получения цены.

Автор: TailorMade 09.10.19, 14:08

Я сделал такую процедуру, но не могу понять, почему она ничего не выводит. Хотя запрос я проверял и значение в него попадает

Процедура ПолучитьЦену()
    
    ТипЦен = ЭтотОбъект.ДоговорКонтрагента.ТипЦен;    
    ЗначениеНоменклатуры = Справочники.Номенклатура.НайтиПоКоду("000101087");
    
    Запрос = Новый Запрос;
    Запрос.Текст ="ВЫБРАТЬ
                  |    ЦеныНоменклатурыСрезПоследних.Цена
                  |ИЗ
                  |    РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, ) КАК ЦеныНоменклатурыСрезПоследних
                  |ГДЕ
                  |    ЦеныНоменклатурыСрезПоследних.ТипЦен = &ТипЦен
                  |    И ЦеныНоменклатурыСрезПоследних.Номенклатура = &Номенклатура
                  |
                  |СГРУППИРОВАТЬ ПО
                  |    ЦеныНоменклатурыСрезПоследних.Цена";
                  
    Запрос.УстановитьПараметр("ТипЦен", ТипЦен);
    Запрос.УстановитьПараметр("Дата", ЭтотОбъект.Дата);
    Запрос.УстановитьПараметр("Номенклатура", ЗначениеНоменклатуры);
    
    Выборка = Запрос.Выполнить().Выбрать();
    Если Выборка.Следующий() Тогда
         Сообщить(Выборка.Цена);
    КонецЕсли;
    
КонецПроцедуры

Автор: Vofka 09.10.19, 15:12

Запрос.Текст = "
|ВЫБРАТЬ
|    ЦеныНоменклатурыСрезПоследних.Цена
|ИЗ
|    РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, ТипЦен = &ТипЦен И Номенклатура = &Номенклатура) КАК ЦеныНоменклатурыСрезПоследних
|";

Автор: TailorMade 09.10.19, 15:12

Сделал так, вроде нормально выводит

Функция ПолучитьЦену()
    
    ЗначениеНоменклатуры = Справочники.Номенклатура.НайтиПоКоду("000101087");
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    ЦеныНоменклатуры.Цена
        |ИЗ
        |    РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
        |ГДЕ
        |    ЦеныНоменклатуры.ТипЦен = &ТицЦен
        |    И ЦеныНоменклатуры.Номенклатура = &Номенклатура
        |
        |СГРУППИРОВАТЬ ПО
        |    ЦеныНоменклатуры.Цена";
    
    Запрос.УстановитьПараметр("Дата", ЭтотОбъект.Дата);
    Запрос.УстановитьПараметр("ТицЦен", ЭтотОбъект.ДоговорКонтрагента.ТипЦен);
    Запрос.УстановитьПараметр("Номенклатура", ЗначениеНоменклатуры);
    
    РезультатЗапроса = Запрос.Выполнить();
    
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        Возврат ВыборкаДетальныеЗаписи.Цена;
    КонецЦикла;

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

Автор: Vofka 09.10.19, 15:14

Цитата(TailorMade @ 09.10.19, 16:12) *
Сделал так, вроде нормально выводит

Если вас не смущает, что вы при этом в запросе не используете Дату, то вариант нормальный smile.gif

Автор: TailorMade 09.10.19, 15:33

Vofka @ Сегодня, 16:14 * ,
А если через условие в запросе дату указать? Я - дурак и не заметил..
Просто если так, как вы сказали брать Срез Последних, то почему-то ничего не попадает

когда смотрю через отладку, то видно, что параметры Дата и ТипЦены попадают в запрос, но Номенклатура почему-то не попадает

Автор: Vofka 09.10.19, 15:39

TailorMade, https://pro1c.org.ua/topic/kak-programmno-poluchit-tsenu-po-dogovoru-54554/?view=findpost&p=156357 не ищет?

Автор: TailorMade 09.10.19, 16:48

Vofka @ Сегодня, 16:39 * ,
Номенклатура не попадает..
Так вся функция выглядит :

Функция ПолучитьЦену()
    
    ЗначениеНоменклатуры = Справочники.Номенклатура.НайтиПоКоду("000101087");
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    ЦеныНоменклатурыСрезПоследних.Цена
        |ИЗ
        |    РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
        |            &Дата,
        |            ТипЦен = &ТипЦен
        |                И Номенклатура = &Номенклатура) КАК ЦеныНоменклатурыСрезПоследних";
    
    Запрос.УстановитьПараметр("Дата", ЭтотОбъект.Дата);
    Запрос.УстановитьПараметр("ТипЦен", ЭтотОбъект.ДоговорКонтрагента.ТипЦен);
    Запрос.УстановитьПараметр("Номенклатура", ЗначениеНоменклатуры);
    
    РезультатЗапроса = Запрос.Выполнить();
    
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        Возврат ВыборкаДетальныеЗаписи.Цена;
    КонецЦикла;

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


Если параметр Дата не указать, то в таком случае попадает. Не понимаю, почему так

Автор: Макс1С 09.10.19, 16:54

TailorMade @ Сегодня, 17:48 * ,
Сверьте дату/время документа в котором запускаете и дату установки цен, скорее в этом дело. А без даты в срезе последних вы получите абсолютно все записи(историю) цен по указанной номенклатуре

Автор: TailorMade 09.10.19, 17:22

Макс1С @ Сегодня, 17:54 * ,
Вот так вот. Я болван конечно! Спасибо вам, что указали на это smile.gif

Спасибо вам всем!

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua