Имя: Пароль:
1C
1С v8
Как получить динамические цены
0 Виталий777
 
08.10.17
00:20
Всем привет.
Нужен прайс с использованием скидок по ценовым группам.
Вроде все сделал, работает.
Но появилась проблема, Если у клиента динамический тип цен, тогда прайс не формируется.
Так как динамические цены нигде не хранятся, как их вычислить???
Код:

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

    ТабДок.Вывести(ОбластьЗаголовок);
    ТабДок.Вывести(ОбластьШапкаТаблицы);
    ТабДок.НачатьАвтогруппировкуСтрок();
    
    ВыборкаДетальныеЗаписи=Результат.Выбрать();
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        Если ВыборкаДетальныеЗаписи.Ссылка.ЭтоГруппа Тогда
            ТекОбласть=ОбластьГруппа;
        Иначе
            //
            ЕдиницаИзмерения=ВыборкаДетальныеЗаписи.Ссылка.ЕдиницаХраненияОстатков;
            Цена=0;
            //
            ПараметрыОтбора=Новый Структура;
            ПараметрыОтбора.Вставить("Номенклатура",ВыборкаДетальныеЗаписи.Ссылка);
            Строки_ТЗцены=ТЗцены.НайтиСтроки(ПараметрыОтбора);
            Если Строки_ТЗцены.Количество()>0 Тогда
                ЕдиницаИзмерения=Строки_ТЗцены[0].ЕдиницаИзмерения;
                Валюта=Строки_ТЗцены[0].Валюта;
                Цена=Строки_ТЗцены[0].Цена;
            КонецЕсли;
            Если Цена>0 Тогда
                    Цена=Строки_ТЗцены[0].Цена2;
            КонецЕсли;
            
            ТекОбласть=ОбластьЭлемент;
            ТекОбласть.Параметры.ЕдиницаИзмерения=ЕдиницаИзмерения;
            ТекОбласть.Параметры.Валюта=Валюта;
            ТекОбласть.Параметры.Цена=Цена;
        КонецЕсли;
        ТекОбласть.Параметры.Номенклатура=ВыборкаДетальныеЗаписи.Ссылка;
        ТабДок.Вывести(ТекОбласть,ВыборкаДетальныеЗаписи.Уровень());
        
    КонецЦикла;
    ТабДок.ЗакончитьАвтогруппировкуСтрок();
    ТабДок.ОтображатьСетку=Ложь;
    ТабДок.ОтображатьЗаголовки=Ложь;
    ТабДок.ТолькоПросмотр=Истина;
    ТабДок.Показать();
1 Злопчинский
 
08.10.17
00:21
(0) "Так как динамические цены нигде не хранятся, как их вычислить??"
- очевидно так же как вычисляются при их появлении в типовых местах типовых конфигураций...
2 Виталий777
 
08.10.17
00:27
ожидал конечно более конкретного ответа ...
3 Злопчинский
 
08.10.17
00:32
- "Я хренею с вас, дорогая редакция..." пишет нам девочка Маша. И мы ей - верим!!!
4 ildary
 
08.10.17
07:46
(2) Даю конкретный ответ - предварительно рассчитываем динамические цены и суем их в запрос. На вопрос "Как?" - отвечаю - стуча по клавишам в конфигураторе.
Основная теорема систематики: Новые системы плодят новые проблемы.