Имя: Пароль:
1C
1С v8
ут 11.4 перенос команды на форму отчета
0 saradip
 
03.10.22
14:51
Приветствую! Прошу помочь профи! Хочу перенести функцию для подсчета выделенных строк в отчете Валовая прибыль предприятия!
Нашел код в конфигураторе:
ОбщаяФорма.ПоказателиВыделенныхЯчеек
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // Параметры:
    //   Если передан параметр Расчет, то параметры ТабличныйДокумент и ВыделенныеОбласти не используются.
    //   Расчет - Структура - Результат функции СтандартныеПодсистемыКлиентСервер.РасчетЯчеек().
    //   ТабличныйДокумент - ТабличныйДокумент - Таблица, для которой выполняются расчеты.
    //   ВыделенныеОбласти - Массив - Области документа, которые требуется рассчитать.
    //       См. возвращаемое значение функции СтандартныеПодсистемыКлиент.ВыделенныеОбласти().
    Если Параметры.Свойство("АвтоТест") Тогда
        Возврат;
    КонецЕсли;
    
    Расчет = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(Параметры, "Расчет");
    Если ТипЗнч(Расчет) <> Тип("Структура") Тогда
        Расчет = СтандартныеПодсистемыКлиентСервер.РасчетЯчеек(Параметры.ТабличныйДокумент, Параметры.ВыделенныеОбласти);
    КонецЕсли;
    ЗаполнитьЗначенияСвойств(ЭтотОбъект, Расчет);
    
    РазрядностьЧисел    = Макс(0, Разрядность(Сумма), Разрядность(Минимум), Разрядность(Максимум));
    РазрядностьСреднего = Макс(РазрядностьЧисел, Разрядность(Среднее));
    
    ФорматЧисел = "ЧДЦ=" + Строка(РазрядностьЧисел) + "; ЧН=0";
    Элементы.Сумма.ФорматРедактирования    = ФорматЧисел;
    Элементы.Минимум.ФорматРедактирования  = ФорматЧисел;
    Элементы.Максимум.ФорматРедактирования = ФорматЧисел;
    Элементы.Среднее.ФорматРедактирования  = "ЧДЦ=" + Строка(РазрядностьСреднего) + "; ЧН=0";
    
    Если ОбщегоНазначенияКлиентСервер.ЭтоМобильныйКлиент() Тогда
        
        ПоложениеКоманднойПанели = ПоложениеКоманднойПанелиФормы.Авто;
        ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы, "Закрыть", "Видимость", Ложь);
        ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы, "Справка", "ТолькоВоВсехДействиях", Истина);
        
    КонецЕсли;
    
КонецПроцедуры

#КонецОбласти

И

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

Как этот кусок адаптировать под "свою базу", чтобы можно было из формы отчета вызывать расчет? Как это работает вообще, чтобы на форму добавить команду для вызову такой функции?