Имя: Пароль:
1C
1С v8
8.2 УИ: Растёт индекс выбранной строки для ТаблицыЗначений
0 wisekat
 
26.12.11
20:40
Имеем реквизит формы типа "ТаблицаЗначений", который используется как ПутьКДанным в одноимённой таблице-элементе. По некоторому алгоритму эта ТЗ обновляется в коде команды наподобие следующего:

Перем ТЗ;
ТЗ = РеквизитФормыВЗначение("ТаблицаМесяц");
ТЗ.Очистить();
// заполняем как-то заново ТЗ
ЗначениеВРеквизитФормы(ТЗ, "ТаблицаМесяц");

Если после повторного выполнения данного кода пытаюсь обратиться в событии Выбор для таблицы к выбранной строке:

Процедура ТаблицаМесяцВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
   ДатаНачала = ТаблицаМесяц_Даты[ВыбраннаяСтрока][ИмяКолонки];

, получаю ошибку "Индекс находится за границами массива".

Параметр ВыбраннаяСтрока выдаёт значение, отличающееся от требуемого на количество строк, которые находились в предыдущий раз в этой таблице. Т.е. если в таблице до этого было 5 строк, и таблицу заполнили заново, то для первой выделенной строки значение будет уже 5, потом 10 и т.д. - при каждом обновлении значение "накручивается".

Как это побороть?
1 wisekat
 
26.12.11
21:01
После раскопок, как я понял, получается следующее. На самом деле параметр ВыбраннаяСтрока - это то же, что и свойство ТекущаяСтрока. В отладчике оно Число, но это не то же самое что и номер строки на экране!!!

При каждом вызове ЗначениеВРеквизитФормы создаётся новый набор строк в таблице, а ТекущаяСтрока - это согласно синтакс-помощнику на самом деле "Идентификатор текущей строки таблицы". Вот и получается, что строки каждый раз наращивают свой ID ;)

Профессионалы, поправьте меня если я не прав.

Но вообще я "худею" с этой 1С 8.2 УИ ...
2 wisekat
 
26.12.11
21:19
Для любителей кода. Правильно надо было делать так:

Процедура ТаблицаМесяцВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
   Перем НомерТекущейСтроки, ИмяКолонки, ДатаНачала, Форма, ПараметрыФормы;
   
   НомерТекущейСтроки = ТаблицаМесяц.Индекс(ТаблицаМесяц.НайтиПоИдентификатору(ВыбраннаяСтрока));
   
   ДатаНачала = ТаблицаМесяц_Даты[НомерТекущейСтроки][ИмяКолонки];
3 wisekat
 
26.12.11
21:20
Если после обновления таблицы хотите сделать активной текущую строку (она слетает), надо делать так:

Элементы.ТаблицаМесяц.ТекущаяСтрока = ТаблицаМесяц.Получить(НомерТекущейСтроки).ПолучитьИдентификатор();
4 wisekat
 
26.12.11
21:27
Элементы.ТаблицаМесяц.ТекущаяСтрока = ТаблицаМесяц.Получить(НомерТекущейСтроки).ПолучитьИдентификатор();
5 ДенисЧ
 
26.12.11
21:36
по поводу обновления и слетания строки - этому посвящён отдельный раздел в книге по УИ
6 МишельЛагранж
 
26.12.11
22:40
(0) это зачем и где используется все?
7 wisekat
 
27.12.11
12:23
(5) На Главу 3.17 "Работа с таблицей в форме" из книги Радченко, Хрусталевой и сотоварищей намекаете? Вобщем-то, она как раз и дала ключ к разгадке страшной тайны текущей строки таблиц в УИ.
8 wisekat
 
27.12.11
12:26
(6) Кастомная система расчёта зарплаты, форма периодического (недельного) графика работ, визуальное представление в виде месяца. Когда бегаем по месяцам взад-вперёд, таблица для отображения раскладки на месяц постоянно перезаполняется.