Имя: Пароль:
1C
1С v8
УФ. "Текущая строка" сбивается при удалении строки.
, ,
0 cube033
 
15.12.14
12:23
Есть таблица значений на форме, в ней есть, например, 4 строки. Нумерация от 0 до 3. Пользователь заполняет данные в предпоследней строке (номер 2), а дальше строка удаляется по номеру текущей строки. Остается три строки (от 0 до 2). Индексы строк не обновляются. Пользователь заполняет последнюю строку (2), но при попытке удалить текущую строку отладчик показывает номер текущей строки (3). Естественно, удаление проваливается, так как строки с индексом 3 на самом деле нет. Подскажите как совладать с номерами строк.
1 vicof
 
15.12.14
12:24
Наверное, удалять по идентификатору строки.
2 cube033
 
15.12.14
12:35
(1) Какому именно идентификатору? Созданному вручную?
3 vicof
 
15.12.14
12:37
ДанныеФормыЭлементКоллекции.ПолучитьИдентификатор (FormDataCollectionItem.GetID)
ДанныеФормыЭлементКоллекции (FormDataCollectionItem)
ПолучитьИдентификатор (GetID)
Синтаксис:

ПолучитьИдентификатор()
Возвращаемое значение:

Тип: Число.

Описание:

Получает идентификатор для элемента коллекции. Этот идентификатор не привязан к позиции элемента в коллекции.

Доступность:

Тонкий клиент, веб-клиент, сервер, толстый клиент.
4 cube033
 
15.12.14
12:37
Мне кажется в рамках платформы номер строки - это и есть её идентификатор
5 vicof
 
15.12.14
12:39
(4) Тебе кажется
6 cube033
 
15.12.14
12:59
(5) ИДЭлемента = Элементы.ТаСамаяТаблица.ТекущиеДанные.ПолучитьИдентификатор();
Где "Элементы.ТаСамаяТаблица.ТекущиеДанные" имеет тип ДанныеФормыЭлементКоллекции. Для первой строки возвращает 0, для второй строки 1. Т.е. возвращает тот же номер строки. Более того - идентификатор точно так же сбивается при удалении одной из строк.
7 Жан Пердежон
 
15.12.14
13:07
(6) по-моему тут только ты сбиваешься, в СП и (3) специально написали: "...идентификатор не привязан к позиции элемента в коллекции."
8 cube033
 
15.12.14
13:15
(7) Вижу, что написано.
Однако также в (6) написано, что на практике возвращает номер строки в таблице и также сбивается.
9 vicof
 
15.12.14
13:18
(8) Спешл фо ю.
ДанныеФормыКоллекция.НайтиПоИдентификатору (FormDataCollection.FindByID)
ДанныеФормыКоллекция (FormDataCollection)
НайтиПоИдентификатору (FindByID)
Синтаксис:

НайтиПоИдентификатору(<Идентификатор>)
Параметры:

<Идентификатор> (обязательный)

Тип: Число.
Идентификатор строки таблицы.
Возвращаемое значение:

Тип: ДанныеФормыЭлементКоллекции; Неопределено.
Неопределено - элемент не найден.
Описание:

Получает элемент коллекции по идентификатору.

Доступность:

Тонкий клиент, веб-клиент, сервер, толстый клиент.
См. также:

ТаблицаФормы, свойство ВыделенныеСтроки
ТаблицаФормы, свойство ТекущийРодитель
ТаблицаФормы, свойство ТекущаяСтрока
10 Мыш
 
15.12.14
13:37
(0) Надо осознать, что индекс строки и номер строки - это разные сущности.
11 Мыш
 
15.12.14
13:40
Ещё надо осознать, что на форме не таблица значений, а табличное поле. У табличного поля есть источник данных. От типа значения источника данных зависит, будет ли в наличии служебный реквизит "НомерСтроки".
12 cube033
 
15.12.14
13:48
(10) да я бы рад))
Есть метод "ПолучитьИдентификатор()" он поможет мне найти идентификатор. (А не номер строки!!!). Чтобы воспользоваться методом мне нужны данные с типом "ДанныеФормыЭлементКоллекции".
Отладчик твердит мне, что "Элементы.ТаСамаяТаблица.ТекущиеДанные" как раз имеют такой тип. Метод "ПолучитьИдентификатор()" в данном случае возвращает Число точь в точь совпадающее с номером строки.
Более того если пойти обратным путем в схожем направлении "ЭтаФорма.ТаСамаяТаблица.НайтиПоИдентификатору(ТотСамыйИдентификатор)" мы снова получим данные нашей строки.
13 Krabobor
 
15.12.14
13:51
(12)
вот ты упертый)
14 antoneus
 
15.12.14
13:52
(12) теперь удали все строки и добавь парочку новых.
15 cube033
 
15.12.14
14:01
(13) я бы рад - скажите кто-нибудь что-нибудь новое)
Я же расписал результат прошлых советов.
16 Жан Пердежон
 
15.12.14
17:02
(15) смотри как это выглядит со стороны:
ты пощупал ПолучитьИдентификатор() и он у тебя какое-то время совпадал с номером строки; ты, не читая СП, уверовал что это есть суть одно и тоже; потом ты начал проводить манипуляции с ТЧ - перемещать и удалять строки и вдруг: КАРАУЛ, ПАМАГИТЕ, ОНЕ СБИВАЮТСЯ!!1

В общем:
Индекс<>НомерСтроки<>Идентификатор

Надеюсь этот код как-то поможет (удаление выделенных строк на клиенте)

    Для каждого Идентификатор из Элементы.ТаблицаНаФорме.ВыделенныеСтроки цикл
        ТаблицаНаФорме.Удалить(ТаблицаНаФорме.НайтиПоИдентификатору(Идентификатор));    
    КонецЦикла
17 Drac0
 
15.12.14
17:05
(12) Очисти таблицу и заполни снова. И, вуа-ля, индентификатор совсем-совсем не равен индексу и номеру строки.
18 Drac0
 
15.12.14
17:06
+(17) Это две абсолютно разные сущности. То, что они иногда совпадают не значит ничего. Это как часы со стрелкой и компас. Могут иногда показывать в одну сторону, но...
19 cube033
 
16.12.14
07:14
(16) Как это выглядит это с моей стороны.
Я: Не удаляются нормально строки - сбивается номер
Не Я: Бери идентификатор
Я: Что за идентификатор?
Не Я: СП "ПолучитьИдентификатор"
Я: О круто попробую... нифига тот же результат. Я же правильно использую метод?
Не Я: Должно работать!
Я: Не работает. Точно всё правильно?!
Не Я: Должно работать!
Не Я: Пойми - Должно работать!
Не Я: Осознай - Должно работать!
(16)(17)(18) - Номер и Идентификатор могут совпадать!
Это на самом деле нужная информация - так как фраза "Этот идентификатор не привязан к позиции элемента в коллекции"  - не прям супер очевидная. Не зная как работает метод "ПолучитьИдентификатор()" можно предположить, что идентификатор возвращается относительно элементов формы, а не таблицы, так как тип данных: "ДанныеФормыЭлементКоллекции", и тогда значения 0 или 1 говорят, что я просто неправильно его применяю.

(16) Перечитывал СП много раз. Да это разные сущности - я понимаю, только выражены они в моем случае одним типом данных и значением. Да, я увидел бы разницу, если бы удалил/добавил строки, но не подразумевает интерфейс у меня такой функции - все автоматом. Можно конечно добавить кнопки добавление/удаление, но смысл? Ведь в итоге идентификатор дает тот же сбой!!!

(13) я ни разу не отрицал, что это разные сущности и они когда-то примут разные значения.

А теперь решение:
Суть решения в том, то минус на минус дает плюс.
Помогла подсказка (16), а именно кусок кода оказался рабочим.
Если взять тот же пример, то удаление первой строки показывает правильный идентификатор и удаляется правильная строка.
Удаление следующей строки показывает идентификатор за пределами таблицы, но методу НайтиПоИдентификатору() это не мешает и в итоге находится и удаляется верная строка.
20 Chameleon1980
 
16.12.14
07:19
(19) в книгу
21 cube033
 
16.12.14
07:29
(20)Что значит данное устойчивое выражение?
22 Cube
 
16.12.14
07:35
(0) Хоспади, когда тебе уже надоест этот ник?))))
Сделай мини обработку на которой можно воспроизвести ошибку, а то ничего не понятно...