Имя: Пароль:
1C
1С v8
Как получить тип цен в запросе
0 sergqwert
 
15.01.13
19:07
Есть запрос, позволяющий выгружать данные в прайс-лист:

Запр = Новый Запрос;
   Запр.Текст = "ВЫБРАТЬ
                |    ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура,
                |    ЦеныНоменклатурыСрезПоследних.Валюта,
                |    ЦеныНоменклатурыСрезПоследних.Номенклатура.Код КАК Код,
                |    ЦеныНоменклатурыСрезПоследних.Номенклатура.Артикул КАК Артикул,
                |    ЦеныНоменклатурыСрезПоследних.Номенклатура.ЕдиницаХраненияОстатков КАК Ед,
                |    СкидкиНаценкиНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура1,
                |    СкидкиНаценкиНоменклатурыСрезПоследних.ПолучательСкидки КАК ПолучательСкидки1,
                |    СкидкиНаценкиНоменклатурыСрезПоследних.ПроцентСкидкиНаценки,
                |    ВЫБОР
                |        КОГДА ЕСТЬNULL(СкидкиНаценкиНоменклатурыСрезПоследних.ДатаОкончания, &ТекДата) > &ТекДата
                |            ТОГДА ЦеныНоменклатурыСрезПоследних.Цена - ЦеныНоменклатурыСрезПоследних.Цена * ЕСТЬNULL(СкидкиНаценкиНоменклатурыСрезПоследних.ПроцентСкидкиНаценки, 0) / 100
                |        ИНАЧЕ ЦеныНоменклатурыСрезПоследних.Цена
                |    КОНЕЦ КАК ЦенаНов,
                |    ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура2,
                |    ТоварыНаСкладахОстатки.Склад КАК Склад,
                |    ЕСТЬNULL(ТоварыНаСкладахОстатки.КоличествоОстаток, 0) КАК Остаток
                |ИЗ
                |    РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
                |            &ТекДата,
                |            ТипЦен = &ТипЦен
                |                И ТипЦен = &ТипЦенПустой
                |                И Номенклатура.ПопадаетВПрайсЛист) КАК ЦеныНоменклатурыСрезПоследних
                |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СкидкиНаценкиНоменклатуры.СрезПоследних(&ТекДата, ПолучательСкидки = &ПолучательСкидки) КАК СкидкиНаценкиНоменклатурыСрезПоследних
                |        ПО ЦеныНоменклатурыСрезПоследних.Номенклатура = СкидкиНаценкиНоменклатурыСрезПоследних.Номенклатура
                |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(&ТекДата, Склад = &Склад) КАК ТоварыНаСкладахОстатки
                |        ПО ЦеныНоменклатурыСрезПоследних.Номенклатура = ТоварыНаСкладахОстатки.Номенклатура
                |
                |СГРУППИРОВАТЬ ПО
                |    ЦеныНоменклатурыСрезПоследних.Номенклатура,
                |    ЦеныНоменклатурыСрезПоследних.Валюта,
                |    ЦеныНоменклатурыСрезПоследних.Номенклатура.Код,
                |    ЦеныНоменклатурыСрезПоследних.Номенклатура.Артикул,
                |    ЦеныНоменклатурыСрезПоследних.Номенклатура.ЕдиницаХраненияОстатков,
                |    СкидкиНаценкиНоменклатурыСрезПоследних.Номенклатура,
                |    СкидкиНаценкиНоменклатурыСрезПоследних.ПолучательСкидки,
                |    СкидкиНаценкиНоменклатурыСрезПоследних.ПроцентСкидкиНаценки,
                |    ТоварыНаСкладахОстатки.Номенклатура,
                |    ТоварыНаСкладахОстатки.Склад,
                |    ВЫБОР
                |        КОГДА ЕСТЬNULL(СкидкиНаценкиНоменклатурыСрезПоследних.ДатаОкончания, &ТекДата) > &ТекДата
                |            ТОГДА ЦеныНоменклатурыСрезПоследних.Цена - ЦеныНоменклатурыСрезПоследних.Цена * ЕСТЬNULL(СкидкиНаценкиНоменклатурыСрезПоследних.ПроцентСкидкиНаценки, 0) / 100
                |        ИНАЧЕ ЦеныНоменклатурыСрезПоследних.Цена
                |    КОНЕЦ,
                |    ЕСТЬNULL(ТоварыНаСкладахОстатки.КоличествоОстаток, 0)
                |
                |УПОРЯДОЧИТЬ ПО
                |    Номенклатура
                |ИТОГИ ПО
                |    Номенклатура ИЕРАРХИЯ";
               
   Запр.Параметры.Вставить("ТипЦен", Контрагент.ОсновнойДоговорКонтрагента.ТипЦен) ;
   Запр.Параметры.Вставить("ПолучательСкидки",Контрагент);
   Запр.Параметры.Вставить("Склад",Склад);
   Запр.Параметры.Вставить("ТекДата",ТекущаяДата());
   Запр.Параметры.Вставить("набор",Справочники.ВидыНоменклатуры.НайтиПоКоду("000000003"));
   
   // проверка по типам цен
   Если Контрагент.ОсновнойДоговорКонтрагента.Пустая() Тогда
       Контрагент.ОсновнойДоговорКонтрагента.ТипЦен =  "ТипЦенПустой";
   Запр.Выполнить();
   КонецЕсли;
   
   // 1. проверка для контрагента с непустым основным договором.
   Если (НЕ Контрагент.ОсновнойДоговорКонтрагента.ВидДоговора = Перечисления.ВидыДоговоровКонтрагентов.СПокупателем) И
       (НЕ Контрагент.ОсновнойДоговорКонтрагента.Организация = Справочники.Организации.НайтиПоКоду("000000001")) Тогда
       Запр.Выполнить();
   КонецЕсли;
   
   // 2. проверка для контрагента с пустым основным договором
   Если Контрагент.ОсновнойДоговорКонтрагента.ВидДоговора <> Перечисления.ВидыДоговоровКонтрагентов.СПокупателем И Контрагент.ОсновнойДоговорКонтрагента.Организация = Справочники.Организации.ПустаяСсылка() Тогда
       Запр.Выполнить();
   КонецЕсли;
   
   ТБЗ = Запр.Выполнить().Выгрузить();
 
   ТБЗ.ВыбратьСтроку();
   Выборка = Запр.Выполнить().Выбрать(ОбходРезультатаЗапроса.Прямой);

Я не могу понять, почему до выполнения запроса я не могу определить, какой тип цен получит запрос? Или из основного договора (если он есть) либо пустой (если нет основного договора)?
1 Kreont
 
15.01.13
19:10
Где то я такое уже видел...
2 DrShad
 
15.01.13
19:13
(0) срочно сжечь
3 zladenuw
 
15.01.13
19:17
тут не правильно
 |            ТипЦен = &ТипЦен
                |                И ТипЦен = &ТипЦенПустой

я бы так   & ТипЦенНЕПустой И ТипЦен = &ТипЦен


я бы так
ОснДогТипЦен = Контрагент.ОсновнойДоговорКонтрагента.ТипЦен;
Запр.Параметры.Вставить("ТипЦенНеПостуой", НЕ ОснДогТипЦен.Пусатя()) ;
Запр.Параметры.Вставить("ТипЦен", ОснДогТипЦен ) ;
4 denfil
 
15.01.13
19:18
Код какой то кривой.
1) В запросе кривое условие "ТипЦен = &ТипЦен
                |                И ТипЦен = &ТипЦенПустой"
ТО есть тип цен по умолчанию должен быть равен пустому типу цен.
2)  Контрагент.ОсновнойДоговорКонтрагента.ТипЦен =  "ТипЦенПустой"; ТОже безобразие: ссылке присваиваеться значение да и еще не того типа.
3) Проверка зачем то выполняет запрос, а потом еще раз запрос выполнеться.
5 denfil
 
15.01.13
19:30
По типу можно сделать так
1) в запросе условие ТипЦен = &ТипЦен
2) В коде такое условие Если значениезаполнено(Контрагент.ОсновнойДоговорКонтрагента)  и (Контрагент.ОсновнойДоговорКонтрагента.ТипЦен) тогда
Запр.УстановитьПараметр("ТипЦен", Контрагент.ОсновнойДоговорКонтрагента.ТипЦен) иначе
Запр.УстановитьПараметр("ТипЦен", ТипЦенПоУмолчанию) конецесли;
3) Все проверки убрать
4) В запросе на скидки необходимо проверять время действие скидки.
6 sergqwert
 
16.01.13
14:30
так нельзя, т.к. Пустая() это метод получения Пустой ссылки
7 mikecool
 
16.01.13
14:31
(6) точнее и не скажешь
8 DrShad
 
16.01.13
14:32
(6) что!? открой СП
9 Reset
 
16.01.13
14:32
(6) Врешь
10 mikecool
 
16.01.13
14:33
Выбрать Различные ТипЦен Из РегистрСведений.ЦеныНоменклатуры
так в запросе можно получить тип цен, инфа 146%