gifts2017

Модификация автоматической скиди для ценовых групп

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

В конфигурации УТП 1.2 для Украины есть возможность давать скидку как на сумму покупки, так и на количество товара. Последнее реализовано двумя способами - через прямой выбор позиции Номенклатуры или через "Ценовую группа" (установку признака в элементе Номенклатуры с соотношением одна позиция - одна группа).

Мне такое исполнение показалась неудобным - зачем создавать скидки для Ценовых групп, а затем пытаться узнать, а кто же в этой группе находится, если проще установить скидку напрямую - ведь при расчете скидок объединения по признаку "Ценовая группа" не происходит - учитывается количество каждой позиции.

Описанные ниже изменения позволяют начислять скидку на всю группу, используя суммарное количество товара в одной ценовой группе.

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

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

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

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

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

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

УсловиеГруппКво = Перечисления.УсловияСкидкиНаценки.ПоГрупповомуКоличествуТовара;

стр.1220

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

ТаблицаКоличестваГруппТоваров.Колонки.Удалить("Номенклатура");
ТаблицаКоличестваГруппТоваров.Свернуть("Номенклатура, ХарактеристикаНоменклатуры", "Количество");
ТаблицаКоличестваГруппТоваров.Индексы.Добавить("Номенклатура, ХарактеристикаНоменклатуры");
СтруктураПоискаГруппКоличества = Новый Структура("Номенклатура, ХарактеристикаНоменклатуры");

    стр. 1275

СтруктураПоискаГруппКоличества.ЦеноваяГруппа = СтрокаТЧ.Номенклатура.ЦеноваяГруппа;
СтруктураПоискаГруппКоличества.ХарактеристикаНоменклатуры = СтрокаТЧ.ХарактеристикаНоменклатуры;

Если (СтрокаСкидок.НУсловие=УсловиеГруппКво) ИЛИ (СокрЛП(СтрокаСкидок.НУсловие)="") Тогда // Последнее условие для промахнувшихся с описанием скидки
КоличествоНоменклатуры = НайтиСтрокуТабЧасти(ТаблицаКоличестваГруппТоваров, СтруктураПоискаГруппКоличества).Количество;
Иначе
КоличествоНоменклатуры = НайтиСтрокуТабЧасти(ТаблицаКоличестваТоваров, СтруктураПоискаКоличества).Количество;
КонецЕсли;

Если
((СтрокаСкидок.НУсловие = УсловиеКолво ИЛИ СтрокаСкидок.НУсловие = УсловиеГруппКво) И СтрокаСкидок.НЗначениеУсловия < КоличествоНоменклатуры Или (СтрокаСкидок.НУсловие <> УсловиеКолво И СтрокаСкидок.НУсловие <> УсловиеГруппКво))
И
((СтрокаСкидок.ЦУсловие = УсловиеКолво ИЛИ СтрокаСкидок.НУсловие = УсловиеГруппКво)И СтрокаСкидок.ЦЗначениеУсловия < КоличествоНоменклатуры Или (СтрокаСкидок.ЦУсловие <> УсловиеКолво И СтрокаСкидок.ЦУсловие <> УсловиеГруппКво))
Тогда

  Указаны номера строк для стандартной конфигурации 1.2.9.1

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

  Одновременно использовать стандартный механизм скидок и с ценовыми группами по одним и тем же позициям не рекомендую - запутаетесь...

См. также

PowerTools от 1 000
Подписаться Добавить вознаграждение

Комментарии

1. Serg (Sykoku) 09.10.12 10:00
На всякий случай - процедура расчета табличной части вызывается у АББИИ целых ТРИ (!!!) раза подряд, поэтому быстродействием для сотен/тысяч позиций документа могут быть проблемы...

Полный текст процедуры РассчитатьСкидкиПриПродаже() во вложении.
Прикрепленные файлы:
1C.txt
2. Serg (Sykoku) 17.10.12 19:55
Придумал себе еще один нюанс - а если скидки вообще нет? Т.е. цена у клиента - расчетная (базовая - %), а надо выставлять по единой цене...


Решение найдено.

ОбщийМодуль.Ценообразование.

Функция ПолучитьЦенуНоменклатуры

...
		Выборка = Запрос.Выполнить().Выбрать();
		Если Выборка.Следующий() Тогда
			ПолученнаяЦена = ПересчитатьЦенуПриИзмененииЕдиницы(Выборка.Цена, Выборка.ЕдиницаИзмерения, ЕдиницаИзмерения);
			ПолученнаяЦена = ПересчитатьЦенуПриИзмененииВалюты(ПолученнаяЦена, Выборка.ВалютаЦены, Валюта, Курс, Кратность, Дата);
		КонецЕсли;

//{SSW 12.10.18}		
		// Глобальная скидка
		Если ПолученнаяЦена = 0 Тогда
			СпрДоговора = Справочники.ДоговорыКонтрагентов;  
			НайденнаяСсылка = СпрДоговора.НайтиПоКоду("000000001"); // Номер моего фиктивного договора
			Запрос.УстановитьПараметр("Договор", НайденнаяСсылка);
			Запрос.Текст = ТекстЗапроса;
			Выборка = Запрос.Выполнить().Выбрать();
			Если Выборка.Следующий() Тогда
				Попытка
					Если ДоговорКонтрагента.Владелец.ПринадлежитЭлементу(Выборка.Регистратор.Контрагент) Тогда
						ПолученнаяЦена = ПересчитатьЦенуПриИзмененииЕдиницы(Выборка.Цена, Выборка.ЕдиницаИзмерения, ЕдиницаИзмерения);
						ПолученнаяЦена = ПересчитатьЦенуПриИзмененииВалюты(ПолученнаяЦена, Выборка.ВалютаЦены, Валюта, Курс, Кратность, Дата);
						Сообщить("Глобальная Цена для " + Номенклатура);
					Иначе
	//					Сообщить("Глобальная Цена для " + Выборка.Регистратор.Контрагент + ", а не для элемента " + ДоговорКонтрагента.Владелец);
					КонецЕсли;
				Исключение
//						Сообщить("Сбой Глобальная Цена для " + Выборка.Регистратор.Контрагент + ", элемент " + ДоговорКонтрагента.Владелец);
				КонецПопытки;	
			КонецЕсли;
			Запрос.УстановитьПараметр("Договор", ДоговорКонтрагента);
		КонецЕсли;		
		
		
		// Проверим, не установлены ли по этому договору типы цен для групп.
...
...Показать Скрыть


Теперь все, что необходимо - это создать фиктивного покупателя, например, "Для Акций". Создаем ему договор и даем для этого договора СпецУсловия. После проведения документа "Установка поставок по договорам" берем любой редактор объектов (кроме встроенного) и меняем в этом документе нашего фиктивного клиента на группу. Теперь СпецЦена работает для всей группы Котрагентов.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа