Имя: Пароль:
1C
1С v8
СКД программное редактирование содержимого табличного поля
,
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" + НомКолонкаДлительность).Текст = ДлитОборота;         
    КонецЦикла;  

КонецПроцедуры
Закон Брукера: Даже маленькая практика стоит большой теории.