Имя: Пароль:
1C
1С v8
Табличный документ Сумма как в экселе
0 Patrio_
O_Muerte
 
23.08.13
11:33
Добрый день.
Есть ли в 8-ке какая нибудь волшебная возможность просуммировать несколько чисел как в Экселе в табличном документе?
1 Галахад
 
гуру
23.08.13
11:34
При запущенном калькуляторе выделить ячейки и нажать "М"
2 Patrio_
O_Muerte
 
23.08.13
11:40
М на клавиатуре или в калькуляторе?
3 Галахад
 
гуру
23.08.13
11:42
В 1С-е на панели.
4 Patrio_
O_Muerte
 
23.08.13
11:43
нашел, спс
5 Xatori
 
23.08.13
12:18
Вот держи, авторство не моё, уже не помню где нарыл, но работает исправно

На форме расположить надпись с именем "ИнформационноеСообщение" (туда будет выводжится результат)

/// Процедура Расчитывает сумму ячеек как в Екселе


Процедура РезультатПриАктивизацииОбласти(Элемент)
    
    /// Расчет Суммы как в Экселе по выделенным ячейкам
    ИнформационноеСообщение = "";
    ОбщаяСумма = 0;
    Для Каждого ИнфоОбласти Из ПолучитьИнформациюПоВыделеннымОбластям (ЭлементыФормы.Результат) Цикл
        Попытка
            ИнформационноеСообщение = Число(ИнформационноеСообщение);
        Исключение
            ИнформационноеСообщение = ИнформационноеСообщение;
        КонецПопытки;
        ИнформационноеСообщение = ИнформационноеСообщение  + ИнфоОбласти.Сумма;
        //" (" + ИнфоОбласти.КоличествоЯчеек + ") Сумма = " + ИнфоОбласти.Сумма;
            //ИнфоОбласти.Область + " (" + ИнфоОбласти.КоличествоЯчеек + ") Сумма = " + ИнфоОбласти.Сумма; //+ " Среднее = " + ИнфоОбласти.Сумма/ИнфоОбласти.КоличествоЯчеек + "; ";
        ОбщаяСумма = ОбщаяСумма + ИнфоОбласти.Сумма;
    КонецЦикла;
    
    //ИнформационноеСообщение = ИнформационноеСообщение + Символы.ПС + "Общая сумма: " + ОбщаяСумма;
    
    ЭлементыФормы.ИнформационноеСообщение.Заголовок = ИнформационноеСообщение;
    Если ОбщаяСумма = 0 Тогда
        ЭлементыФормы.ИнформационноеСообщение.Видимость = Ложь;
    Иначе
        ЭлементыФормы.ИнформационноеСообщение.Видимость = Истина;
    КонецЕсли;
    ////////
КонецПроцедуры
6 Xatori
 
23.08.13
12:23
Вот ещё, забыл кинуть нужные процедуры
/// Расчет Суммы как в Экселе по выделенным ячейкам


Функция ПолучитьИнформациюПоВыделеннымОбластям (ТабличныйДокумент) Экспорт
    
    МассивДанныхВыделенныхОбластей = Новый Массив;
    
    НомерВыделеннойОбласти = 0;
    КоличествоВыделенныхОбластей = ТабличныйДокумент.ВыделенныеОбласти.Количество();
    
    Для Сч = 0 По КоличествоВыделенныхОбластей - 1 Цикл
        
        ВыделеннаяОбласть = ТабличныйДокумент.ВыделенныеОбласти[КоличествоВыделенныхОбластей - НомерВыделеннойОбласти - 1];
        
        Если ВыделеннаяОбласть <> Неопределено Тогда
            
            КоличествоЯчеек = (ВыделеннаяОбласть.Право - ВыделеннаяОбласть.Лево + 1) * (ВыделеннаяОбласть.Низ - ВыделеннаяОбласть.Верх + 1);
            
            ЕстьКэшДляОбласти = КэшОбластей.Количество() > 0 И КэшОбластей.ВГраница() >= НомерВыделеннойОбласти;
            
            Если ЕстьКэшДляОбласти Тогда
                ОбластьВКэш = КэшОбластей[НомерВыделеннойОбласти];
                
                Если ОбластьПолностьюЛежитВОбласти(ОбластьВКэш, ВыделеннаяОбласть) Тогда //Область кэша в выделенной области (область увеличена)
                    //|-------------------------|
                    //|     ----------          |
                    //|     | Кэш    |          |
                    //|     ----------          |
                    //|  Выделенная область     |
                    //|-------------------------|
                    
                    СуммаОблСверху = ВычислитьСуммуОбласти (ТабличныйДокумент,    ВыделеннаяОбласть.Верх, ВыделеннаяОбласть.Лево,
                    ОбластьВКэш.Верх - 1, ВыделеннаяОбласть.Право);
                    СуммаОблСнизу = ВычислитьСуммуОбласти (ТабличныйДокумент,    ОбластьВКэш.Низ + 1, ВыделеннаяОбласть.Лево,
                    ВыделеннаяОбласть.Низ, ВыделеннаяОбласть.Право);
                    СуммаОблСлева = ВычислитьСуммуОбласти (ТабличныйДокумент,    ОбластьВКэш.Верх, ВыделеннаяОбласть.Лево,
                    ОбластьВКэш.Низ, ОбластьВКэш.Лево - 1);
                    СуммаОблСправа = ВычислитьСуммуОбласти (ТабличныйДокумент,    ОбластьВКэш.Верх, ОбластьВКэш.Право + 1,
                    ОбластьВКэш.Низ, ВыделеннаяОбласть.Право);
                    
                    Сумма = ОбластьВКэш.Сумма + СуммаОблСверху + СуммаОблСнизу + СуммаОблСлева + СуммаОблСправа;
                    
                ИначеЕсли ОбластьПолностьюЛежитВОбласти(ВыделеннаяОбласть, ОбластьВКэш) Тогда //Выделенная область лежит в кэше (область уменьшена)
                    //|-------------------------|
                    //|     ------------------  |
                    //|     | Выделенная обл.|  |
                    //|     ------------------  |
                    //|  Кэш область            |
                    //|-------------------------|
                    
                    СуммаОблСверху = ВычислитьСуммуОбласти (ТабличныйДокумент,    ОбластьВКэш.Верх, ОбластьВКэш.Лево,
                    ВыделеннаяОбласть.Верх - 1, ОбластьВКэш.Право);
                    СуммаОблСнизу = ВычислитьСуммуОбласти (ТабличныйДокумент,    ВыделеннаяОбласть.Низ + 1, ОбластьВКэш.Лево,
                    ОбластьВКэш.Низ, ОбластьВКэш.Право);
                    СуммаОблСлева = ВычислитьСуммуОбласти (ТабличныйДокумент,    ВыделеннаяОбласть.Верх, ОбластьВКэш.Лево,
                    ВыделеннаяОбласть.Низ, ВыделеннаяОбласть.Лево - 1);
                    СуммаОблСправа = ВычислитьСуммуОбласти (ТабличныйДокумент,    ВыделеннаяОбласть.Верх, ВыделеннаяОбласть.Право + 1,
                    ВыделеннаяОбласть.Низ, ОбластьВКэш.Право);
                    
                    Сумма = ОбластьВКэш.Сумма - СуммаОблСверху - СуммаОблСнизу - СуммаОблСлева - СуммаОблСправа;
                    
                Иначе
                    //Обычный вариант расчета (т.к. кэш другой области)
                    Сумма = ВычислитьСуммуОбласти (ТабличныйДокумент, ВыделеннаяОбласть.Верх, ВыделеннаяОбласть.Лево, ВыделеннаяОбласть.Низ, ВыделеннаяОбласть.Право);
                КонецЕсли;
            Иначе
                //Обычный вариант расчета (т.к. кэша нет)
                Сумма = ВычислитьСуммуОбласти (ТабличныйДокумент, ВыделеннаяОбласть.Верх, ВыделеннаяОбласть.Лево, ВыделеннаяОбласть.Низ, ВыделеннаяОбласть.Право);
            КонецЕсли;
            
            //Заполним данные структуры КэшЭлементаОбласть
            СтруктураКэшЭлементаОбласть = Новый Структура("Лево,Низ,Право,Верх,Сумма",ВыделеннаяОбласть.Лево, ВыделеннаяОбласть.Низ,
            ВыделеннаяОбласть.Право, ВыделеннаяОбласть.Верх, Сумма);
            //Заполним Кэш
            Если ЕстьКэшДляОбласти Тогда
                КэшОбластей[НомерВыделеннойОбласти] = СтруктураКэшЭлементаОбласть;
            Иначе
                КэшОбластей.Добавить(СтруктураКэшЭлементаОбласть);
            КонецЕсли;
            
            СтруктураДанныхОбласти = Новый Структура ("Область, КоличествоЯчеек, Сумма",
            ВыделеннаяОбласть.Имя, КоличествоЯчеек, Сумма);
            
            МассивДанныхВыделенныхОбластей.Добавить(СтруктураДанныхОбласти);
        КонецЕсли;
        
        НомерВыделеннойОбласти = НомерВыделеннойОбласти + 1;
        
    КонецЦикла;
    
    Возврат МассивДанныхВыделенныхОбластей;
    
КонецФункции

Функция ОбластьПолностьюЛежитВОбласти (ПроверяемаяОбласть,Область)
    
    //Проверим лежит ли область в заданной области
    Возврат ПроверяемаяОбласть.Лево >= Область.Лево И ПроверяемаяОбласть.Право <= Область.Право И
    ПроверяемаяОбласть.Верх >= Область.Верх И ПроверяемаяОбласть.Низ <= Область.Низ;
    
КонецФункции

Функция ВычислитьСуммуОбласти (ТабличныйДокумент, Верх, Лево, Низ, Право)
    
    Сумма = 0;
    
    Для ЯчВерт = Верх По Низ Цикл
        Для ЯчГориз = Лево По Право Цикл
            
            Область = ТабличныйДокумент.Область(ЯчВерт,ЯчГориз);
            Попытка
                Если Область.Видимость Тогда
                    Сумма = Сумма + ПолучитьЧислоИзСтроки(Область.Текст);
                КонецЕсли;
            Исключение
                Сумма = 0;
            КонецПопытки;
        КонецЦикла;
    КонецЦикла;
    
    Возврат Сумма;
    
КонецФункции

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


/////////////////////////
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс