09.12.2009

Как рассчитать сумму  в строке табличной части справочника или документа?

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

Это небольшое вычисление производится в модуле формы в процедуре, выполняющейся на клиенте. Такой процедурой являются обработчики события ПриИзменении полей Цена и Количество табличной части документа.

Итак, сначала нужно создать форму документа, чтобы в ней описать собственный алгоритм вычислений. Затем, открыв палитру свойств полей Цена и Количество табличной части документа, создать для них обработчики события ПриИзменении и внести в них следующий код:

Копировать в буфер обмена
&НаКлиенте
Процедура МатериалыКоличествоПриИзменении(Элемент)
   СтрокаТабличнойЧасти = Элементы.Материалы.ТекущиеДанные;
   СтрокаТабличнойЧасти.Сумма = СтрокаТабличнойЧасти.Количество * СтрокаТабличнойЧасти.Цена;
КонецПроцедуры

&НаКлиенте
Процедура МатериалыЦенаПриИзменении(Элемент)
   СтрокаТабличнойЧасти = Элементы.Материалы.ТекущиеДанные;
   СтрокаТабличнойЧасти.Сумма = СтрокаТабличнойЧасти.Количество * СтрокаТабличнойЧасти.Цена; 
КонецПроцедуры

При выполнении этого кода в переменную СтрокаТабличнойЧасти помещается объект, содержащий данные текущей строки документа, которую требуется пересчитать. Получив этот объект, можно обратиться к данным конкретной колонки табличной части, указав имя колонки в качестве свойства объекта. Таким образом, во второй строке процедуры обработчика вычисляется значение колонки Сумма как произведение значений колонок Количество и Цена.

Если процедура расчета суммы может понадобиться сразу для нескольких документов, то полезно разместить эту процедуру в общем модуле, и обращаться к ней из форм документов. Например, в общем модуле РаботаСДокументами поместить процедуру РассчитатьСумму():

Копировать в буфер обмена
Процедура РассчитатьСумму(СтрокаТабличнойЧасти) Экспорт
    СтрокаТабличнойЧасти.Сумма = СтрокаТабличнойЧасти.Количество * СтрокаТабличнойЧасти.Цена; 
КонецПроцедуры 

В модуле формы документа вызывать ее из обработчиков события ПриИзменении:

Копировать в буфер обмена
&НаКлиенте
Процедура МатериалыКоличествоПриИзменении(Элемент)
    СтрокаТабличнойЧасти = Элементы.Материалы.ТекущиеДанные;
    РаботаСДокументами.РассчитатьСумму(СтрокаТабличнойЧасти);
КонецПроцедуры

&НаКлиенте
Процедура МатериалыЦенаПриИзменении(Элемент)
    СтрокаТабличнойЧасти = Элементы.Материалы.ТекущиеДанные;
    РаботаСДокументами.РассчитатьСумму(СтрокаТабличнойЧасти);
КонецПроцедуры