Оптимизированный подсчет суммы выделенных ячеек табличного документа (как в Excel)


Оптимизированный расчет данных выделенных ячеек

В Excel есть удобный механизм подсчет суммы выделенных ячеек в 1С к сожалению такого нет. 1С предлагает нам пользоваться кнопками калькулятора "М" что не так удобно как вариант предлагаемый ниже.

Простой вариант подсчета суммы выделенной области реализуется очень легко.
Добавляем процедуру обработки события ПриАктивизацииОбласти (Событие, возникающее при активизации области табличного документа) где обходим в выделенные области и суммируем.

Ну как обычно самый простой не самый эффективный. Основной недостаток подхода в том расчет всегда производится для всех ячеек, т.е. чем больше ячеек выделено, тем дольше считается. На моем железе при количестве ячеек более 1000 уже наблюдаются тормоза.

Оптимизированный вариант расчета

Производится обработка только тех ячеек которые добавлены к выделению (при выделении разом большого количества ячеек медленно как и для простого варианта, но в случае постепенного выделение замедления нет)

В примере всю обработку по запоминанию суммы предыдущих выделенных областей и суммированию берет на себя функция ПолучитьИнформациюПоВыделеннымОбластям(ТабличныйДокумент) , которая возвращает массив структур содержащихся информацию по области.

Оптимизированный вариант более сложный, но более эффективный в плане скорости.
Особый случай с выделением через Crtl + A т.к. в этом случае в процедуру передается Область (0,0,0,0) подсчет не производится и это разумно в этом случае пользователь выделяет не для подсчета суммы.

p.s.
За любые идеи по улучшению производительности буду очень признателен
Если функции ВычислитьСуммуОбласти, ПолучитьЧислоИзСтроки  реализовать через ВК думаю производительность возрастет. Может кто поможет ;)

Функция ВычислитьСуммуОбласти (ТабличныйДокумент, Верх, Лево, Низ, Право)

   
Сумма = 0;

    Для
ЯчВерт = Верх По Низ Цикл
        Для
ЯчГориз = Лево По Право Цикл
           
ОдиночнаяОбласть = ТабличныйДокумент.Область(ЯчВерт,ЯчГориз);

            Сумма = Сумма + ПолучитьЧислоИзСтроки(ОдиночнаяОбласть.Текст);
        КонецЦикла;
    КонецЦикла;

    Возврат
Сумма;

КонецФункции

Функция
ПолучитьЧислоИзСтроки(Текст)

    Попытка
       
Результат = Число(Текст);
    Исключение
       
Результат = 0;
    КонецПопытки;

    Возврат
Результат;

КонецФункции

 Внимание!!! Код выше не является основой обработки. Вынесены процедуры которые желательно реализовать через ВК для повышения скорости

Файлы обработки:

-