Для того, чтобы скидка не наслаивалась на уже существующие (кстати, 1С выбирает наибольшую, а не суммирует - товар может участвовать в разных акциях), обработка условий для данного типа скидки выполняется отдельно и просто выводит информацию в окно сообщений, какие позиции необходимо добавить.
Суть реализации.
1. Добавляем Перечисления.УсловияСкидкиНаценки.ПоКоличествуВариантовВгруппе
2. Документ.УстановкаСкидокНоменклатуры
- МодульОбъекта
Функция РассчитыватьАвтоматическиеСкидки(ТекВид)
Дополняем условие проверкой
ИначеЕсли ТекВид = Перечисления.УсловияСкидкиНаценки.ПоКоличествуВариантовВгруппе Тогда
Результат = ИспользованиеСкидок.ИспользоватьСкидкиПоКоличествуТовара;
- ФормаДокумента
Процедура ПередОткрытием() ,
Добавить строку
ЭлементыФормы.Условие.СписокВыбора.Добавить(Перечисления.УсловияСкидкиНаценки.ПоКоличествуВариантовВгруппе);
3. Общий модуль.ОбработкаТабличныхЧастей
Процедура РассчитатьСкидкиПриПродаже
Здесь самое интересное. Сначала поясню алгоритм.
У нас есть документ установки скидок-наценок. И обычно из регистра сведений выбирается информация о сроках действия скидки и ее условиях (тип покупателей- опт/все, кол-во/сумма товара, сам товар или ценовые группы).
В нашем случае все сложнее. Скидка действует тогда, когда куплены ВСЕ позиции, определнные в ОДНОМ документе установки скидок/наценок.
Для проверки этого соответствия я выбираю в запросе ДОКУМЕНТ-РЕГИСТРАТОР и создаю таблицу его позиций. Дополняю колонкой количества товара (из документа, естественно). Процент скидки=0 (чтобы не пересекалось с другими).
Затем обхожу табличную часть товаров текущего документа, для которго может быть применена скидка, и, если номенклатура и ее характеристика есть в моей таблице, созданной из РЕГИСТРАТОРА, уменьшаю в ней кол-во товара на указанное в документе продажи.
По окончанию обхода вывожу в окно сообщений все позиции с положительным количеством (их не хватает для применения скидки).
Собсвенно этот участок кода.
Во вложении полный текст процедуры и запроса. Внимание - там есть и другие изменения (например, описанные в //infostart.ru/public/155509/)
УсловиеВгруппе = Перечисления.УсловияСкидкиНаценки.ПоКоличествуВариантовВгруппе;
ТаблицаСкидокВгруппе = ТаблицаСкидок.Скопировать(,"НРегистратор, НУсловие");
ТаблицаСкидокВгруппе.Свернуть("НРегистратор, НУсловие",);
Для Каждого СтрокаГруппы Из ТаблицаСкидокВгруппе Цикл
Если СтрокаГруппы.НУсловие = УсловиеВгруппе Тогда
Если ТипЗнч (СтрокаГруппы.НРегистратор.Товары) = Тип("ТаблицаЗначений") Тогда
ТаблицаНеДостаточно = СтрокаГруппы.НРегистратор.Товары.Скопировать(,"Номенклатура, ХарактеристикаНоменклатуры");
Иначе
ТаблицаНеДостаточно = СтрокаГруппы.НРегистратор.Товары.Выгрузить(,"Номенклатура, ХарактеристикаНоменклатуры");
КонецЕсли;
ТаблицаНеДостаточно.Колонки.Добавить("Количество");
Для Каждого СтрокаСкидокТоваров ИЗ ТаблицаНеДостаточно Цикл
СтрокаСкидокТоваров.Количество = СтрокаГруппы.НРегистратор.ЗначениеУсловия
КонецЦикла;
Для Каждого СтрокаСкидокТоваров ИЗ ТаблицаНеДостаточно Цикл
Для Каждого СтрокаТоваров ИЗ ТаблицаТоваров Цикл
Если (СтрокаТоваров.Номенклатура = СтрокаСкидокТоваров.Номенклатура) И
(СтрокаТоваров.ХарактеристикаНоменклатуры = СтрокаСкидокТоваров.ХарактеристикаНоменклатуры)
Тогда
СтрокаСкидокТоваров.Количество = СтрокаГруппы.НРегистратор.ЗначениеУсловия - СтрокаТоваров.Количество * СтрокаТоваров.Коэффициент;
КонецЕсли;
КонецЦикла;
КонецЦикла;
ОбработкаКомментариев = глЗначениеПеременной("глОбработкаСообщений");
ФормаКом=ОбработкаКомментариев.ПолучитьФорму();
Если ФормаКом.Открыта() Тогда
ОчиститьСообщения();
Иначе
ФормаКом.Открыть();
КонецЕсли;
Сообщить("Скидка " + СтрокаГруппы.НРегистратор );
Сообщить("=====================================");
Для Каждого СтрокаСкидокТоваров ИЗ ТаблицаНеДостаточно Цикл
Если (СтрокаСкидокТоваров.Количество>0) Тогда
// Сообщить("Для скидки по документу " + СтрокаГруппы.НРегистратор + " недостаточно товаров: " + СтрокаСкидокТоваров.Номенклатура +"/"+СтрокаСкидокТоваров.Количество+" шт");
Сообщить("Для скидки " + СтрокаГруппы.НРегистратор.Комментарий + " недостаточно товаров: " + СтрокаСкидокТоваров.Номенклатура +"\"+СтрокаСкидокТоваров.Количество+" шт");
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;