|  | Работа с табличной частью. | ☑ | 
    
        | 0
    
        kolespo   17.09.17✎ 14:39 | 
        Здравствуйте.
 Стоит следующая задача:
 У документа имеются реквизиты:
 - Сумма документа - Полная сумма продаваемых товаров. Должна высчитываться автоматически и в любой момент времени должна быть актуальна.
 - Сумма скидки - Полная сумма всех предоставленных скидок. Должна высчитываться автоматически и в любой момент времени должна быть актуальна.
 Табличная часть "Товары". Поля:
 - Номенклатура
 - Количество
 - Цена
 - Сумма
 - Ручная скидка, %
 - Автоматическая скидка, % Поле недоступно для изменения.
 - Всего  Значение поля рассчитывается из суммы и скидок
 
 
 
 Мною написан следующий код:
 
 Процедура ТоварыПриИзменении(Элемент)
 
 Объект.СуммаРабот = 0   ;
 Объект.СуммаСкидки =  0   ;
 
 Для каждого СтрТовар из Объект.Товары
 Цикл
 
 СтрТовар.Сумма= СтрТовар.Цена *  СтрТовар.Количество    ;
 СуммаРучнойСкидки =  СтрТовар.Сумма *  (СтрТовар.РучнаяСкидка /100 );
 СуммаАвтоматическаяСкидка =  СтрТовар.Сумма *    (СтрТовар.АвтоматическаяСкидка /100 ) ;
 СуммаСкидкиСтр = СуммаРучнойСкидки +  СуммаАвтоматическаяСкидка  ;
 Объект.СуммаСкидки = Объект.СуммаСкидки +     СуммаСкидкиСтр   ;
 СтрТовар.Всего =  СтрТовар.Сумма -    СуммаСкидкиСтр      ;
 Объект.СуммаРабот    =     Объект.СуммаРабот  + СтрТовар.Всего ;
 
 КонецЦикла
 
 КонецПроцедуры
 
 
 Насколько понимаю, это не совсем верное решение, т.к. при каждом изменении в табличной части происходит вызов процедуры. ПОдскажите, как решить данную задачу?
 |  | 
    
        | 1
    
        Denis_CFO   17.09.17✎ 14:43 | 
        (0) Так будешь пересчитывать только текущую строку:
ТС = Элементы.Товары.ТекущиеДанные;
 ТС.Сумма = ТС.Цена *  ТС.Количество;
 
 Далее - аналогично.
 |  | 
    
        | 2
    
        kolespo   17.09.17✎ 14:58 | 
        То есть без цикла?
 Но в этом случае неправильно будет считаться
 
 Объект.СуммаРабот
 Объект.СуммаСкидки
 
 Или нужно вешать процедуру на событие "при изменении" каждого столбца таблицы?
 |  | 
    
        | 3
    
        Denis_CFO   17.09.17✎ 17:31 | 
        (2) Объект.СуммаРабот = Объект.Товары.Итог("СуммаРабот")     |  | 
    
        | 4
    
        rudnitskij   17.09.17✎ 21:29 | 
        (0) еще надо бы пересчитывать при изменении цены или количества     |  | 
    
        | 5
    
        Злопчинский   17.09.17✎ 21:52 | 
        (4) не забыть при удалении строки     |  | 
    
        | 6
    
        rudnitskij   17.09.17✎ 22:08 | 
        (5) самый надежный вариант еще пересчитывать перед записью     |  |