Имя: Пароль:
1C
 
Работа с табличной частью.
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) самый надежный вариант еще пересчитывать перед записью