0. Evg-Lylyk 2723 28.09.09 15:51 Сейчас в теме

Оптимизированный подсчет суммы выделенных ячеек табличного документа (как в Excel)

Оптимизированный расчет данных выделенных ячеек

Перейти к публикации

Комментарии
Избранное Подписка Сортировка: Древо
1. highlander 28.09.09 15:51 Сейчас в теме
А я вот интересуюсь... а возможно такое на 7-ке?
3. Арчибальд 2708 28.09.09 16:03 Сейчас в теме
13. venger 2086 29.09.09 12:07 Сейчас в теме
(1) > А я вот интересуюсь... а возможно такое на 7-ке?

Вот, например: http://infostart.ru/public/16000/
53. Fisherru 79 16.02.10 09:59 Сейчас в теме
(13)
Ваша ссылочка хороша, плюсик поставил, но это не совсем тоже самое...
У вас там идет работа с печатными формами, а хочется с табличными частями документа и со справочниками в форме списка...
Вот что очень хочется http://infostart.ru/forum/forum19/topic31264/
54. Evg-Lylyk 2723 16.02.10 10:08 Сейчас в теме
(53) на семерке не подскажу
А в 8.х вроде как нельзя так как в Таблицах, деревьях нельзя получить диапазон выделенных ячеек только выделенные строки
58. German_Tagil 7 10.01.19 06:01 Сейчас в теме
(53)
Вот что очень хочется http://infostart.ru/forum/forum19/topic31264/

Подскажите а что там - пытаюсь обратиться - у вас нет прав на просмотр топика
59. Evg-Lylyk 2723 10.01.19 09:22 Сейчас в теме
(58) Не подскажу, с 7.7 давно не работаю
60. German_Tagil 7 10.01.19 10:18 Сейчас в теме
(59) А я не про 7.7 спрашиваю
думал что что-то по данному вопросу для 8.2
задачка нудная - учет реально отработанного времени
по операционно - документ сделал - теперь пытаюсь упростить ввод данных
61. Evg-Lylyk 2723 10.01.19 10:26 Сейчас в теме
(60) Там 50 сообщений, поясни здесь о чем речь
62. German_Tagil 7 10.01.19 10:37 Сейчас в теме
(61) Вот что очень хочется http://infostart.ru/forum/forum19/topic31264/
думал что это для 8.1
63. Evg-Lylyk 2723 10.01.19 10:50 Сейчас в теме
(62) Прошу уточнить ты пишешь тоже самое. Попытаюсь угадать
Если нужно что в т.ч. документа или обработки подсчитывалась сумма выделенных строк
думаю реализуемо на события вешаем подсчет отображаем например в подвале.
2. Evg-Lylyk 2723 28.09.09 15:59 Сейчас в теме
(2) посмотрел вроде нет предопределенной процедуры аналогичной 8.1 аналогично наверно не сделать

Надеюсь ветка не превратится в ветку, а как сделать тоже самое на 7.7 :)
4. highlander 28.09.09 16:12 Сейчас в теме
Нет не превратиться... не волнуйтесь :D Но за идею плюс однозначно
5. Evg-Lylyk 2723 28.09.09 16:31 Сейчас в теме
(4) самая идея подсчета суммы работает через 5 минут, а вот над оптимизацией пришлось поломать голову
6. Stepa86 1286 28.09.09 17:13 Сейчас в теме
(5) какое самое узкое место? наверно получение одиночной области и вынимание из нее текста...
7. bashta.aleksey 28.09.09 17:45 Сейчас в теме
Evg-Lylyk в конфе "Бухгалтерия предприятия КОРП" рел 2.0.6.3 этот механизм уже есть в стандартных отчетах.
Думаю это тебе поможет:
Функция ВычислитьСуммуВыделенныхЯчеекТабличногоДокумента(ПолеТабличногоДокумента) Экспорт
Сумма = 0;
Для Каждого Область Из ПолеТабличногоДокумента.ВыделенныеОбласти Цикл
Если ТипЗнч(Область) = Тип("ОбластьЯчеекТабличногоДокумента") Тогда
Для ИндексСтрока = Область.Верх По Область.Низ Цикл
Для ИндексКолонка = Область.Лево По Область.Право Цикл
Попытка
Сумма = Сумма + Число(СтрЗаменить(ПолеТабличногоДокумента.Область("R" + Формат(ИндексСтрока, "ЧГ=0") + "C" + Формат(ИндексКолонка, "ЧГ=0")) .Текст, " ", ""));
Исключение
КонецПопытки;
КонецЦикла;
КонецЦикла;
КонецЕсли;
КонецЦикла;
Возврат Сумма;
КонецФункции
Показать
10. Evg-Lylyk 2723 28.09.09 19:05 Сейчас в теме
(7) мой метод "нормальный" 8)
8. bashta.aleksey 28.09.09 17:46 Сейчас в теме
Извините.
Функция ВычислитьСуммуВыделенныхЯчеекТабличногоДокумента(ПолеТабличногоДокумента) Экспорт
Сумма = 0;
Для Каждого Область Из ПолеТабличногоДокумента.ВыделенныеОбласти Цикл
Если ТипЗнч(Область) = Тип("ОбластьЯчеекТабличногоДокумента") Тогда
Для ИндексСтрока = Область.Верх По Область.Низ Цикл
Для ИндексКолонка = Область.Лево По Область.Право Цикл
Попытка
Сумма = Сумма + Число(СтрЗаменить(ПолеТабличногоДокумента.Область("R" + Формат(ИндексСтрока, "ЧГ=0") + "C" + Формат(ИндексКолонка, "ЧГ=0")) .Текст, " ", ""));
Исключение
КонецПопытки;
КонецЦикла;
КонецЦикла;
КонецЕсли;
КонецЦикла;
Возврат Сумма;
КонецФункции
director04; +1 Ответить
9. Evg-Lylyk 2723 28.09.09 19:04 Сейчас в теме
11. bashta.aleksey 28.09.09 21:22 Сейчас в теме
12. 4ish 29.09.09 10:57 Сейчас в теме
Не сочтите за каприз, но попробовал выделять отдельные ячейки через Ctrl - не работает. :(
14. Evg-Lylyk 2723 29.09.09 12:27 Сейчас в теме
(12) Мультивыделение работает и система оптимизации для мультивыделений тоже. Просто это пример... функция "ПолучитьИнформациюПоВыделеннымОбластям" возвращает информацию по каждой области в структуре дальше используете как хотите я просто не стал делать сумму выделенных областей т.к. просто пример. Сейчас поправлю.
15. Yashazz 2907 29.09.09 16:32 Сейчас в теме
О! Всё ждал, пока кто-нибудь сделает...
Спасибо!
16. 4ish 29.09.09 20:40 Сейчас в теме
17. Gleb K. 30.09.09 14:06 Сейчас в теме
Всем привет. А я себе сделал вот так.
У меня учитывается мультивыделение, наличие скрытых строк и/или столбцов, плюс парочка проверок "на дурака".

[1C-CODE]Процедура ТДПриАктивизацииОбласти(Элемент)
	Сумма = 0;
	Для Каждого Область из ЭлементыФормы.ТД.ВыделенныеОбласти Цикл
		Если Не Область = Неопределено И НЕ (Область.Верх = 0 И Область.Низ = 0) И НЕ (Область.Лево = 0 И Область.Право = 0) Тогда
		Для i = Область.Верх по Область.Низ Цикл
			Для j = Область.Лево по Область.Право Цикл
				Ячейка = ЭлементыФормы.ТД.Область(i,j);
				Если Ячейка.СодержитЗначение
					И Ячейка.Видимость
					И Ячейка.ТипЗначения = Новый ОписаниеТипов("Число")
					И Не Ячейка.Значение = Неопределено Тогда
					Сумма = Сумма + Ячейка.Значение;
				КонецЕсли;
			КонецЦикла;
		КонецЦикла;
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры
Показать
[/1C-CODE]
director04; +1 Ответить
18. Evg-Lylyk 2723 30.09.09 15:46 Сейчас в теме
(17) метод сабжа более оптимален почитайте внимательно и посмотрите код
19. Evg-Lylyk 2723 30.09.09 16:09 Сейчас в теме
(17)
"Если Не Область = Неопределено И НЕ (Область.Верх = 0 И Область.Низ = 0) И НЕ (Область.Лево = 0 И Область.Право = 0) Тогда"
Нужно только "Если Не Область = Неопределено" и то не знаю пример когда
Во внутреннем условии тоже не все условия нужны
Строка 100 не будет суммироваться, что как мне кажется, неправильно.

Видимо волна материалов захлестнула инфостарт и все ждут примитивизма, а вот фиг :) это не ко мне
20. Gleb K. 01.10.09 13:06 Сейчас в теме
(18, 19) Если Не Область = Неопределено возникает когда щелкаешь мышью между заголовков колонок или строк.
С внутренними условиями я перемудрил, у вас лучше.
На счет 100 строки не понял.
А вот скрытые ячейки у вас будут суммироваться, что правильно, но не логично :) Хотя это зависит от процедуры вызывающей функцию ВычислитьСуммуОбласти.
21. Evg-Lylyk 2723 01.10.09 15:45 Сейчас в теме
(20) Я имел ввиду что строка "100" не будет суммироваться т.к. имеет Тип("Строка")
На счет скрытых ячеек поправил так логичные (не подумал)
22. artbear 1165 01.10.09 17:26 Сейчас в теме
(21) Пробовал писать ПолучитьЧислоИзСтроки(Текст) без блока Попытка-Исключение ?
ИМХО должно быть быстрее.
23. Evg-Lylyk 2723 01.10.09 18:58 Сейчас в теме
(22) Рад тебя слышать. Конечно быстрее, а что с ошибками делать
34. artbear 1165 02.10.09 09:38 Сейчас в теме
(23) Я к тому, что может быть быстрее вместо Попытки анализировать первый символ - если это цифра, то суммировать.
Также сначала можно использовать СокрЛ (не СокрЛП)
или вообще регулярным выражением проверить :)
36. Ish_2 1044 04.10.09 20:41 Сейчас в теме
(34) Странно.
Пусть текст ячейки начинается с цифры и мы начинаем его суммировать без попытки. В этом случае пользователь получит сообщение об ошибке, если в тексте ячейки - " 1 показатель".
Хрен редьки не слаще.
Применение ВК для подсчета сумм тоже смотрится , на мой взгляд, диковато.
Думаю ,при практическом применении ,например ,в бухгалтерских отчетах скорость подсчета мало существенна. Неоходим лишь быстро вычисляемоый грубый подсчет количества ячеек в выделенных ячейках. И ограничение на их количество.
24. Ish_2 1044 01.10.09 19:45 Сейчас в теме
Несколько выделенных областей могут имет непустое пересечение .
В этом случае подсчет сумм будет неверным.
Я правильно понял ?
28. Evg-Lylyk 2723 01.10.09 22:58 Сейчас в теме
(24) должно нормально отрабатывать кэш для каждой отдельно
29. Ish_2 1044 01.10.09 23:03 Сейчас в теме
(28) Не понял.
Если две выделенные области имеют пересечение (т.е. общие ячейки) , то эти ячейки будут просуммированы дважды :
сначала в одной выделенной области , потом в другой.
25. Ish_2 1044 01.10.09 21:22 Сейчас в теме
В строке функции :
ОдиночнаяОбласть = ТабличныйДокумент.Область(ЯчВерт,ЯчГориз)
приведено неверное обращение к ячейке.
Правильным обращением при суммировании ячеек будет
ОдиночнаяОбласть = 
ТабличныйДокумент.Область(ЯчВерт,ЯчГориз,ЯчВерт,ЯчГориз)

При обращении к области по двум координатам можно получить не одинарную , а ячейку , которая объединяет несколько ячеек (объединенная ячейка). Подсчет сумм в этом случае будет неверным.
Evg-Lylyk; +1 Ответить
26. Ish_2 1044 01.10.09 22:46 Сейчас в теме
Не приводит к неправильно вычисленной сумме и обращение к ячейке , используемое в Бухгалтерии КОРП ("R..C..").
27. Evg-Lylyk 2723 01.10.09 22:57 Сейчас в теме
(26) Спасибо понял поправлю ... по мне лучше ТабличныйДокумент.Область(ЯчВерт,ЯчГориз,ЯчВерт,ЯчГориз)
30. Ish_2 1044 01.10.09 23:07 Сейчас в теме
+28 Я налетел на этот эффект у себя в теме , где используется не одиночное выделение ячейки в табличном документе , а множественное выделение : "строка" или "крест".
31. Evg-Lylyk 2723 01.10.09 23:11 Сейчас в теме
(30) да т.к. это две разные выделенные области.
32. Evg-Lylyk 2723 01.10.09 23:13 Сейчас в теме
31+ будут показываться сумма каждой выделенной области + сумма
33. elizarovs 76 02.10.09 09:22 Сейчас в теме
(+) Классно! Еще бы в форме документа такое сделать...
35. Evg-Lylyk 2723 02.10.09 12:23 Сейчас в теме
(33) добавить можно в любую форму с ТабДок это пример
(34) Это проверено еще на консоли медленнее, регуляры так вообще. Вариан описан в p.s. нужно функции ВычислитьСуммуОбласти, ПолучитьЧислоИзСтроки реализовать через ВК должно быть быстрее
40. elizarovs 76 24.11.09 11:39 Сейчас в теме
(35) Вот именно, с ТабДок, а там везде ТЗ. А у ТЗ нет события ПриАктивизацииОбласти, как и объекта ВыделенныеОбласти.
41. Evg-Lylyk 2723 25.11.09 00:59 Сейчас в теме
(40) В ТЗ нельзя выделить одну ячейку в Колонке1 Строке1 и одну ячейку в Колонке2 Строке2 только построчно.
42. elizarovs 76 25.11.09 06:55 Сейчас в теме
(41) Похоже, что так, во всяком случае я не нашёл описания такой возможности или примера. Хотя, если поставить в свойствах выделения строки - Ячейка, а в режиме выделения - множественное, то в форме прекрасно выделяются ячейки в любой комбинации. Выцепить же список выделенных ячеек из кода я не смог. Може кто поможет? Ну очень нужного свойства в 1С не хватает (сумма группы выделенных ячеек)...
43. Evg-Lylyk 2723 25.11.09 12:41 Сейчас в теме
(42) опиши когда это нужно (я даже не представляю примера)
44. elizarovs 76 26.11.09 09:21 Сейчас в теме
(43) Большая организация, несколько подразделений и даже несколько баз данных оперативного учета. В базу бухгалтерии сливаются все документы из первичных баз. Любимое занятие бухов - сравнивать документы по наличию и по суммам. Открывают журнал, берут калькулятор и строчат, как из пулемёта. А так бы просто мышкой потыкали. Думаю, можно много ситуаций похожих найти.
Другой пример (реальный). На фирме, на базе 1С, стоит система, в которой итого по документу не сходится с итого по таблице. Не говорю, что это правильно, но так получилось. А я пытаюсь разгрести... Приходится вываливать каждый раз в список, чтобы сложить
45. Evg-Lylyk 2723 26.11.09 15:51 Сейчас в теме
(44) как сделать подобное в ТЗ, ТЧ не представляю. Может поможет: для сравнения данных есть СравнениеФайлов очень полезная вещь
37. zag2art 12.10.09 19:31 Сейчас в теме
А чем это лучше чем выделить группу ячее и нажать M+ в калькуляторе 8.1?
38. Evg-Lylyk 2723 13.10.09 17:43 Сейчас в теме
(37) тем что не надо ничего нажимать плюс можно среднее посчитать или еще чтото
про М+ мало кто знает
39. banne 36 03.11.09 05:01 Сейчас в теме
46. kate123 28.01.10 13:18 Сейчас в теме
Спасибо за обработку, очень полезная функция. Подскажите, пожалуйста, как сделать подсчет для табличного поля документа. Для ТЧ документа нет "ПриАктивизацииОбласти",также нет свойства ВыделеннаяОбласть. Куда и как правильно прописать?
47. Evg-Lylyk 2723 28.01.10 13:46 Сейчас в теме
(46) Для ТЧ не получится. Почитайте внимательно комментарии этот вопрос поднимали.
48. tango 484 28.01.10 13:47 Сейчас в теме
ну, не знаю.
открыли калькулятор.
выделили область.
нажали кнопку.
чем встроеная фича хуже всей этой возни?
Прикрепленные файлы:
49. Evg-Lylyk 2723 28.01.10 14:02 Сейчас в теме
(48) Потому что автоматически и не надо ничего нажимать
Вы не первый почитайте комментарии
Даже 1С решили что это нужно и в Бух. КОРП сделали в шаблонах отчетов эту функцию
50. Ish_2 1044 28.01.10 14:08 Сейчас в теме
(48),(49) И в скоро выходящей на замену 1.6 новой версии БП 2.0 предусмотрен этот функционал.

И получается , Миша, что автор предвосхитил появление такого функционала в типовых конфигурациях.
51. tango 484 28.01.10 14:18 Сейчас в теме
или содрал в КОРПе :). Гоша.
52. Evg-Lylyk 2723 28.01.10 17:30 Сейчас в теме
55. zba 48 28.12.12 09:19 Сейчас в теме
В управляемой форме не побывал сделать, а то чета там данная функция не работает
56. tamaks 109 10.12.13 18:00 Сейчас в теме
Использовал представленые в публикации процедуры для выгрузки привязаных фото для выделеной пользователем в отчете номенклатуры. Сформировал отчет - выделил строки с наименованием номенклатуры - нажал выгрузить фото.
57. le0nard 25.12.15 23:37 Сейчас в теме
вот чуть измененная из типовой, скрытые не учитывает.

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

Вакансии

Руководитель проектов 1С
Санкт-Петербург
Полный день

Программист 1С
Новосибирск
зарплата от 80 000 руб. до 150 000 руб.
Полный день

Консультант-аналитик 1С
Москва
зарплата от 40 000 руб. до 120 000 руб.
Полный день

Программист 1С
Красноярск
зарплата от 50 000 руб.
По совместительству

Бизнес-архитектор 1С, ведущий консультант
Санкт-Петербург
Полный день