Стоит задача в алгоритм действия скидок, добавить условие чтобы скидки срабатывали при наличии у покупателя дисконтной карты. Т.е. должен быть такой вариант, например, что если стоит условие "количество товара превысило" например 5 штук и стоит признак "Только для дисконтных карт", то эта скидка срабатывает только при наличии у покупателя карты.
В регистр сведений "СкидкиНаценкиНоменклатуры", добавил ресурс "СкидкиТолькоДляКарт", добавил флаг в документ "Установка скидок номенклатуры", который устанавливает этот ресурс. Теперь осталось доработать запрос в общем модуле в функции "ЗапросПоСкидкам" и здесь основная трудность )) т.к. там такой запрос в котором я не очень могу разобраться )))
Вот собственно запрос:
необходимо зарегистрироваться для просмотра ссылки
ТекстЗапроса = "
| ВЫБРАТЬ РАЗРЕШЕННЫЕ
| СпрНоменклатура.Номенклатура КАК Номенклатура,
| СпрНоменклатура.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
| СпрКачество.Ссылка КАК Качество,
| РегСкидкиНоменклатуры.Условие КАК НУсловие,
| РегСкидкиНоменклатуры.ЗначениеУсловия КАК НЗначениеУсловия,
| РегСкидкиНоменклатуры.ОграничениеСкидкиНаценки КАК НОграничениеСкидкиНаценки,
| " + ?(ЭтоНакопительнаяСкидка, "ВЫБОР КОГДА РегСкидкиНоменклатуры.ПроцентСкидкиНаценки ЕСТЬ НЕ NULL
| И (РегСкидкиНоменклатуры.Условие = ЗНАЧЕНИЕ(Перечисление.УсловияСкидкиНаценки.ПоДисконтнойКарте)
| ИЛИ РегСкидкиНоменклатуры.Условие = ЗНАЧЕНИЕ(Перечисление.УсловияСкидкиНаценки.ПоВидуДисконтныхКарт)) ТОГДА &ПроцентНакопительнойСкидки ИНАЧЕ РегСкидкиНоменклатуры.ПроцентСкидкиНаценки КОНЕЦ", "РегСкидкиНоменклатуры.ПроцентСкидкиНаценки") + " КАК НПроцентСкидкиНаценки,
| РегСкидкиПоЦеновымГруппам.Условие КАК ЦУсловие,
| РегСкидкиПоЦеновымГруппам.ЗначениеУсловия КАК ЦЗначениеУсловия,
| РегСкидкиПоЦеновымГруппам.ОграничениеСкидкиНаценки КАК ЦОграничениеСкидкиНаценки,
| " + ?(ЭтоНакопительнаяСкидка, "ВЫБОР КОГДА РегСкидкиПоЦеновымГруппам.ПроцентСкидкиНаценки ЕСТЬ НЕ NULL
| И (РегСкидкиПоЦеновымГруппам.Условие = ЗНАЧЕНИЕ(Перечисление.УсловияСкидкиНаценки.ПоДисконтнойКарте)
| ИЛИ РегСкидкиПоЦеновымГруппам.Условие = ЗНАЧЕНИЕ(Перечисление.УсловияСкидкиНаценки.ПоВидуДисконтныхКарт)) ТОГДА &ПроцентНакопительнойСкидки ИНАЧЕ РегСкидкиПоЦеновымГруппам.ПроцентСкидкиНаценки КОНЕЦ", "РегСкидкиПоЦеновымГруппам.ПроцентСкидкиНаценки") + " КАК ЦПроцентСкидкиНаценки
|ИЗ
| (ВЫБРАТЬ
| СпрНоменклатура.Ссылка КАК Номенклатура,
| ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка) КАК ХарактеристикаНоменклатуры
| ИЗ
| Справочник.Номенклатура КАК СпрНоменклатура
| ГДЕ
| СпрНоменклатура.Ссылка В (&МассивНоменклатуры)
| ОБЪЕДИНИТЬ ВСЕ
| ВЫБРАТЬ
| СпрХарактеристики.Владелец,
| СпрХарактеристики.Ссылка
| ИЗ
| Справочник.ХарактеристикиНоменклатуры КАК СпрХарактеристики
| ГДЕ
| СпрХарактеристики.Ссылка В (&МассивХарактеристик)
| ОБЪЕДИНИТЬ ВСЕ
| ВЫБРАТЬ
| ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка),
| ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка)
| ) КАК СпрНоменклатура
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ
| Справочник.Качество КАК СпрКачество
| ПО
| СпрКачество.Ссылка В (&МассивКачество)
|ЛЕВОЕ СОЕДИНЕНИЕ
| (ВЫБРАТЬ
| РегСкидкиНоменклатуры.Номенклатура,
| РегСкидкиНоменклатуры.ХарактеристикаНоменклатуры,
| РегСкидкиНоменклатуры.Качество,
| РегСкидкиНоменклатуры.Условие,
| ВЫБОР КОГДА РегСкидкиНоменклатуры.Условие = ЗНАЧЕНИЕ(Перечисление.УсловияСкидкиНаценки.ПоСуммеДокумента) ТОГДА
| ВЫРАЗИТЬ(РегСкидкиНоменклатуры.ЗначениеУсловия КАК ЧИСЛО) * &КурсКратность * КурсыВалют.Курс / КурсыВалют.Кратность
| ИНАЧЕ
| РегСкидкиНоменклатуры.ЗначениеУсловия
| КОНЕЦ КАК ЗначениеУсловия,
| МАКСИМУМ(РегСкидкиНоменклатуры.ПроцентСкидкиНаценки) КАК ПроцентСкидкиНаценки,
| РегСкидкиНоменклатуры.ОграничениеСкидкиНаценки * &КурсКратность * КурсыВалют.Курс / КурсыВалют.Кратность КАК ОграничениеСкидкиНаценки
| ИЗ
| РегистрСведений.СкидкиНаценкиНоменклатуры.СрезПоследних(&Дата,
| Номенклатура В (&МассивНоменклатуры)
| И Качество В (&МассивКачество)
| И ПолучательСкидки В (&МассивПолучателей)) КАК РегСкидкиНоменклатуры
| ЛЕВОЕ СОЕДИНЕНИЕ
| РегистрСведений.ВремяДействияСкидок КАК ВремяДействия
| ПО
| РегСкидкиНоменклатуры.Регистратор = ВремяДействия.Регистратор
| ЛЕВОЕ СОЕДИНЕНИЕ
| РегистрСведений.КурсыВалют.СрезПоследних(&Дата) КАК КурсыВалют
| ПО
| РегСкидкиНоменклатуры.Валюта = КурсыВалют.Валюта
| ГДЕ
| (ВремяДействия.ДеньНедели ЕСТЬ NULL
| ИЛИ ВремяДействия.ДеньНедели = &ДеньНедели
| И &ТекущееВремя МЕЖДУ ВремяДействия.ВремяНачала И ВремяДействия.ВремяОкончания)
| И РегСкидкиНоменклатуры.Валюта <> ЗНАЧЕНИЕ(Справочник.Валюты.ПустаяСсылка)
//| И РегСкидкиНоменклатуры.ПроцентСкидкиНаценки <> 0
| И (РегСкидкиНоменклатуры.ДатаОкончания = ДАТАВРЕМЯ(1, 1, 1) ИЛИ КОНЕЦПЕРИОДА(РегСкидкиНоменклатуры.ДатаОкончания, ДЕНЬ) >= &Дата)
| И (РегСкидкиНоменклатуры.Условие = ЗНАЧЕНИЕ(Перечисление.УсловияСкидкиНаценки.ПоСуммеДокумента) И ВЫРАЗИТЬ(РегСкидкиНоменклатуры.ЗначениеУсловия КАК ЧИСЛО) * &КурсКратность * КурсыВалют.Курс / КурсыВалют.Кратность < &Сумма ИЛИ РегСкидкиНоменклатуры.Условие <> ЗНАЧЕНИЕ(Перечисление.УсловияСкидкиНаценки.ПоСуммеДокумента))
| И (РегСкидкиНоменклатуры.Условие = ЗНАЧЕНИЕ(Перечисление.УсловияСкидкиНаценки.ПоВидуОплаты) И РегСкидкиНоменклатуры.ЗначениеУсловия = &ВидОплаты ИЛИ РегСкидкиНоменклатуры.Условие <> ЗНАЧЕНИЕ(Перечисление.УсловияСкидкиНаценки.ПоВидуОплаты))
| И (РегСкидкиНоменклатуры.Условие = ЗНАЧЕНИЕ(Перечисление.УсловияСкидкиНаценки.ПоВидуДисконтныхКарт) И РегСкидкиНоменклатуры.ЗначениеУсловия = &ВидДисконтнойКарты ИЛИ РегСкидкиНоменклатуры.Условие <> ЗНАЧЕНИЕ(Перечисление.УсловияСкидкиНаценки.ПоВидуДисконтныхКарт))
| И (РегСкидкиНоменклатуры.Условие = ЗНАЧЕНИЕ(Перечисление.УсловияСкидкиНаценки.ПоДисконтнойКарте) И РегСкидкиНоменклатуры.ЗначениеУсловия = &ДисконтнаяКарта ИЛИ РегСкидкиНоменклатуры.Условие <> ЗНАЧЕНИЕ(Перечисление.УсловияСкидкиНаценки.ПоДисконтнойКарте))
| СГРУППИРОВАТЬ ПО
| РегСкидкиНоменклатуры.Номенклатура,
| РегСкидкиНоменклатуры.ХарактеристикаНоменклатуры,
| РегСкидкиНоменклатуры.Качество,
| РегСкидкиНоменклатуры.Условие,
| ВЫБОР КОГДА РегСкидкиНоменклатуры.Условие = ЗНАЧЕНИЕ(Перечисление.УсловияСкидкиНаценки.ПоСуммеДокумента) ТОГДА
| ВЫРАЗИТЬ(РегСкидкиНоменклатуры.ЗначениеУсловия КАК ЧИСЛО) * &КурсКратность * КурсыВалют.Курс / КурсыВалют.Кратность
| ИНАЧЕ
| РегСкидкиНоменклатуры.ЗначениеУсловия
| КОНЕЦ,
| РегСкидкиНоменклатуры.ОграничениеСкидкиНаценки * &КурсКратность * КурсыВалют.Курс / КурсыВалют.Кратность
| ) КАК РегСкидкиНоменклатуры
|ПО
| СпрНоменклатура.Номенклатура = РегСкидкиНоменклатуры.Номенклатура
| И (СпрНоменклатура.ХарактеристикаНоменклатуры = РегСкидкиНоменклатуры.ХарактеристикаНоменклатуры ИЛИ РегСкидкиНоменклатуры.ХарактеристикаНоменклатуры = ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка))
| И СпрКачество.Ссылка = РегСкидкиНоменклатуры.Качество
|ЛЕВОЕ СОЕДИНЕНИЕ
| (ВЫБРАТЬ
| РегСкидкиПоЦеновымГруппам.ЦеноваяГруппа,
| РегСкидкиПоЦеновымГруппам.Качество,
| РегСкидкиПоЦеновымГруппам.Условие,
| ВЫБОР КОГДА РегСкидкиПоЦеновымГруппам.Условие = ЗНАЧЕНИЕ(Перечисление.УсловияСкидкиНаценки.ПоСуммеДокумента) ТОГДА
| ВЫРАЗИТЬ(РегСкидкиПоЦеновымГруппам.ЗначениеУсловия КАК ЧИСЛО) * &КурсКратность * КурсыВалют.Курс / КурсыВалют.Кратность
| ИНАЧЕ
| РегСкидкиПоЦеновымГруппам.ЗначениеУсловия
| КОНЕЦ КАК ЗначениеУсловия,
| МАКСИМУМ(РегСкидкиПоЦеновымГруппам.ПроцентСкидкиНаценки) КАК ПроцентСкидкиНаценки,
| РегСкидкиПоЦеновымГруппам.ОграничениеСкидкиНаценки * &КурсКратность * КурсыВалют.Курс / КурсыВалют.Кратность КАК ОграничениеСкидкиНаценки
| ИЗ
| РегистрСведений.СкидкиНаценкиПоЦеновымГруппам.СрезПоследних(&Дата, Качество В (&МассивКачество) И ПолучательСкидки В (&МассивПолучателей)) КАК РегСкидкиПоЦеновымГруппам
| ЛЕВОЕ СОЕДИНЕНИЕ
| РегистрСведений.ВремяДействияСкидок КАК ВремяДействия
| ПО
| РегСкидкиПоЦеновымГруппам.Регистратор = ВремяДействия.Регистратор
| ЛЕВОЕ СОЕДИНЕНИЕ
| РегистрСведений.КурсыВалют.СрезПоследних(&Дата) КАК КурсыВалют
| ПО
| РегСкидкиПоЦеновымГруппам.Валюта = КурсыВалют.Валюта
| ГДЕ
| (ВремяДействия.ДеньНедели ЕСТЬ NULL
| ИЛИ ВремяДействия.ДеньНедели = &ДеньНедели
| И &ТекущееВремя МЕЖДУ ВремяДействия.ВремяНачала И ВремяДействия.ВремяОкончания)
| И РегСкидкиПоЦеновымГруппам.Валюта <> ЗНАЧЕНИЕ(Справочник.Валюты.ПустаяСсылка)
//| И РегСкидкиПоЦеновымГруппам.ПроцентСкидкиНаценки <> 0
| И(РегСкидкиПоЦеновымГруппам.ДатаОкончания = ДАТАВРЕМЯ(1, 1, 1) ИЛИ КОНЕЦПЕРИОДА(РегСкидкиПоЦеновымГруппам.ДатаОкончания, ДЕНЬ) >= &Дата)
| И(РегСкидкиПоЦеновымГруппам.Условие = ЗНАЧЕНИЕ(Перечисление.УсловияСкидкиНаценки.ПоСуммеДокумента) И ВЫРАЗИТЬ(РегСкидкиПоЦеновымГруппам.ЗначениеУсловия КАК ЧИСЛО) * &КурсКратность * КурсыВалют.Курс / КурсыВалют.Кратность < &Сумма ИЛИ РегСкидкиПоЦеновымГруппам.Условие <> ЗНАЧЕНИЕ(Перечисление.УсловияСкидкиНаценки.ПоСуммеДокумента))
| И (РегСкидкиПоЦеновымГруппам.Условие = ЗНАЧЕНИЕ(Перечисление.УсловияСкидкиНаценки.ПоВидуОплаты) И РегСкидкиПоЦеновымГруппам.ЗначениеУсловия = &ВидОплаты ИЛИ РегСкидкиПоЦеновымГруппам.Условие <> ЗНАЧЕНИЕ(Перечисление.УсловияСкидкиНаценки.ПоВидуОплаты))
| И (РегСкидкиПоЦеновымГруппам.Условие = ЗНАЧЕНИЕ(Перечисление.УсловияСкидкиНаценки.ПоВидуДисконтныхКарт) И РегСкидкиПоЦеновымГруппам.ЗначениеУсловия = &ВидДисконтнойКарты ИЛИ РегСкидкиПоЦеновымГруппам.Условие <> ЗНАЧЕНИЕ(Перечисление.УсловияСкидкиНаценки.ПоВидуДисконтныхКарт))
| И (РегСкидкиПоЦеновымГруппам.Условие = ЗНАЧЕНИЕ(Перечисление.УсловияСкидкиНаценки.ПоДисконтнойКарте) И РегСкидкиПоЦеновымГруппам.ЗначениеУсловия = &ДисконтнаяКарта ИЛИ РегСкидкиПоЦеновымГруппам.Условие <> ЗНАЧЕНИЕ(Перечисление.УсловияСкидкиНаценки.ПоДисконтнойКарте))
| СГРУППИРОВАТЬ ПО
| РегСкидкиПоЦеновымГруппам.ЦеноваяГруппа,
| РегСкидкиПоЦеновымГруппам.Качество,
| РегСкидкиПоЦеновымГруппам.Условие,
| ВЫБОР КОГДА РегСкидкиПоЦеновымГруппам.Условие = ЗНАЧЕНИЕ(Перечисление.УсловияСкидкиНаценки.ПоСуммеДокумента) ТОГДА
| ВЫРАЗИТЬ(РегСкидкиПоЦеновымГруппам.ЗначениеУсловия КАК ЧИСЛО) * &КурсКратность * КурсыВалют.Курс / КурсыВалют.Кратность
| ИНАЧЕ
| РегСкидкиПоЦеновымГруппам.ЗначениеУсловия
| КОНЕЦ,
| РегСкидкиПоЦеновымГруппам.ОграничениеСкидкиНаценки * &КурсКратность * КурсыВалют.Курс / КурсыВалют.Кратность
| ) КАК РегСкидкиПоЦеновымГруппам
|ПО
| СпрНоменклатура.Номенклатура.ЦеноваяГруппа = РегСкидкиПоЦеновымГруппам.ЦеноваяГруппа
| И СпрКачество.Ссылка = РегСкидкиПоЦеновымГруппам.Качество
|ГДЕ
| РегСкидкиНоменклатуры.Условие ЕСТЬ НЕ NULL
| ИЛИ РегСкидкиПоЦеновымГруппам.Условие ЕСТЬ НЕ NULL
|";
Я понимаю, что нужно в этом подзапросе добавить условие:
|ЛЕВОЕ СОЕДИНЕНИЕ
| (ВЫБРАТЬ
| РегСкидкиНоменклатуры.Номенклатура,
| РегСкидкиНоменклатуры.ХарактеристикаНоменклатуры,
| РегСкидкиНоменклатуры.Качество,
| РегСкидкиНоменклатуры.Условие,
| ВЫБОР КОГДА РегСкидкиНоменклатуры.Условие = ЗНАЧЕНИЕ(Перечисление.УсловияСкидкиНаценки.ПоСуммеДокумента) ТОГДА
| ВЫРАЗИТЬ(РегСкидкиНоменклатуры.ЗначениеУсловия КАК ЧИСЛО) * &КурсКратность * КурсыВалют.Курс / КурсыВалют.Кратность
| ИНАЧЕ
| РегСкидкиНоменклатуры.ЗначениеУсловия
| КОНЕЦ КАК ЗначениеУсловия,
| МАКСИМУМ(РегСкидкиНоменклатуры.ПроцентСкидкиНаценки) КАК ПроцентСкидкиНаценки,
| РегСкидкиНоменклатуры.ОграничениеСкидкиНаценки * &КурсКратность * КурсыВалют.Курс / КурсыВалют.Кратность КАК ОграничениеСкидкиНаценки
| ИЗ
| РегистрСведений.СкидкиНаценкиНоменклатуры.СрезПоследних(&Дата,
| Номенклатура В (&МассивНоменклатуры)
| И Качество В (&МассивКачество)
| И ПолучательСкидки В (&МассивПолучателей)) КАК РегСкидкиНоменклатуры
| ЛЕВОЕ СОЕДИНЕНИЕ
| РегистрСведений.ВремяДействияСкидок КАК ВремяДействия
| ПО
| РегСкидкиНоменклатуры.Регистратор = ВремяДействия.Регистратор
| ЛЕВОЕ СОЕДИНЕНИЕ
| РегистрСведений.КурсыВалют.СрезПоследних(&Дата) КАК КурсыВалют
| ПО
| РегСкидкиНоменклатуры.Валюта = КурсыВалют.Валюта
| ГДЕ
| (ВремяДействия.ДеньНедели ЕСТЬ NULL
| ИЛИ ВремяДействия.ДеньНедели = &ДеньНедели
| И &ТекущееВремя МЕЖДУ ВремяДействия.ВремяНачала И ВремяДействия.ВремяОкончания)
| И РегСкидкиНоменклатуры.Валюта <> ЗНАЧЕНИЕ(Справочник.Валюты.ПустаяСсылка)
//| И РегСкидкиНоменклатуры.ПроцентСкидкиНаценки <> 0
| И (РегСкидкиНоменклатуры.ДатаОкончания = ДАТАВРЕМЯ(1, 1, 1) ИЛИ КОНЕЦПЕРИОДА(РегСкидкиНоменклатуры.ДатаОкончания, ДЕНЬ) >= &Дата)
| И (РегСкидкиНоменклатуры.Условие = ЗНАЧЕНИЕ(Перечисление.УсловияСкидкиНаценки.ПоСуммеДокумента) И ВЫРАЗИТЬ(РегСкидкиНоменклатуры.ЗначениеУсловия КАК ЧИСЛО) * &КурсКратность * КурсыВалют.Курс / КурсыВалют.Кратность < &Сумма ИЛИ РегСкидкиНоменклатуры.Условие <> ЗНАЧЕНИЕ(Перечисление.УсловияСкидкиНаценки.ПоСуммеДокумента))
| И (РегСкидкиНоменклатуры.Условие = ЗНАЧЕНИЕ(Перечисление.УсловияСкидкиНаценки.ПоВидуОплаты) И РегСкидкиНоменклатуры.ЗначениеУсловия = &ВидОплаты ИЛИ РегСкидкиНоменклатуры.Условие <> ЗНАЧЕНИЕ(Перечисление.УсловияСкидкиНаценки.ПоВидуОплаты))
| И (РегСкидкиНоменклатуры.Условие = ЗНАЧЕНИЕ(Перечисление.УсловияСкидкиНаценки.ПоВидуДисконтныхКарт) И РегСкидкиНоменклатуры.ЗначениеУсловия = &ВидДисконтнойКарты ИЛИ РегСкидкиНоменклатуры.Условие <> ЗНАЧЕНИЕ(Перечисление.УсловияСкидкиНаценки.ПоВидуДисконтныхКарт))
| И (РегСкидкиНоменклатуры.Условие = ЗНАЧЕНИЕ(Перечисление.УсловияСкидкиНаценки.ПоДисконтнойКарте) И РегСкидкиНоменклатуры.ЗначениеУсловия = &ДисконтнаяКарта ИЛИ РегСкидкиНоменклатуры.Условие <> ЗНАЧЕНИЕ(Перечисление.УсловияСкидкиНаценки.ПоДисконтнойКарте))
Но что-то не получается (((
И как лучше выборку ограничить или в условия выборки, что-то я никак не пойму.
Кто разбирается, можете позсказать?
i | Большие куски кода лучше прятать |