Как правильно удалить строку в табличной части документа 1С?

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

При разработке обработок или механизмов автоматизации в 1С часто возникает задача программного удаления строк из табличной части (ТЧ) документа. Многие начинающие разработчики сталкиваются с ошибками при использовании методов Получить или некорректной итерации по коллекции. Давайте разберем, почему возникают такие проблемы и как их правильно решить.

Разбор типичной ошибки

Основная проблема в исходном коде автора заключалась в попытке использовать метод Получить() для табличной части. Важно помнить, что ТЧ.Получить(Индекс) ожидает на вход целочисленный индекс (порядковый номер строки), а не ссылку или объект. Попытка передать туда идентификатор (ссылку на БП) приводит к логической ошибке или сбою выполнения программы.

Решение №1: Поиск по структуре и удаление по индексу

Если вам нужно удалить одну или несколько строк, отвечающих определенным критериям, лучше всего использовать метод НайтиСтроки(). Этот метод позволяет отобрать все строки, соответствующие переданным параметрам, а затем безопасно удалить их из коллекции.

Рассмотрим, как это сделать по шагам:

  1. Получаем объект документа.
  2. Формируем структуру поиска, где ключом является имя колонки, а значением — искомый идентификатор.
  3. Находим массив строк с помощью НайтиСтроки().
  4. В цикле определяем индекс каждой найденной строки и удаляем её из табличной части.

Для каждого Строка Из Данные Цикл
    ДокОбъект = Строка.СсылкаНаДокумент.ПолучитьОбъект();
    СтрокиТЧ = ДокОбъект.ТранспортныеУслуги.НайтиСтроки(Новый Структура("ПолеТЧ_СоСсылкой", Строка.СсылкаНаБП));
    Для каждого СтрокаТЧ из СтрокиТЧ Цикл
        ИндексСтроки = ДокОбъект.ТранспортныеУслуги.Индекс(СтрокаТЧ);
        ДокОбъект.ТранспортныеУслуги.Удалить(ИндексСтроки);
    КонецЦикла;
    ДокОбъект.ОбменДанными.Загрузка = Истина;
    ДокОбъект.Записать();
КонецЦикла;

Решение №2: Использование метода Загрузить() для массового удаления

Если необходимо удалить большую часть строк или выполнить сложный отбор, метод Загрузить() будет наиболее производительным. Вместо того чтобы «дёргать» объект и искать каждую строку по отдельности, мы можем выбрать запросом только те данные, которые должны остаться, и перезаписать всю табличную часть целиком.

Алгоритм действий:

  1. Создаем запрос, который выбирает все нужные данные из ТЧ, исключая те, что подлежат удалению.
  2. Выполняем запрос и выгружаем результат в таблицу значений.
  3. Используем метод Загрузить() у табличной части объекта.

// Внутри цикла обработки документов:
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ * ИЗ Документ.ТТН.ТранспортныеУслуги 
               |ГДЕ Ссылка = &СсылкаТТН И ПолеТЧ_СоСсылкой <> &СсылкаНаБП";
Запрос.УстановитьПараметр("СсылкаТТН", Строка.СсылкаНаДокумент);
Запрос.УстановитьПараметр("СсылкаНаБП", Строка.СсылкаНаБП);

ДокОбъект.ТранспортныеУслуги.Загрузить(Запрос.Выполнить().Выгрузить());
ДокОбъект.ОбменДанными.Загрузка = Истина;
ДокОбъект.Записать();

Важные рекомендации по оптимизации

При работе с коллекциями и объектами 1С, учитывайте следующие важные нюансы:

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

← На главную