&НаКлиенте
Процедура ПодобратьВарианты(Команда)
ЭтаФорма.Элементы.ДокументСуммаВключаетНДС.ЦветТекстаЗаголовка = Новый Цвет();
ПодобратьВариантыНаСервере();
КонецПроцедуры
&НаСервере
Процедура ПодобратьВариантыНаСервере()
Объект.Варианты.Очистить();
Объект.СтавкиВариантов.Очистить();
НовСтр = Объект.Варианты.Добавить();
НовСтр.ИмяВарианта = "Исходный";
СписокСтавок = Новый СписокЗначений;
МассивСтавок = Объект.Документ.Товары.ВыгрузитьКолонку("СтавкаНДС");
СписокСтавок.ЗагрузитьЗначения(МассивСтавок);
НовСтр.Вариант = ""+СписокСтавок;
ЗапомнитьВариант(0,МассивСтавок);
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СчетНаОплатуПоставщикаТовары.НомерСтроки КАК НомерСтроки,
| СчетНаОплатуПоставщикаТовары.Номенклатура КАК Номенклатура,
| СчетНаОплатуПоставщикаТовары.Цена * СчетНаОплатуПоставщикаТовары.Количество КАК Сумма,
| 0 КАК НДС0,
| ВЫБОР
| КОГДА СчетНаОплатуПоставщикаТовары.Ссылка.СуммаВключаетНДС
| ТОГДА ОКР(СчетНаОплатуПоставщикаТовары.Цена * СчетНаОплатуПоставщикаТовары.Количество * 10 / 110, 2)
| ИНАЧЕ ОКР(СчетНаОплатуПоставщикаТовары.Цена * СчетНаОплатуПоставщикаТовары.Количество * 0.1, 2)
| КОНЕЦ КАК НДС10,
| ВЫБОР
| КОГДА СчетНаОплатуПоставщикаТовары.Ссылка.СуммаВключаетНДС
| ТОГДА ОКР(СчетНаОплатуПоставщикаТовары.Цена * СчетНаОплатуПоставщикаТовары.Количество * 20 / 120, 2)
| ИНАЧЕ ОКР(СчетНаОплатуПоставщикаТовары.Цена * СчетНаОплатуПоставщикаТовары.Количество * 0.2, 2)
| КОНЕЦ КАК НДС20,
| ВЫБОР
| КОГДА СчетНаОплатуПоставщикаТовары.Ссылка.СуммаВключаетНДС
| ТОГДА ОКР(СчетНаОплатуПоставщикаТовары.Цена * СчетНаОплатуПоставщикаТовары.Количество * 5 / 105, 2)
| ИНАЧЕ ОКР(СчетНаОплатуПоставщикаТовары.Цена * СчетНаОплатуПоставщикаТовары.Количество * 0.05, 2)
| КОНЕЦ КАК НДС5,
| ВЫБОР
| КОГДА СчетНаОплатуПоставщикаТовары.Ссылка.СуммаВключаетНДС
| ТОГДА ОКР(СчетНаОплатуПоставщикаТовары.Цена * СчетНаОплатуПоставщикаТовары.Количество * 7 / 107, 2)
| ИНАЧЕ ОКР(СчетНаОплатуПоставщикаТовары.Цена * СчетНаОплатуПоставщикаТовары.Количество * 0.07, 2)
| КОНЕЦ КАК НДС7,
| СчетНаОплатуПоставщикаТовары.Ссылка.СуммаВключаетНДС КАК СуммаВключаетНДС
|ИЗ
| Документ.СчетНаОплатуПоставщика.Товары КАК СчетНаОплатуПоставщикаТовары
|ГДЕ
| СчетНаОплатуПоставщикаТовары.Ссылка = &Документ";
Запрос.УстановитьПараметр("Документ", Объект.Документ);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
ТЗ = РезультатЗапроса.Выгрузить();
ТаблицаЗначений = Новый ТаблицаЗначений;
ТаблицаЗначений.Колонки.Добавить("Значение");
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
МассивЗначений = Новый Массив;
МассивЗначений.Добавить(0);
МассивЗначений.Добавить(ВыборкаДетальныеЗаписи.НДС10);
МассивЗначений.Добавить(ВыборкаДетальныеЗаписи.НДС20);
МассивЗначений.Добавить(ВыборкаДетальныеЗаписи.НДС5);
МассивЗначений.Добавить(ВыборкаДетальныеЗаписи.НДС7);
СтрокаТЗ = ТаблицаЗначений.Добавить();
СтрокаТЗ.Значение = МассивЗначений;
КонецЦикла;
// Для хранения текущей комбинации
ТекущаяКомбинация = Новый Массив;
// Генерируем все сочетания
МассивСтавокНДС = Новый Массив;
МассивСтавокНДС.Добавить(Перечисления.СтавкиНДС.БезНДС);
МассивСтавокНДС.Добавить(Перечисления.СтавкиНДС.НДС10);
МассивСтавокНДС.Добавить(Перечисления.СтавкиНДС.НДС20);
МассивСтавокНДС.Добавить(Перечисления.СтавкиНДС.НДС5);
МассивСтавокНДС.Добавить(Перечисления.СтавкиНДС.НДС7);
ГенерироватьСочетания(0, ТекущаяКомбинация, ТаблицаЗначений, МассивСтавокНДС);
КонецПроцедуры
&НаСервере
Процедура ЗапомнитьВариант(ИндексСтрокиВарианта,МассивСтавок)
ИндексСтрокиДокумента = 0;
Для Каждого Ставка Из МассивСтавок Цикл
НовСтрСтавки = Объект.СтавкиВариантов.Добавить();
НовСтрСтавки.ИндексСтрокиВарианта = ИндексСтрокиВарианта;
НовСтрСтавки.ИндексСтрокиДокумента = ИндексСтрокиДокумента;
ИндексСтрокиДокумента = ИндексСтрокиДокумента + 1;
НовСтрСтавки.СтавкаНДС = Ставка;
КонецЦикла;
КонецПроцедуры
&НаСервере
// Рекурсивная процедура для генерации сочетаний
Процедура ГенерироватьСочетания(ТекущаяСтрока, ТекущаяКомбинация, ТаблицаЗначений, МассивСтавокНДС)
Если ТекущаяСтрока >= ТаблицаЗначений.Количество() Тогда
// Выводим найденное сочетание
ТекстСообщения = "";
Результат = СтрокиИзМассива(ТекущаяКомбинация);
Если Результат.СуммаНДС = ЭтаФорма.НДС Тогда
Ставка = "";
НовСтр = Объект.Варианты.Добавить();
НовСтр.ИмяВарианта = "Вар."+Формат(Объект.Варианты.Количество()-1,"ЧРГ=' '; ЧН=0");
СписокСтавок = Новый СписокЗначений;
СписокСтавок.ЗагрузитьЗначения(Результат.МассивСтавок);
НовСтр.Вариант = ""+СписокСтавок;
ЗапомнитьВариант(Объект.Варианты.Индекс(НовСтр),Результат.МассивСтавок);
ТекстСообщения = ТекстСообщения+("Комбинация: " + Результат.СтрокаСумм + Ставка)+Символы.ПС;
КонецЕсли;
Возврат;
КонецЕсли;
// Перебираем значения в текущей строке
Строка = ТаблицаЗначений[ТекущаяСтрока];
Для Индекс = 0 По Строка.Значение.Количество() - 1 Цикл
Значение = Строка.Значение[Индекс];
// Добавляем текущее значение в комбинацию с номером строки и индексом
ТекущаяКомбинация.Добавить(Новый Структура ("НДС,ИндексСтроки,СтавкаНДС,НДСВСумме",Строка.Значение[Индекс],ТекущаяСтрока, МассивСтавокНДС[Индекс]));
// Рекурсивный вызов для следующей строки
ГенерироватьСочетания(ТекущаяСтрока + 1, ТекущаяКомбинация, ТаблицаЗначений, МассивСтавокНДС);
// Удаляем текущее значение для следующей итерации
ТекущаяКомбинация.Удалить(ТекущаяКомбинация.Количество() - 1);
КонецЦикла;
КонецПроцедуры
// Вспомогательная функция для преобразования массива в строку
&НаСервере
Функция СтрокиИзМассива(Массив)
Результат = "";
Сумма = 0;
Сч = 0;
МассивСтавок = Новый Массив;
НДСВСумме = Ложь;
НДССверху = Ложь;
Пока Сч <= Массив.Количество() - 1 Цикл
Стр = Массив[Сч];
чНДС = Стр.НДС;
Сумма = Сумма + чНДС;
Результат = Результат + Строка(Стр.СтавкаНДС) + ", ";
МассивСтавок.Добавить(Стр.СтавкаНДС);
Если Стр.СтавкаНДС = Перечисления.СтавкиНДС.НДС10
ИЛИ Стр.СтавкаНДС = Перечисления.СтавкиНДС.НДС20
ИЛИ Стр.СтавкаНДС = Перечисления.СтавкиНДС.НДС7
ИЛИ Стр.СтавкаНДС = Перечисления.СтавкиНДС.НДС5 Тогда
НДСВСумме = Истина;
ИначеЕсли Стр.СтавкаНДС = Перечисления.СтавкиНДС.НДС10_110
ИЛИ Стр.СтавкаНДС = Перечисления.СтавкиНДС.НДС20_120 Тогда
НДССверху= Истина;
ИначеЕсли Стр.СтавкаНДС = Перечисления.СтавкиНДС.НДС7_107
ИЛИ Стр.СтавкаНДС = Перечисления.СтавкиНДС.НДС7_107 Тогда
НДССверху= Истина;
ИначеЕсли Стр.СтавкаНДС = Перечисления.СтавкиНДС.НДС5_105
ИЛИ Стр.СтавкаНДС = Перечисления.СтавкиНДС.НДС5_105 Тогда
НДССверху= Истина;
КонецЕсли;
Сч = Сч + 1;
КонецЦикла;
Возврат Новый Структура("СтрокаСумм,
|СуммаНДС,
|НДСВСумме,
|НДССверху,
|МассивСтавок",
Лев(Результат,СтрДлина(Результат) - 2) + " Сумма НДС = "+ Сумма,
Сумма,НДСВСумме,
НДССверху,
МассивСтавок);
КонецФункции