РасчетныеПоказателиЯчеек (БСП)

Автор: 1С
ОбщийМодуль.ОбщегоНазначенияСлужебныйКлиентСервер
БСП

Расчетные показатели ячеек. Рассчитывает показатели числовых ячеек в табличном документе.

// Рассчитывает показатели числовых ячеек в табличном документе.
//
// Параметры:
//   ПараметрыРасчета - структура - см. также ОбщегоНазначенияСлужебныйКлиент.ПараметрыРасчетаПоказателейЯчеек.
//
// Возвращаемое значение:
//   Структура - результаты расчета выделенных ячеек.
//       * Количество         - Число - Количество выделенных ячеек.
//       * КоличествоЧисловых - Число - Количество числовых ячеек.
//       * Сумма      - Число - Сумма выделенных ячеек с числами.
//       * Среднее    - Число - Сумма выделенных ячеек с числами.
//       * Минимум    - Число - Сумма выделенных ячеек с числами.
//       * Максимум   - Число - Максимум выделенных ячеек с числами.
//
Функция РасчетныеПоказателиЯчеек(Знач ТабличныйДокумент, ВыделенныеОбласти) Экспорт 
	РасчетныеПоказатели = Новый Структура;
	РасчетныеПоказатели.Вставить("Количество", 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
///////////////////////////////////////////////////////////////////////////////////////////////////////

Рекомендации

Похожие публикации

ПараметрыРасчетаПоказателейЯчеек (БСП)

Объединить ячейки в СКД

ПриСбореПоказателейСтатистикиКонфигурации (БСП)

TurboConf 6 - расширение Конфигуратора 1С