gifts2017

Красивости в отчётах для 8-ки

Опубликовал Пимшин 1 (Pim) в раздел Программирование - Работа с интерфейсом

Часто бывает необходимость сложить несколько чисел в печатной форме, например, как это сделано в экселе.

Сегодня решить посмотреть Бухгалтерию КОРП. Нашёл в ней очень интересную штуку: поле в котором показан результат сложения выделенных ячеек печатной формы. Конечно, такую штуку бы правильнее реализовать на уровне платформы. Но коль нет, можно оказывается сделать ручками. Как говориться, и за это богам спасибо.

 

Вот исходный код из Бухгалтерии КОРП:

Функция ВычислитьСуммуВыделенныхЯчеекТабличногоДокумента(ПолеТабличногоДокумента) Экспорт

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

    Возврат Сумма;

КонецФункции

Подумав немного, я добавил в функцию ещё расчёт среднего и определение количества ячеек с числами. Получилось вот что:

///==============================================================================
Функция ВычислитьСуммуВыделенныхЯчеекТабличногоДокумента(ПолеТабличногоДокумента, average = 0, count = 0) Экспорт

    Сумма = 0;
    count = 0;
    Для Каждого Область Из ПолеТабличногоДокумента.ВыделенныеОбласти Цикл
        Если ТипЗнч(Область) = Тип("ОбластьЯчеекТабличногоДокумента") Тогда
            Для ИндексСтрока = Область.Верх По Область.Низ Цикл
                Для ИндексКолонка = Область.Лево По Область.Право Цикл
                    Попытка
                        vNumber = Число(СтрЗаменить(ПолеТабличногоДокумента.Область("R" + Формат(ИндексСтрока, "ЧГ=0") + "C" + Формат(ИндексКолонка, "ЧГ=0")) .Текст, " ", ""));
                        Сумма = Сумма + vNumber;
                        count = count + 1;
                    Исключение  
                    КонецПопытки;
                КонецЦикла;
           КонецЦикла;
        КонецЕсли;
    КонецЦикла;
    if count <> 0 then
        average = Сумма / count;
    else
        average = 0;
    endIf;
    Возврат Сумма;
КонецФункции // ВычислитьСуммуВыделенныхЯчеекТабличногоДокумента

Результат на картинке.

Да, чуть не забыл самое главное - функцию надо вызвать в обработчике ПриАктивизацииОбласти поля табличного документа.

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Евгений Люлюк (Evg-Lylyk) 27.03.10 21:07
Вариант КОРП медленный при выделении большого числа ячеек.
http://infostart.ru/public/57687/
2. Пимшин 1 (Pim) 28.03.10 11:35
(1) Да уж... Надо внимательнее смотреть архив разработок, прежде чем публиковать.

Всем. Но зато я нашёл косяк во всех подобных разработках (и у 1с, и у Evg-Lylyk, ну и, соответственно, в моём первом варианте было).

Суть проблемы в том, что привыделении нескольких ячеек (преимущественно не смежных) с использованием клавиши CTRL, если несколько раз нажать на одну и ту же ячейку, то сумма увеличится на столько сколько раз нажимали на одну область.

У меня косяк проявился на платформе 8.1.15.14 и 8.2.10.77. Скорей всего и остальные версии платформы в этом случае в поле ВыделенныеОбласти табличного документа поместят при нажатом CTRL каждую ячейку столько раз, сколько на неё нажали.

Вот мой вариант устранения:
Сумма     = 0;
count     = 0;
processed = new ТаблицаЗначений;
processed.Колонки.Добавить("row");
processed.Колонки.Добавить("col");
Для Каждого Область Из ПолеТабличногоДокумента.ВыделенныеОбласти Цикл
	Если ТипЗнч(Область) = Тип("ОбластьЯчеекТабличногоДокумента") Тогда
		Для ИндексСтрока = Область.Верх По Область.Низ Цикл
			Для ИндексКолонка = Область.Лево По Область.Право Цикл
				if processed.НайтиСтроки(new Структура("row, col", ИндексСтрока, ИндексКолонка)).Количество() <> 0 then
					continue;
				endIf;
				Попытка
					vNumber = Число(СтрЗаменить(ПолеТабличногоДокумента.Область(ИндексСтрока, ИндексКолонка).Текст, " ", ""));
					Сумма   = Сумма + vNumber;
					count   = count + 1;
				Исключение
				КонецПопытки;

				vLine     = processed.Добавить();
				vLine.row = ИндексСтрока;
				vLine.col = ИндексКолонка;
			КонецЦикла;
		КонецЦикла;
	КонецЕсли;
КонецЦикла;

average = ?(count = 0, 0, Сумма / count);
Возврат Сумма;
...Показать Скрыть
3. Ярослав Радкевич (WKBAPKA) 29.03.10 12:40
2(2): ну это ж не проблема... имена же областей известны, достаточно добавить список значений для контроля и все...
4. Антон Рощин (wolfsoft) 01.04.10 17:46
А чего "М" вверху на панели не работает?
5. Евгений Люлюк (Evg-Lylyk) 01.04.10 18:01
(2) Спасибо за замечание. Это мелочь из-за которой придется усложнять алгоритм и никто ее не оценит. Вон некоторым кнопки М достаточно.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа