Имя: Пароль:
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 Тогда
        Результат.Среднее = Результат.Сумма / Результат.КоличествоЧисловых;
    КонецЕсли;
    
    Возврат Результат;
    
КонецФункции

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