|
Удаление выделенной программно строки таблицы | ☑ | ||
---|---|---|---|---|
0
kassbar
21.10.21
✎
22:49
|
Платформа 8.3 (8.3.17.2256), управляемые формы.
В событии ПередУдалением для таблицы формы "Состав" впишем такой код: &НаКлиенте Процедура СоставПередУдалением(Элемент, Отказ) ВсегоСтрок = Объект.Состав.Количество(); Элемент.ВыделенныеСтроки.Добавить(Объект.Состав[ВсегоСтрок-1].ПолучитьИдентификатор()); //программно добавим к выделенным пользователем строкам еще одну, допустим это будет последняя строка в таблице. ВыделенныеСтрокиКоличество = Элемент.ВыделенныеСтроки.Количество(); Пока ВыделенныеСтрокиКоличество - 1 >= 0 Цикл //теперь удаляем все наши выделенные строки в цикле ВыделеннаяСтрока = Элементы.Состав.ВыделенныеСтроки[0]; НайденнаяСтрока = Объект.Состав.НайтиПоИдентификатору(ВыделеннаяСтрока); Объект.Состав.Удалить(НайденнаяСтрока); //из массива выделенных строк удаляются как первая строка (это нормально) так и наша добавленная строка (почему?) ВыделенныеСтрокиКоличество = ВыделенныеСтрокиКоличество - 1; КонецЦикла; КонецПроцедуры Отчего программно выделенная строка вне очереди удаляется из массива выделенных строк тут: Объект.Состав.Удалить(НайденнаяСтрока) Пробовал на разных платформах, результат не меняется. Да, я могу решить эту задачу по-другому, но интересна сама причина почему это происходит. |
|||
1
acht
21.10.21
✎
22:55
|
А какой вообще результат ожидается?
Добавить строку в массив, удалить все строки из массива ее и удивиться, что она действительно удалилась? Да еще и не выставив отка , тем самым разрешив стандартную обработку - удаление уже неизвестно какой строки и снос выделения. |
|||
2
kassbar
21.10.21
✎
23:01
|
(1) ожидается что будет работать точно также, как если бы пользователь выделил одновременно первую и последнюю строку и нажал "удалить".
По сути вся разница в том, что мы делаем это вместо пользователя. Удали строку Элемент.ВыделенныеСтроки.Добавить(..) - и вуаля, все работает отменно. |
|||
3
acht
21.10.21
✎
23:05
|
(2) Как ведет себя платформа по окончанию выполнения обработчика ПередУдалением ?
|
|||
4
kassbar
21.10.21
✎
23:11
|
(3) это код из типовой конфы, все работает как часы.
От меня добавлена только строка Элемент.ВыделенныеСтроки.Добавить(..), что казалось бы абсолютно то же самое, как если бы пользователь сам ее выделил. Однако результат неожиданный |
|||
5
acanta
22.10.21
✎
01:31
|
Ок.Вы добавили перед удалением в массив. А дальше зачем? После вашей процедуры массив, попавший в стандартную процедуру что содержит?
|
|||
6
Ёпрст
22.10.21
✎
01:57
|
(0) Потому, что коллекция массив не упорядочена, и её порядок не гарантирован при добавлении чего-либо при обходе.
|
|||
7
hhhh
22.10.21
✎
04:37
|
(4) а как добавляете? Может вы номер строки туда лепите, а надо идентификатор
|
|||
8
kassbar
22.10.21
✎
09:38
|
(5) пример: в таблице 4 строки.
Если пользователь выделил первую и последнюю строку руками, то при входе в процедуру массив содержит значения "0, 4". И все работает корректно в типовом коде: на каждой итерации удаляется по 1 строке (первой). Потом добавляем наш код, выделяем только первую строку и нажимаем "удалить". При входе в процедуру массив содержит "0", когда отработает наш код в массиве будет уже "0, 4", и на моменте Объект.Состав.Удалить(..) из массива удаляются обе выделенные строки на первом же цикле. Ну и дальше ошибка. |
|||
9
Галахад
гуру
22.10.21
✎
09:53
|
Вообще-то в доке написано:
ВыделенныеСтроки (SelectedRows) Использование: Только чтение. |
|||
10
Ёпрст
22.10.21
✎
10:07
|
(9) в толстом клиенте есть ВыделенныеСтрокиТабличногоПоля...там можно добавлять и т.д.
а в Уф да, видать не завезли |
|||
11
Ёпрст
22.10.21
✎
10:11
|
(0)
А зачем ты всегда первую строку удаляешь ? //ВыделеннаяСтрока = Элементы.Состав.ВыделенныеСтроки[0]; ВыделеннаяСтрока = Элементы.Состав.ВыделенныеСтроки[ВыделенныеСтрокиКоличество ]; |
|||
12
acht
22.10.21
✎
10:16
|
(9) Это сам (указатель на) массив только для чтения. К содержимому массива это не относится.
|
|||
13
kassbar
22.10.21
✎
10:25
|
(11) Это не я, так типовой код работает и его нет возможности корректировать.
Я только программно выделяю строки в своем расширении, добавляя к массиву выделенных пользователем нужные мне строки (если нужен контекст задачи, речь об автоматическом удалении логически связанных друг с другом строк). Код выше - это максимальная выжимка, из которой убрано все лишнее. |
|||
14
Ёпрст
22.10.21
✎
10:27
|
(13) бред то не пиши, если ты изменил процу в (0) в части добавления строки в коллекцию выделенных строк, то как это " нет возможности корректировать." ???
|
|||
15
kassbar
22.10.21
✎
10:28
|
(14) ты за расширения что-то слышал вообще ?
|
|||
16
Ёпрст
22.10.21
✎
10:36
|
(15) а ты за Отказ = Истина в коде ? Посмотрел в (0)
Нахрена в ПередУдалением делать УдалитьЮ, чтоб попасть туда же.. |
|||
17
kassbar
22.10.21
✎
10:48
|
(16) ВыделенныеСтрокиКоличество = Элементы.Автоработы.ВыделенныеСтроки.Количество();
Пока ВыделенныеСтрокиКоличество - 1 >= 0 Цикл ВыделеннаяСтрока = Элементы.Автоработы.ВыделенныеСтроки[0]; НайденнаяСтрока = Объект.Автоработы.НайтиПоИдентификатору(ВыделеннаяСтрока); Если ИспользоватьУчетРабочегоВремени Тогда Если Объект.Автоработы.НайтиСтроки(Новый Структура("ПакетРабот", НайденнаяСтрока.ПакетРабот)).Количество() = 1 Тогда Если НЕ НайденнаяСтрока.СтатусПакета = ПредопределенноеЗначение("Справочник.ВидыСостоянийПакетовРабот.ВРаботе") ИЛИ РазрешитьУдалениеПакетовВРаботе Тогда УдаляемыеПакеты.Добавить(НайденнаяСтрока.ПакетРабот); ИначеЕсли НайденнаяСтрока.СтатусПакета = ПредопределенноеЗначение("Справочник.ВидыСостоянийПакетовРабот.ВРаботе") Тогда ВывестиСообщение( НСтр("ru = 'Пакет работы %1 уже в работе. Ее нельзя удалить так как она одна на пакет.'"), ЭтотОбъект, Отказ,,, НайденнаяСтрока.Авторабота); Возврат; КонецЕсли; КонецЕсли; ИзмененыПакетыРабот = Истина; КонецЕсли; Объект.Автоработы.Удалить(НайденнаяСтрока); ВыделенныеСтрокиКоличество = ВыделенныеСтрокиКоличество - 1; КонецЦикла; |
|||
18
Ёпрст
22.10.21
✎
11:53
|
(17) и где в этом коде добавление выделенной строки ?
И накой делать ВыделенныеСтроки[0] когда коллекция и так доступна через Для каждого ВыделеннаяСтрока Из Элементы.Автоработы.ВыделенныеСтроки В общем, код в топку |
|||
19
Ёпрст
22.10.21
✎
11:53
|
Посмотрел у себя, у меня есть в коде добавление в коллекцию выделенныестроки строк, и всё работает.
|
|||
20
kassbar
25.10.21
✎
15:55
|
(19) ты взял код из (0) и у тебя платформа не выдает ошибок при его выполнении ? какая стоит платформа ?
или же взял какой-то свой код и в нем что-то там работает ? |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |