Расчетные показатели ячеек. Рассчитывает показатели числовых ячеек в табличном документе.
// Рассчитывает показатели числовых ячеек в табличном документе.
//
// Параметры:
// ПараметрыРасчета - структура - см. также ОбщегоНазначенияСлужебныйКлиент.ПараметрыРасчетаПоказателейЯчеек.
//
// Возвращаемое значение:
// Структура - результаты расчета выделенных ячеек.
// * Количество - Число - Количество выделенных ячеек.
// * КоличествоЧисловых - Число - Количество числовых ячеек.
// * Сумма - Число - Сумма выделенных ячеек с числами.
// * Среднее - Число - Сумма выделенных ячеек с числами.
// * Минимум - Число - Сумма выделенных ячеек с числами.
// * Максимум - Число - Максимум выделенных ячеек с числами.
//
Функция РасчетныеПоказателиЯчеек(Знач ТабличныйДокумент, ВыделенныеОбласти) Экспорт
РасчетныеПоказатели = Новый Структура;
РасчетныеПоказатели.Вставить("Количество", 0);
РасчетныеПоказатели.Вставить("КоличествоНеПустых", 0);
РасчетныеПоказатели.Вставить("КоличествоЧисловых", 0);
РасчетныеПоказатели.Вставить("Сумма", 0);
РасчетныеПоказатели.Вставить("Среднее", 0);
РасчетныеПоказатели.Вставить("Минимум", 0);
РасчетныеПоказатели.Вставить("Максимум", 0);
Если ВыделенныеОбласти = Неопределено Тогда
ВыделенныеОбласти = ТабличныйДокумент.ВыделенныеОбласти;
КонецЕсли;
ПроверенныеЯчейки = Новый Соответствие;
Для Каждого ВыделеннаяОбласть Из ВыделенныеОбласти Цикл
Если ТипЗнч(ВыделеннаяОбласть) <> Тип("ОбластьЯчеекТабличногоДокумента")
И ТипЗнч(ВыделеннаяОбласть) <> Тип("Структура") Тогда
Продолжить;
КонецЕсли;
ВыделеннаяОбластьВерх = ВыделеннаяОбласть.Верх;
ВыделеннаяОбластьНиз = ВыделеннаяОбласть.Низ;
ВыделеннаяОбластьЛево = ВыделеннаяОбласть.Лево;
ВыделеннаяОбластьПраво = ВыделеннаяОбласть.Право;
Если ВыделеннаяОбластьВерх = 0 Тогда
ВыделеннаяОбластьВерх = 1;
КонецЕсли;
Если ВыделеннаяОбластьНиз = 0 Тогда
ВыделеннаяОбластьНиз = ТабличныйДокумент.ВысотаТаблицы;
КонецЕсли;
Если ВыделеннаяОбластьЛево = 0 Тогда
ВыделеннаяОбластьЛево = 1;
КонецЕсли;
Если ВыделеннаяОбластьПраво = 0 Тогда
ВыделеннаяОбластьПраво = ТабличныйДокумент.ШиринаТаблицы;
КонецЕсли;
Если ВыделеннаяОбласть.ТипОбласти = ТипОбластиЯчеекТабличногоДокумента.Колонки Тогда
ВыделеннаяОбластьВерх = ВыделеннаяОбласть.Низ;
ВыделеннаяОбластьНиз = ТабличныйДокумент.ВысотаТаблицы;
КонецЕсли;
ВыделеннаяОбластьВысота = ВыделеннаяОбластьНиз - ВыделеннаяОбластьВерх + 1;
ВыделеннаяОбластьШирина = ВыделеннаяОбластьПраво - ВыделеннаяОбластьЛево + 1;
РасчетныеПоказатели.Количество = РасчетныеПоказатели.Количество + ВыделеннаяОбластьШирина * ВыделеннаяОбластьВысота;
Для НомерКолонки = ВыделеннаяОбластьЛево По ВыделеннаяОбластьПраво Цикл
Для НомерСтроки = ВыделеннаяОбластьВерх По ВыделеннаяОбластьНиз Цикл
Ячейка = ТабличныйДокумент.Область(НомерСтроки, НомерКолонки, НомерСтроки, НомерКолонки);
Если ПроверенныеЯчейки.Получить(Ячейка.Имя) = Неопределено Тогда
ПроверенныеЯчейки.Вставить(Ячейка.Имя, Истина);
Иначе
Продолжить;
КонецЕсли;
Если Ячейка.Видимость = Истина Тогда
Если Ячейка.ТипОбласти <> ТипОбластиЯчеекТабличногоДокумента.Колонки
И Ячейка.СодержитЗначение И ТипЗнч(Ячейка.Значение) = Тип("Число") Тогда
Число = Ячейка.Значение;
ИначеЕсли ЗначениеЗаполнено(Ячейка.Текст) Тогда
ОписаниеТипаЧисло = Новый ОписаниеТипов("Число");
ТекстЯчейки = Ячейка.Текст;
Если СтрНачинаетсяС(ТекстЯчейки, "(")
И СтрЗаканчиваетсяНа(ТекстЯчейки, ")") Тогда
ТекстЯчейки = СтрЗаменить(ТекстЯчейки, "(", "");
ТекстЯчейки = СтрЗаменить(ТекстЯчейки, ")", "");
Число = ОписаниеТипаЧисло.ПривестиЗначение(ТекстЯчейки);
Если Число > 0 Тогда
Число = -Число;
КонецЕсли;
Иначе
Число = ОписаниеТипаЧисло.ПривестиЗначение(ТекстЯчейки);
КонецЕсли;
Иначе
Продолжить;
КонецЕсли;
РасчетныеПоказатели.КоличествоНеПустых = РасчетныеПоказатели.КоличествоНеПустых + 1;
Если ТипЗнч(Число) = Тип("Число") Тогда
РасчетныеПоказатели.КоличествоЧисловых = РасчетныеПоказатели.КоличествоЧисловых + 1;
РасчетныеПоказатели.Сумма = РасчетныеПоказатели.Сумма + Число;
Если РасчетныеПоказатели.КоличествоЧисловых = 1 Тогда
РасчетныеПоказатели.Минимум = Число;
РасчетныеПоказатели.Максимум = Число;
Иначе
РасчетныеПоказатели.Минимум = Мин(Число, РасчетныеПоказатели.Минимум);
РасчетныеПоказатели.Максимум = Макс(Число, РасчетныеПоказатели.Максимум);
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЦикла;
Если РасчетныеПоказатели.КоличествоЧисловых > 0 Тогда
РасчетныеПоказатели.Среднее = РасчетныеПоказатели.Сумма / РасчетныеПоказатели.КоличествоЧисловых;
КонецЕсли;
Возврат РасчетныеПоказатели;
КонецФункции
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////
Канал FastCode 1C в Телеграм! Шаблоны кода, статьи, полезные советы, курсы по 1С (8К участников)