Опишу пошагово процесс разработки. Исправлений и добавлений потребуется внести совсем немного.
Для редактирования формул исправим несколько методов. В модуле формы КонструктовФормул исправим метод ЗаполнитьДеревоОперандов для добавление своих показателей.
&НаСервере
&ИзменениеИКонтроль("ЗаполнитьДеревоОперандов")
Процедура ФВЦ_ЗаполнитьДеревоОперандов(ИсключитьСсылку, ЭтоФормированиеЦен, ВключаяЦеныНоменклатуры, ВключаяЦеныКонтрагентов)
Запрос = Новый Запрос(
"ВЫБРАТЬ РАЗЛИЧНЫЕ РАЗРЕШЕННЫЕ
| ВидыЦен.ИдентификаторФормул КАК Операнд,
| ПРЕДСТАВЛЕНИЕ(ВидыЦен.Ссылка) КАК Представление,
| ИСТИНА КАК ЭтоВидЦенНоменклатуры,
| 0 КАК Картинка
|ИЗ
| Справочник.ВидыЦен КАК ВидыЦен
----------------------------------------------------------------
----------------------------------------------------------------
#Вставка
НоваяГруппа = ДеревоРезультата.Строки.Вставить(0);
НоваяГруппа.Картинка = 1;
НоваяГруппа.Представление = НСтр("ru ='ДЛЯ РАСЧЁТА'");
НоваяГруппа.ЭтоВидЦенНоменклатуры = Ложь;
НоваяСтрока = НоваяГруппа.Строки.Добавить();
НоваяСтрока.Картинка = 0;
НоваяСтрока.Операнд = "Логистика";
НоваяСтрока.Представление = "Логистика";
НоваяСтрока.ЭтоВидЦенНоменклатуры = Ложь;
НоваяСтрока = НоваяГруппа.Строки.Добавить();
НоваяСтрока.Картинка = 0;
НоваяСтрока.Операнд = "Наценка";
НоваяСтрока.Представление = "Наценка";
НоваяСтрока.ЭтоВидЦенНоменклатуры = Ложь;
НоваяСтрока = НоваяГруппа.Строки.Добавить();
НоваяСтрока.Картинка = 0;
НоваяСтрока.Операнд = "Комиссия";
НоваяСтрока.Представление = "Комиссия";
НоваяСтрока.ЭтоВидЦенНоменклатуры = Ложь;
НоваяСтрока = НоваяГруппа.Строки.Добавить();
НоваяСтрока.Картинка = 0;
НоваяСтрока.Операнд = "Налог";
НоваяСтрока.Представление = "Налог";
НоваяСтрока.ЭтоВидЦенНоменклатуры = Ложь;
#КонецВставки
ЗначениеВРеквизитФормы(ДеревоРезультата, "ДеревоОперандов");
КонецПроцедуры
Для хранения показателей добавим одноименные константы и общую форму для их редактирования.
Следующие исправления внесены в методы общего модуля ЦенообразованиеФормулыСервер, которые отвечают за проверку правильности формулы и за вычисление результата.
Сохраненные значения показателей подставляются в формулу в методе ПодготовитьДанныеСтрокиКоллекции.
&ИзменениеИКонтроль("ПодготовитьДанныеСтрокиКоллекции")
Процедура ФВЦ_ПодготовитьДанныеСтрокиКоллекции(СоответствиеОперандов, СтрокаКоллекции, ТаблицаОперандов, РасчетныеДанные)
-----------------------------------------------------------------------------------
-----------------------------------------------------------------------------------
ИначеЕсли СтрокаОперанда.Операнд = "[ТекущееЗначение]" Тогда
Значение = СтрокаКоллекции["ТекущееЗначение"];
КлючЕдиницыИзмерения = "ЕдиницаИзмерения_ТекущееЗначение";
ЕдиницаИзмерения = СтрокаКоллекции.Номенклатура.ЕдиницаИзмерения;
#Вставка
ИначеЕсли СтрокаОперанда.Операнд = "[Логистика]"
Или СтрокаОперанда.Операнд = "[Наценка]"
Или СтрокаОперанда.Операнд = "[Комиссия]"
Или СтрокаОперанда.Операнд = "[Налог]" Тогда
Значение = Константы["ФВЦ_"+СтрЗаменить(СтрЗаменить(СтрокаОперанда.Операнд, "[", ""), "]", "")].Получить();
КлючЕдиницыИзмерения = "ЕдиницаИзмерения_Базовая";
ЕдиницаИзмерения = СтрокаКоллекции.Номенклатура.ЕдиницаИзмерения;
#КонецВставки
Иначе
Значение = СтрокаОперанда.Значение;
-----------------------------------------------------------------------------------
-----------------------------------------------------------------------------------
СоответствиеОперандов.Вставить(СтрокаОперанда.Операнд, Значение);
КонецЦикла;
КонецПроцедуры
Таким образом формула наполнена новыми показателями и готова к вычислению.
Проверено на следующих конфигурациях и релизах:
- Управление нашей фирмой, редакция 3.0, релизы 3.0.9.191