Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Удаление выделенной программно строки таблицы

Удаление выделенной программно строки таблицы
Я
   kassbar
 
21.10.21 - 22:49
Платформа 8.3 (8.3.17.2256), управляемые формы.
В событии ПередУдалением для таблицы формы "Состав" впишем такой код:
&НаКлиенте
Процедура СоставПередУдалением(Элемент, Отказ)
ВсегоСтрок = Объект.Состав.Количество();
Элемент.ВыделенныеСтроки.Добавить(Объект.Состав[ВсегоСтрок-1].ПолучитьИдентификатор()); //программно добавим к выделенным пользователем строкам еще одну, допустим это будет последняя строка в таблице.
ВыделенныеСтрокиКоличество = Элемент.ВыделенныеСтроки.Количество();
Пока ВыделенныеСтрокиКоличество - 1 >= 0 Цикл //теперь удаляем все наши выделенные строки в цикле
    ВыделеннаяСтрока = Элементы.Состав.ВыделенныеСтроки[0];
    НайденнаяСтрока = Объект.Состав.НайтиПоИдентификатору(ВыделеннаяСтрока);
    Объект.Состав.Удалить(НайденнаяСтрока); //из массива выделенных строк удаляются как первая строка (это нормально) так и наша добавленная строка (почему?)
    ВыделенныеСтрокиКоличество = ВыделенныеСтрокиКоличество - 1;
КонецЦикла;
КонецПроцедуры

Отчего программно выделенная строка вне очереди удаляется из массива выделенных строк тут: Объект.Состав.Удалить(НайденнаяСтрока)
Пробовал на разных платформах, результат не меняется.
Да, я могу решить эту задачу по-другому, но интересна сама причина почему это происходит.
   acht
 
1 - 21.10.21 - 22:55
А какой вообще результат ожидается?
Добавить строку в массив, удалить все строки из массива ее и удивиться, что она действительно удалилась?

Да еще и не выставив отка , тем самым разрешив стандартную обработку - удаление уже неизвестно какой строки и снос выделения.
   kassbar
 
2 - 21.10.21 - 23:01
(1) ожидается что будет работать точно также, как если бы пользователь выделил одновременно первую и последнюю строку и нажал "удалить".
По сути вся разница в том, что мы делаем это вместо пользователя.
Удали строку Элемент.ВыделенныеСтроки.Добавить(..) - и вуаля, все работает отменно.
   acht
 
3 - 21.10.21 - 23:05
(2) Как ведет себя платформа по окончанию выполнения обработчика ПередУдалением ?
   kassbar
 
4 - 21.10.21 - 23:11
(3) это код из типовой конфы, все работает как часы.
От меня добавлена только строка Элемент.ВыделенныеСтроки.Добавить(..), что казалось бы абсолютно то же самое, как если бы пользователь сам ее выделил.
Однако результат неожиданный
   acanta
 
5 - 22.10.21 - 01:31
Ок.Вы добавили перед удалением в массив. А дальше зачем? После вашей процедуры массив, попавший в стандартную процедуру что содержит?
   Ёпрст
 
6 - 22.10.21 - 01:57
(0) Потому, что коллекция массив не упорядочена, и её порядок не гарантирован при добавлении чего-либо при обходе.
   hhhh
 
7 - 22.10.21 - 04:37
(4) а как добавляете? Может вы номер строки туда лепите, а надо идентификатор
   kassbar
 
8 - 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];

ВыделеннаяСтрока = Элементы.Состав.ВыделенныеСтроки[ВыделенныеСтрокиКоличество ];
   acht
 
12 - 22.10.21 - 10:16
(9) Это сам (указатель на) массив только для чтения. К содержимому массива это не относится.
   kassbar
 
13 - 22.10.21 - 10:25
(11) Это не я, так типовой код работает и его нет возможности корректировать.
Я только программно выделяю строки в своем расширении, добавляя к массиву выделенных пользователем нужные мне строки (если нужен контекст задачи, речь об автоматическом удалении логически связанных друг с другом строк).
Код выше - это максимальная выжимка, из которой убрано все лишнее.
   Ёпрст
 
14 - 22.10.21 - 10:27
(13) бред то не пиши, если ты изменил процу в (0) в части добавления строки в коллекцию выделенных строк, то как это " нет возможности корректировать." ???
   kassbar
 
15 - 22.10.21 - 10:28
(14) ты за расширения что-то слышал вообще ?
   Ёпрст
 
16 - 22.10.21 - 10:36
(15) а ты за Отказ = Истина в коде ? Посмотрел в (0)
Нахрена в ПередУдалением делать УдалитьЮ, чтоб попасть туда же..
   kassbar
 
17 - 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
Посмотрел у себя, у меня есть в коде добавление в коллекцию выделенныестроки строк, и всё работает.
   kassbar
 
20 - 25.10.21 - 15:55
(19) ты взял код из (0) и у тебя платформа не выдает ошибок при его выполнении ? какая стоит платформа ?
или же взял какой-то свой код и в нем что-то там работает ?

Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.