Почему программно выделенные строки удаляются некорректно в управляемых формах 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В процессе разработки на платформе 1С:Предприятие 8.3 часто возникает необходимость программно расширить область удаления строк в таблице формы. Казалось бы, логика проста: в обработчике ПередУдалением мы добавляем идентификатор дополнительной строки в массив ВыделенныеСтроки и ожидаем, что стандартный механизм удаления обработает этот расширенный список. Однако на практике мы сталкиваемся с непредсказуемым поведением: строки удаляются «вне очереди», либо происходит сбой циклов обхода коллекции.

Давайте подробно разберем, почему это происходит и как правильно реализовать подобный функционал.

Причина возникновения проблемы

Основная сложность заключается в том, что ВыделенныеСтроки в управляемой форме — это не просто массив данных в памяти. Это специализированная, «живая» коллекция платформы, которая неразрывно связана с состоянием визуального элемента управления на форме.

Когда вы выполняете команду Объект.Состав.Удалить(НайденнаяСтрока) прямо в процессе обхода коллекции ВыделенныеСтроки, происходит следующее:

  1. Платформа пересчитывает визуальное состояние таблицы.
  2. Внутренние индексы коллекции ВыделенныеСтроки перестраиваются, так как удаление элемента физически изменяет состав таблицы данных.
  3. Возникает конфликт: ваш программный код ожидает стабильного набора идентификаторов, но «живая» коллекция реагирует на изменение данных, пытаясь синхронизировать UI, что приводит к «схлопыванию» или потере элементов в массиве.

Как реализовать корректное удаление строк

Чтобы избежать ошибок при удалении связанных или программно выбранных строк, мы рекомендуем отойти от попыток манипуляции коллекцией ВыделенныеСтроки внутри стандартного процесса. Вместо этого следует перехватить процесс удаления полностью.

Рассмотрим пошаговую стратегию решения:

  1. Установите Отказ = Истина в событии ПередУдалением. Это предотвратит стандартный вызов удаления платформой, который конфликтует с вашей логикой.
  2. Соберите все необходимые идентификаторы строк, которые должны быть удалены, в отдельный массив или список.
  3. Выполните удаление строк из объекта Объект.ИмяТаблицы вручную.

Важный совет: при программном удалении строк из табличной части всегда выполняйте обход коллекции с конца в начало. Это позволит избежать «сдвига» индексов, который неизбежно приводит к ошибкам, если вы начинаете удаление с первого элемента.

Пример реализации безопасного удаления

Посмотрим на пример кода, который корректно обрабатывает задачу удаления группы строк:


// Предположим, что мы определили набор строк для удаления
МассивСтрокДляУдаления = Элементы.Автоработы.ВыделенныеСтроки;

// Если нам нужно добавить свои строки, делаем это ДО начала удаления
// и сохраняем идентификаторы в массив

Для каждого Идентификатор Из МассивСтрокДляУдаления Цикл
    НайденнаяСтрока = Объект.Автоработы.НайтиПоИдентификатору(Идентификатор);
    
    // Выполняем проверки бизнес-логики
    Если ПроверкаУдаления(НайденнаяСтрока) Тогда
        // Удаление с использованием найденного объекта строки
        Объект.Автоработы.Удалить(НайденнаяСтрока);
    КонецЕсли;
КонецЦикла;

Почему лучше не менять коллекцию напрямую?

Попытки программного изменения ВыделенныеСтроки в процессе удаления являются «костылем», так как платформа не гарантирует порядок элементов при обходе коллекции, если она модифицируется в цикле. Архитектурно правильный подход заключается в том, чтобы:

Следуя этим рекомендациям, вы сделаете код стабильным, предсказуемым и легко поддерживаемым, избежав неприятных сюрпризов, связанных с асинхронным обновлением UI-коллекций платформы 1С.

← На главную