|
СКД программное редактирование содержимого табличного поля | ☑ | ||
---|---|---|---|---|
0
Unkas
21.08.13
✎
15:10
|
Продолжаем серию вопросов, генерирующих тонны ненависти )))
Сталкивался ли кто-нибудь с необходимостью программно отредактировать поля табличного поля, уже после вывода отчета (на СКД)? С какой стороны к этому можно подойти вообще? Например, набор данных расшифровки я могу перебрать в цикле и получить программно значения всех полей отчета. Но вот для редактирования полей табличного поля нужна уже другая технология. |
|||
1
serffer
21.08.13
✎
15:25
|
когда реализовывал подобное принял за правило:
- высота выводимых строк отчетов строк 1 строка ТабДок - Первая ячейка строки содержит идентификатор строки Отчета - кешировал соответствие имени области первой ячейки и соответствующим измерениям |
|||
2
Unkas
21.08.13
✎
15:37
|
(1) Расскажи подробнее, пожалуйста:
- в какой процедуре можно поймать ячейки табличного поля для их окольцовывания и кэширования (кстати - что это?) |
|||
3
Defender aka LINN
21.08.13
✎
15:41
|
(0) А что, СКД выводит данные в какой-то другой объект, не в табличный документ?
|
|||
4
Unkas
21.08.13
✎
15:50
|
(0)Нет, насколько я знаю все по прежнему. А где вы взяли этот слух?
|
|||
5
Defender aka LINN
21.08.13
✎
16:13
|
Поциент троллит сам себя. Забавно.
|
|||
6
Unkas
21.08.13
✎
16:17
|
(5)тьфу ты, ошибся цифрой - конечно же это был вопрос к вам. Ответите?
|
|||
7
Nexux
21.08.13
✎
16:22
|
делать расшифровку для каждой ячейки табличного документа, сохраняя соотвествие имяячейки - структура этих параметров (значения ресурсов получить нельзя, только если делать через внешнюю таблицу набор и применять фильтр), но это будет очень долго для всех ячеек
|
|||
8
zladenuw
21.08.13
✎
16:23
|
(6) а кто мешает в таблицу значений выгрузить ?
|
|||
9
Nexux
21.08.13
✎
16:23
|
редактируется поле в табличном документе - по имение ячеек можно поменять это значение для массива строк таблицы внешнего источника
|
|||
10
Nexux
21.08.13
✎
16:23
|
либо выполнять расшифровку непоредлвенно передредактированием
|
|||
11
Nexux
21.08.13
✎
16:33
|
оп, задумайся надо ли оно тебе)) я такой мурой занимаюсь уже три неделю уже тошнит)
|
|||
12
Defender aka LINN
21.08.13
✎
16:37
|
(6) И поле табличного документа, и табличное поле прекрасно редактируются, независимо от того, чем именно в них выведены данные.
|
|||
13
Unkas
21.08.13
✎
18:04
|
(12) Игнор вопроса. Ну я так сразу и понял, что вы балабол.
(8) Никто не мешает, в принципе - но, с другой стороны, и помощников рядом не наблюдается. (11) Три недели это жесть - на что же ушли такие временные ресурсы? Мне надо - потому что у меня трехмесячный проект по созданию адского отчета, от которого содрогнется мир. Так вот, август кончается, а отчет работает прекрасно за исключением одно колонки, которая почему-то считается неправильно. Так что мне очень надо пройтись по отчету после вывода, рассчитать этот показатель из остальных ресурсов и сдать уже проект. (9) Так а в какой процедуре можно поймать табличное поле, да еще и с перебором по ячейкам? |
|||
14
Nexux
21.08.13
✎
19:20
|
(13)универсальный документ с вводом данных аля эксель, типа поддрежки вычислений по формулам в ячейках
Так а в какой процедуре можно поймать табличное поле, да еще и с перебором по ячейкам? прикомпоновке результата, либо после вывода таличноо документа обходить весь диапазон R и С, либо в обработкарасшифровки табличного документа |
|||
15
Nexux
21.08.13
✎
20:06
|
http://up.ht/18K3IRj вот делать нефиг было пока ехал в электричке)) спрашивай свои ответы
|
|||
16
Nexux
21.08.13
✎
20:22
|
(15) кэш заюзать забыл, но там очевидно) с телефона сложно кодтписать
|
|||
17
Defender aka LINN
22.08.13
✎
06:59
|
(13) Угу. Я оже сразу понял, что ты долбоеб.
|
|||
18
Unkas
22.08.13
✎
14:42
|
(14) Итак, поле табличного документа я поймал. Но проблема в том, что поле табличного документа, как элемент формы - не может быть итератором, то есть его нельзя обойти циклом. Как получить коллекцию для обхода? Например, область там всего одна, т.е. .Области.Количество() = 1;
(15) В чем смысл той обработки? В пользовательском режиме она не открывается. |
|||
19
Unkas
22.08.13
✎
19:14
|
Разобрался!
Обходить ячейки поля табличного документа следует не получением некой коллекции - а используя адреса ячеек, типа: ПолеТД = ЭлементыФормы.Результат; Для R = 1 По мВысотаТаблицы Цикл Для С = 1 По мШиринаТаблицы Цикл ПолеТД.Область("R" + R + "С" + С).Текст = 666; конецЦикла КонецЦикла Вот и всё, текст в ячейках изменяется вполне легко. Nexux, спасибо! |
|||
20
Nexux
23.08.13
✎
11:35
|
(19)ага, только данные не меняются при этом, а так всё ок
|
|||
21
Unkas
23.08.13
✎
12:45
|
(20) В смысле "не меняются данные"? Еще как меняются. Реально текст в ячейках становится таким, каким пожелаем.
И, кстати, достаточно быстро отрабатывает. Таблицу 100х100 обрабатывает за мгновение. |
|||
22
Nexux
23.08.13
✎
12:47
|
ок, круто, пили пример
|
|||
23
Unkas
23.08.13
✎
13:30
|
(22) Пример в (19). Синтаксис именно такой ПолеТабличногоДокумента.Область("R1C1").Текст = "Привет".
Ну если уж так хочешь пример прям из модуля, то пожалста: Процедура ПересчитатьДлительностьОборота() мКоличествоПериодов = Окр( (пКонецПериода - пНачалоПериода)/30.5/24/60/60, 0); ПолеТД = ЭлементыФормы.Результат; НомКолонкаОборотКт = 0; бДлительностьПрисутствует = Ложь; бОборотКтПрисутствует = Ложь; бСальдоКтПрисутствует = Ложь; первыйРазВижуОборот = Истина; первыйРазВижуОстаток = Истина; //узнаем расположение колонок и ширину столбца за период Для С = 1 По ПолеТД.ШиринаТаблицы Цикл адрес = "R5C" + С; Если ПолеТД.Область(адрес).Текст = "Сумма оборот кт" Тогда Если НЕ первыйРазВижуОборот Тогда мШиринаСтолбца = С - НомКолонкаОборотКт; Иначе //если первый раз видим первыйРазВижуОборот = Ложь; ПервНомКолонкаОборотКт = С; КонецЕсли; НомКолонкаОборотКт = С; бОборотКтПрисутствует = Истина; ИначеЕсли ПолеТД.Область(адрес).Текст = "Сумма конечный остаток" Тогда Если первыйРазВижуОстаток Тогда НомКолонкаКонСальдо = С; первыйРазВижуОстаток = Ложь; КонецЕсли; бСальдоКтПрисутствует = Истина; ИначеЕсли ПолеТД.Область(адрес).Текст = "Длительность оборота в днях" Тогда бДлительностьПрисутствует = Истина; НомКолонкаДлительность = С; КонецЕсли; КонецЦикла; Если НЕ бДлительностьПрисутствует ИЛИ НЕ бОборотКтПрисутствует ИЛИ НЕ бСальдоКтПрисутствует ИЛИ мШиринаСтолбца = Неопределено Тогда Возврат ; КонецЕсли; //рассчитываем длительность оборота по данным каждой строки и заменяем текущее значение показателя на расчетное Для R = 6 По ПолеТД.ВысотаТаблицы Цикл текСуммаОборотКт = 0; текСуммаКонОстаток = 0; Для мес = 1 По мКоличествоПериодов Цикл текСуммаОборотКт = текСуммаОборотКт + ПолучитьСуммуЯчейки(ПолеТД, R, ПервНомКолонкаОборотКт + мШиринаСтолбца*(мес-1)); текСуммаКонОстаток = ТекСуммаКонОстаток + ПолучитьСуммуЯчейки(ПолеТД, R, НомКолонкаКонСальдо + мШиринаСтолбца*(мес-1)); КонецЦикла; Если текСуммаОборотКт = 0 Тогда ДлитОборота = пДлительностьИнтервала; ИначеЕсли ТекСуммаКонОстаток = 0 Тогда ДлитОборота = 7; Иначе ДлитОборота = Формат((ТекСуммаКонОстаток/мКоличествоПериодов/ТекСуммаОборотКт)* пДлительностьИнтервала,"ЧДЦ=2"); КонецЕсли; ПолеТД.Область("R" + R + "C" + НомКолонкаДлительность).Текст = ДлитОборота; КонецЦикла; КонецПроцедуры |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |