|
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) Кастомная система расчёта зарплаты, форма периодического (недельного) графика работ, визуальное представление в виде месяца. Когда бегаем по месяцам взад-вперёд, таблица для отображения раскладки на месяц постоянно перезаполняется.
|
|
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший