УНФ и Вид цены, динамический (формула)

1. nikkos123 27 27.05.20 18:50 Сейчас в теме
Справочник Виды Цен в УНФ , тип динамический (формула)
Нужна формула, чтобы в зависимости от базовой единицы измерения номенклатуры,
можно было задать разный алгоритм изменения исходной цены.

Никак не пойму как это можно сделать.
Прикрепленные файлы:
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
3. Torin 744 27.05.20 20:09 Сейчас в теме
(1) в УНФ и так только "базовая единица измерения номенклатуры" , все остальное это "миф" , так называемые "несколько единиц номенклатуры" , это только вариант выбора! В любом случае все подборы цен шагают от базовой единицы измерения.! Все остальное коэффициент пересчета!

Вариант только один - перепахивать механизм ценообразования
2. Adrenal1n 3 27.05.20 19:41 Сейчас в теме
Думаю, что коллеги меня поправят, если я не прав, но насколько я знаю в УНФ нет установки цен произвольным запросом, как, например, в УТ, поэтому вариантов немного.
1) Создать отдельный статический вид, установить на него каждую номенклатуру (в зависимости от базовой единицы) ту цену, которая нужна, а потом создать отдельный расчетный вид цен и с его помощью установить всей номенклатуре по нужной формуле, основываясь на том статическом виде цен.
2) Серьезно дорабатывать конфигурацию.
Ruslan2011; +1 Ответить
4. nikkos123 27 27.05.20 20:42 Сейчас в теме
Но поле формулы то есть.
И там не просто сложить и вычесть
А например заполненозначение, предопределеное значание, структуры если и т.д.
Т.е. явно алгоритм достаточно гибкий должен быть
6. Ruslan2011 27.05.20 22:15 Сейчас в теме
(4)
Да вы попробуйте гибкий механизм.
Возьмите приходной док на строчек 25
Запишите его.потом строчку или две поменяйте местами и проведите

И дальше чудеса
На основании его *установка цен-строчки могут идти как угодно , но не как в документе основания

Вобщем с ценами и формулами в унф крупный облом от ожиданий.
5. Ruslan2011 27.05.20 22:10 Сейчас в теме
Не знаю, как у вас конфигурация приобретена и где используется, но унф установка цен....даже трудно ее назвать так. Хорошо , что перешли на Розницу после месяца работы в унф. О чем нисколько не жалею.Да, по цене унф можно и ут взять, но хватает Розницы.


В вашем случае *напильник не поможет.
Доработка или ....
7. Ruslan2011 27.05.20 22:19 Сейчас в теме
Еще по памяти

Отследить кто и когда установил или поменял цену....попробуйте
8. Ruslan2011 27.05.20 22:22 Сейчас в теме
Если вы еще не покупали унф, то подумайте или придется самому вносить изменения или платить другим

Может есть возможность сменить унф ?
9. ab_initio 95 28.05.20 07:05 Сейчас в теме
Типовыми средствами Вашу задачу никак не решить.
В УНФ в алгоритме работы с формулами можно использовать только те данные, которые есть в конструкторе формул, а это суть только числа.

Однако! Чтоб решить Вашу задачу не нужно сколь-нибудь серьезно дорабатывать конфигурацию.
Достаточно небольших изменений, очень скромной адаптации.
Весь расчет происходить в общем модуле ЦенообразованиеФормулыСервер.
Достаточно внести небольшие изменения в процедуру РасчетДанныхПоФормуле.
Там всё очень понятно и прозрачно написано. В параметр РасчетныеДанные этой процедуры приходит структура, одно из полей которой и есть единица измерения. Т.е. можно это использовать в условии.

УНФ имеет много недостатков, но есть у нее серьезное достоинство - простота кастомизации.
user925427; fuser; +2 Ответить
10. Ruslan2011 28.05.20 07:38 Сейчас в теме
(9)
так помогите человеку , а то он подумает , что все так просто...
ожидания человека и реальные внесения могут не совпадать....
11. ab_initio 95 29.05.20 08:03 Сейчас в теме
(10)
так помогите человеку


Да не вопрос.
Упражнялся на релизе УНФ 1.6.20.107.
Изменения вносятся в общий модуль ЦенообразованиеФормулыСервер.
Затрагиваем только 1 функция МассивЗарезирвированныхСлов() и только 1 процедура ПодготовитьДанныеСтрокиКоллекции(СоответствиеОперандов, СтрокаКоллекции, ТаблицаОперандов, РасчетныеДанные)

Функция МассивЗарезирвированныхСлов()
	
	МассивЗарезирвированныхОперандов = Новый Массив;
	
	МассивЗарезирвированныхОперандов.Добавить("ТекущееЗначение");
	МассивЗарезирвированныхОперандов.Добавить("ПоследняяЦенаВПриходе");
	МассивЗарезирвированныхОперандов.Добавить("ПоследняяЦенаВРасходе");
	МассивЗарезирвированныхОперандов.Добавить("КурсДоллара");
	МассивЗарезирвированныхОперандов.Добавить("КурсЕвро");
	МассивЗарезирвированныхОперандов.Добавить("Себестоимость");
	МассивЗарезирвированныхОперандов.Добавить("СебестоимостьНацВалюта");
	//++
	МассивЗарезирвированныхОперандов.Добавить("ЕдиницаИзмерения_Базовая");
	//--
	
	Возврат МассивЗарезирвированныхОперандов;
	
КонецФункции

Процедура ПодготовитьДанныеСтрокиКоллекции(СоответствиеОперандов, СтрокаКоллекции, ТаблицаОперандов, РасчетныеДанные)
	
	Для каждого СтрокаОперанда Из ТаблицаОперандов Цикл
		
		Значение				= 0;
		ЗначениеКурс			= 1;
		ЗначениеКратность		= 1;
		ЗначениеНовыйКурс		= 1;
		ЗначениеНоваяКратность	= 1;
		
		Если СтрокаОперанда.ЭтоЦеныНоменклатуры <> Неопределено Тогда
			
			ИдентификаторФормул = СтрокаОперанда.ВидЦен.ИдентификаторФормул;
			
			Значение 				= СтрокаКоллекции["Значение_" + ИдентификаторФормул];
			ЗначениеКурс 			= СтрокаКоллекции["Курс_" + ИдентификаторФормул];
			ЗначениеКратность		= СтрокаКоллекции["Кратность_" + ИдентификаторФормул];
			ЗначениеНовыйКурс		= РасчетныеДанные.Курс;
			ЗначениеНоваяКратность	= РасчетныеДанные.Кратность;
			
			КлючЕдиницыИзмерения = "ЕдиницаИзмерения_" + СтрокаОперанда.ВидЦен.ИдентификаторФормул;
			ЕдиницаИзмерения	= СтрокаКоллекции[КлючЕдиницыИзмерения];
			
		ИначеЕсли СтрокаОперанда.Операнд = "[ПоследняяЦенаВПриходе]" Тогда
			
			Значение 				= СтрокаКоллекции["Значение_ПоследняяЦенаВПриходе"];
			ЗначениеКурс 			= СтрокаКоллекции["Курс_ПоследняяЦенаВПриходе"];
			ЗначениеКратность		= СтрокаКоллекции["Кратность_ПоследняяЦенаВПриходе"];
			ЗначениеНовыйКурс		= РасчетныеДанные.Курс;
			ЗначениеНоваяКратность	= РасчетныеДанные.Кратность;
			
			КлючЕдиницыИзмерения = "ЕдиницаИзмерения_ПоследняяЦенаВПриходе";
			ЕдиницаИзмерения	= СтрокаКоллекции["ЕдиницаИзмерения_ПоследняяЦенаВПриходе"];
			
		ИначеЕсли СтрокаОперанда.Операнд = "[ПоследняяЦенаВРасходе]" Тогда
			
			Значение 				= СтрокаКоллекции["Значение_ПоследняяЦенаВРасходе"];
			ЗначениеКурс 			= СтрокаКоллекции["Курс_ПоследняяЦенаВРасходе"];
			ЗначениеКратность		= СтрокаКоллекции["Кратность_ПоследняяЦенаВРасходе"];
			ЗначениеНовыйКурс		= РасчетныеДанные.Курс;
			ЗначениеНоваяКратность	= РасчетныеДанные.Кратность;
			
			КлючЕдиницыИзмерения = "ЕдиницаИзмерения_ПоследняяЦенаВРасходе";
			ЕдиницаИзмерения	= СтрокаКоллекции["ЕдиницаИзмерения_ПоследняяЦенаВРасходе"];
			
		ИначеЕсли СтрокаОперанда.Операнд = "[Себестоимость]" Тогда
			
			Значение 			= СтрокаКоллекции["Значение_Себестоимость"];
			ЗначениеКурс 			= СтрокаКоллекции["Курс_Себестоимость"];
			ЗначениеКратность		= СтрокаКоллекции["Кратность_Себестоимость"];
			ЗначениеНовыйКурс		= РасчетныеДанные.Курс;
			ЗначениеНоваяКратность	= РасчетныеДанные.Кратность;
			
			КлючЕдиницыИзмерения = "ЕдиницаИзмерения_Себестоимость";
			ЕдиницаИзмерения	= СтрокаКоллекции["ЕдиницаИзмерения_Себестоимость"];
			
		ИначеЕсли СтрокаОперанда.Операнд = "[СебестоимостьНацВалюта]" Тогда
			
			Значение 			= СтрокаКоллекции["Значение_СебестоимостьНацВалюта"];
			
			КлючЕдиницыИзмерения = "ЕдиницаИзмерения_СебестоимостьНацВалюта";
			ЕдиницаИзмерения	= СтрокаКоллекции["ЕдиницаИзмерения_СебестоимостьНацВалюта"];
			
		ИначеЕсли СтрокаОперанда.Операнд = "[ТекущееЗначение]" Тогда
			
			Значение 			= СтрокаКоллекции["ТекущееЗначение"];
			
			КлючЕдиницыИзмерения = "ЕдиницаИзмерения_ТекущееЗначение";
			ЕдиницаИзмерения	= СтрокаКоллекции.Номенклатура.ЕдиницаИзмерения;
			
		//++	
		ИначеЕсли СтрокаОперанда.Операнд = "[ЕдиницаИзмерения_Базовая]" Тогда
			
			Значение 			= """"+СокрЛП(СтрокаКоллекции.Номенклатура.ЕдиницаИзмерения)+"""";
			
			КлючЕдиницыИзмерения = "ЕдиницаИзмерения_ТекущееЗначение";
			ЕдиницаИзмерения	= СтрокаКоллекции.Номенклатура.ЕдиницаИзмерения;
			
		//--
		Иначе
			
			Значение 			= СтрокаОперанда.Значение;
			
			КлючЕдиницыИзмерения = "ЕдиницаИзмерения_Базовая";
			ЕдиницаИзмерения	= СтрокаКоллекции.Номенклатура.ЕдиницаИзмерения;
			
		КонецЕсли;
		
		//++
		//Если ЗначениеЗаполнено(Значение) Тогда
		Если ТипЗнч(Значение)=Тип("Число") И Значение<>0 Тогда
		//--
		
			ФорматСтрокиЗначение= "ЧЦ=15; ЧДЦ=3; ЧРД=.; ЧГ=0";
			ФорматСтрокиКурс	= "ЧЦ=15; ЧДЦ=4; ЧРД=.; ЧГ=0";
			
			Если Число(ЗначениеКурс) = Число(ЗначениеНовыйКурс)
				И Число(ЗначениеКратность) = Число(ЗначениеНоваяКратность) Тогда
				
				Значение = Формат(Число(Значение), ФорматСтрокиЗначение);
				
			Иначе
				
				//(Значение * ЗначениеКурса * ЗначениеНовойКратности) / (ЗначениеНовогоКурса * ЗначениеКратность)"
				ШаблонРасчетаЗначения = "((%1 * %2 * %3) / (%4 * %5))";
				
				Значение = СтрШаблон(ШаблонРасчетаЗначения,
					Формат(Число(Значение), 				ФорматСтрокиЗначение),
					Формат(Число(ЗначениеКурс),				ФорматСтрокиКурс),
					Формат(Число(ЗначениеНоваяКратность),	ФорматСтрокиКурс),
					Формат(Число(ЗначениеНовыйКурс),		ФорматСтрокиКурс),
					Формат(Число(ЗначениеКратность),		ФорматСтрокиКурс)
				);
				
			КонецЕсли;
			
		Иначе
			
			//++
			//Значение = 0;
			//--
			
		КонецЕсли;
		
		Если ЗначениеЗаполнено(ЕдиницаИзмерения) Тогда
			
			СоответствиеОперандов.Вставить(КлючЕдиницыИзмерения, ЕдиницаИзмерения);
			
			Если НЕ ЗначениеЗаполнено(СтрокаКоллекции.ЕдиницаИзмерения) Тогда
				
				СтрокаКоллекции.ЕдиницаИзмерения = ЕдиницаИзмерения;
				
			КонецЕсли;
			
			Если СтрокаКоллекции.ЕдиницаИзмерения <> ЕдиницаИзмерения Тогда
				
				Значение = "(" + Значение + " * " + ЦенообразованиеСервер.ПересчетЕдиницИзмерения(ЕдиницаИзмерения, СтрокаКоллекции.ЕдиницаИзмерения, Истина) + ")";
				
			КонецЕсли;
			
		КонецЕсли;
		
		СоответствиеОперандов.Вставить(СтрокаОперанда.Операнд, Значение);
		
	КонецЦикла;
	
КонецПроцедуры
Показать


Формулу вводить по аналогии с тем, как показано на рисунке.
Работает.
В довесок здесь же лежит расширение с изменением. Можно прямо его подключить и поиграться.
Прикрепленные файлы:
Расширение1.cfe
Iksteram; +1 Ответить
12. Ruslan2011 29.05.20 08:09 Сейчас в теме
спасибо вам.

думаю и вознаграждение вам полагается :)

но я чего-то не хочу возвращаться на унф после розницы :)

сечас вот вспоминаю , как франч мог добавить головной боли,
когда при покупке предлагали вместо УТ купить УНФ (!!!!!)

торговля наше все :)
с бух зуп и т.д. у меня не сложилось :)
13. ab_initio 95 30.05.20 08:15 Сейчас в теме
(12)
думаю и вознаграждение вам полагается

:) это если для автора еще актуально.
Кому-нибудь еще, возможно, пригодится.
14. Ruslan2011 30.05.20 08:22 Сейчас в теме
(13)
смотрю , он как рыба в воде :)))

молчит....
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот