gifts2017

Скидка за комплект

Опубликовал Serg (Sykoku) в раздел Обработки - Обработка документов

Программная организация продажи группы товаров с подсказкой продавцу, чего не хватает для счастья. В данной реализации собственно скидка не предоставляется, т.к. суть акции - купи 10 разноцветных товаров и получи 11-й цвет в подарок.

Для того, чтобы скидка не наслаивалась на уже существующие (кстати, 1С выбирает наибольшую, а не суммирует - товар может участвовать в разных акциях), обработка условий для данного типа скидки выполняется отдельно и просто выводит информацию в окно сообщений, какие позиции необходимо добавить.

Суть реализации.

1. Добавляем Перечисления.УсловияСкидкиНаценки.ПоКоличествуВариантовВгруппе

2. Документ.УстановкаСкидокНоменклатуры
   - МодульОбъекта
         Функция РассчитыватьАвтоматическиеСкидки(ТекВид)
       Дополняем  условие проверкой

ИначеЕсли ТекВид = Перечисления.УсловияСкидкиНаценки.ПоКоличествуВариантовВгруппе Тогда
        Результат = ИспользованиеСкидок.ИспользоватьСкидкиПоКоличествуТовара;

   - ФормаДокумента

     Процедура ПередОткрытием() ,
      Добавить строку

ЭлементыФормы.Условие.СписокВыбора.Добавить(Перечисления.УсловияСкидкиНаценки.ПоКоличествуВариантовВгруппе);  

3. Общий модуль.ОбработкаТабличныхЧастей
   Процедура РассчитатьСкидкиПриПродаже

Здесь самое интересное. Сначала поясню алгоритм.

У нас есть документ установки скидок-наценок. И обычно из регистра сведений выбирается информация о сроках действия скидки и ее условиях (тип покупателей- опт/все, кол-во/сумма товара, сам товар или ценовые группы).

В нашем случае все сложнее. Скидка действует тогда, когда куплены ВСЕ позиции, определнные в ОДНОМ документе установки скидок/наценок.

Для проверки этого соответствия я выбираю в запросе ДОКУМЕНТ-РЕГИСТРАТОР и создаю таблицу его позиций. Дополняю колонкой количества товара (из документа, естественно). Процент скидки=0 (чтобы не пересекалось с другими).

Затем обхожу табличную часть товаров текущего документа, для которго может быть применена скидка, и, если номенклатура и ее характеристика есть в моей таблице, созданной из РЕГИСТРАТОРА, уменьшаю в ней кол-во товара на указанное в документе продажи.

По окончанию обхода вывожу в окно сообщений все позиции с положительным количеством (их не хватает для применения скидки).

Собсвенно этот участок кода.

Во вложении полный текст процедуры и запроса. Внимание - там есть и другие изменения (например, описанные в http://infostart.ru/public/155509/)

    УсловиеВгруппе = Перечисления.УсловияСкидкиНаценки.ПоКоличествуВариантовВгруппе;
	
	ТаблицаСкидокВгруппе = ТаблицаСкидок.Скопировать(,"НРегистратор, НУсловие");
	ТаблицаСкидокВгруппе.Свернуть("НРегистратор, НУсловие",);

	Для Каждого СтрокаГруппы Из ТаблицаСкидокВгруппе Цикл
		Если СтрокаГруппы.НУсловие = УсловиеВгруппе Тогда
			
	Если ТипЗнч (СтрокаГруппы.НРегистратор.Товары) = Тип("ТаблицаЗначений") Тогда
		ТаблицаНеДостаточно = СтрокаГруппы.НРегистратор.Товары.Скопировать(,"Номенклатура, ХарактеристикаНоменклатуры");
	Иначе
		ТаблицаНеДостаточно = СтрокаГруппы.НРегистратор.Товары.Выгрузить(,"Номенклатура, ХарактеристикаНоменклатуры");
	КонецЕсли;

             ТаблицаНеДостаточно.Колонки.Добавить("Количество");
			 Для Каждого СтрокаСкидокТоваров ИЗ ТаблицаНеДостаточно Цикл
					СтрокаСкидокТоваров.Количество = СтрокаГруппы.НРегистратор.ЗначениеУсловия
			 КонецЦикла;

			 
             Для Каждого СтрокаСкидокТоваров ИЗ ТаблицаНеДостаточно Цикл
			     Для Каждого СтрокаТоваров ИЗ ТаблицаТоваров Цикл
					 Если (СтрокаТоваров.Номенклатура = СтрокаСкидокТоваров.Номенклатура) И 
						  (СтрокаТоваров.ХарактеристикаНоменклатуры = СтрокаСкидокТоваров.ХарактеристикаНоменклатуры)
					 Тогда
						  СтрокаСкидокТоваров.Количество = СтрокаГруппы.НРегистратор.ЗначениеУсловия - СтрокаТоваров.Количество * СтрокаТоваров.Коэффициент;
					 КонецЕсли;		  
	        	 КонецЦикла;
        	 КонецЦикла;
			 
			ОбработкаКомментариев = глЗначениеПеременной("глОбработкаСообщений");
			ФормаКом=ОбработкаКомментариев.ПолучитьФорму();
			Если ФормаКом.Открыта() Тогда
				 ОчиститьСообщения();
			Иначе	
				 ФормаКом.Открыть();
			КонецЕсли;
			
			 Сообщить("Скидка " + СтрокаГруппы.НРегистратор );
			 Сообщить("=====================================");
			 Для Каждого СтрокаСкидокТоваров ИЗ ТаблицаНеДостаточно Цикл
				 Если (СтрокаСкидокТоваров.Количество>0) Тогда
//					 Сообщить("Для скидки по документу " + СтрокаГруппы.НРегистратор + " недостаточно товаров: " + СтрокаСкидокТоваров.Номенклатура +"/"+СтрокаСкидокТоваров.Количество+" шт");
					 Сообщить("Для скидки " + СтрокаГруппы.НРегистратор.Комментарий + " недостаточно товаров: " + СтрокаСкидокТоваров.Номенклатура +"\"+СтрокаСкидокТоваров.Количество+" шт");
				 КонецЕсли;	 
	         КонецЦикла;

		КонецЕсли;
	КонецЦикла;	

Скачать файлы

Наименование Файл Версия Размер
Вся процедура из Рассчитывать скидки припродаже 2
.txt 29,36Kb
04.11.14
2
.txt 29,36Kb Скачать

См. также

Подписаться Добавить вознаграждение
В этой теме еще нет сообщений.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа