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