В процессе разработки на платформе 1С:Предприятие 8.3 часто возникает необходимость программно расширить область удаления строк в таблице формы. Казалось бы, логика проста: в обработчике ПередУдалением мы добавляем идентификатор дополнительной строки в массив ВыделенныеСтроки и ожидаем, что стандартный механизм удаления обработает этот расширенный список. Однако на практике мы сталкиваемся с непредсказуемым поведением: строки удаляются «вне очереди», либо происходит сбой циклов обхода коллекции.
Давайте подробно разберем, почему это происходит и как правильно реализовать подобный функционал.
Основная сложность заключается в том, что ВыделенныеСтроки в управляемой форме — это не просто массив данных в памяти. Это специализированная, «живая» коллекция платформы, которая неразрывно связана с состоянием визуального элемента управления на форме.
Когда вы выполняете команду Объект.Состав.Удалить(НайденнаяСтрока) прямо в процессе обхода коллекции ВыделенныеСтроки, происходит следующее:
ВыделенныеСтроки перестраиваются, так как удаление элемента физически изменяет состав таблицы данных.Чтобы избежать ошибок при удалении связанных или программно выбранных строк, мы рекомендуем отойти от попыток манипуляции коллекцией ВыделенныеСтроки внутри стандартного процесса. Вместо этого следует перехватить процесс удаления полностью.
Рассмотрим пошаговую стратегию решения:
Отказ = Истина в событии ПередУдалением. Это предотвратит стандартный вызов удаления платформой, который конфликтует с вашей логикой.Объект.ИмяТаблицы вручную.Важный совет: при программном удалении строк из табличной части всегда выполняйте обход коллекции с конца в начало. Это позволит избежать «сдвига» индексов, который неизбежно приводит к ошибкам, если вы начинаете удаление с первого элемента.
Посмотрим на пример кода, который корректно обрабатывает задачу удаления группы строк:
// Предположим, что мы определили набор строк для удаления
МассивСтрокДляУдаления = Элементы.Автоработы.ВыделенныеСтроки;
// Если нам нужно добавить свои строки, делаем это ДО начала удаления
// и сохраняем идентификаторы в массив
Для каждого Идентификатор Из МассивСтрокДляУдаления Цикл
НайденнаяСтрока = Объект.Автоработы.НайтиПоИдентификатору(Идентификатор);
// Выполняем проверки бизнес-логики
Если ПроверкаУдаления(НайденнаяСтрока) Тогда
// Удаление с использованием найденного объекта строки
Объект.Автоработы.Удалить(НайденнаяСтрока);
КонецЕсли;
КонецЦикла;
Попытки программного изменения ВыделенныеСтроки в процессе удаления являются «костылем», так как платформа не гарантирует порядок элементов при обходе коллекции, если она модифицируется в цикле. Архитектурно правильный подход заключается в том, чтобы:
НайтиПоИдентификатору() для получения ссылки на строку данных.Объект.ИмяТабличнойЧасти), а не с визуальными элементами формы.Элементы.ИмяТаблицы.Обновить().Следуя этим рекомендациям, вы сделаете код стабильным, предсказуемым и легко поддерживаемым, избежав неприятных сюрпризов, связанных с асинхронным обновлением UI-коллекций платформы 1С.