При разработке обработок или механизмов автоматизации в 1С часто возникает задача программного удаления строк из табличной части (ТЧ) документа. Многие начинающие разработчики сталкиваются с ошибками при использовании методов Получить или некорректной итерации по коллекции. Давайте разберем, почему возникают такие проблемы и как их правильно решить.
Основная проблема в исходном коде автора заключалась в попытке использовать метод Получить() для табличной части. Важно помнить, что ТЧ.Получить(Индекс) ожидает на вход целочисленный индекс (порядковый номер строки), а не ссылку или объект. Попытка передать туда идентификатор (ссылку на БП) приводит к логической ошибке или сбою выполнения программы.
Если вам нужно удалить одну или несколько строк, отвечающих определенным критериям, лучше всего использовать метод НайтиСтроки(). Этот метод позволяет отобрать все строки, соответствующие переданным параметрам, а затем безопасно удалить их из коллекции.
Рассмотрим, как это сделать по шагам:
НайтиСтроки().
Для каждого Строка Из Данные Цикл
ДокОбъект = Строка.СсылкаНаДокумент.ПолучитьОбъект();
СтрокиТЧ = ДокОбъект.ТранспортныеУслуги.НайтиСтроки(Новый Структура("ПолеТЧ_СоСсылкой", Строка.СсылкаНаБП));
Для каждого СтрокаТЧ из СтрокиТЧ Цикл
ИндексСтроки = ДокОбъект.ТранспортныеУслуги.Индекс(СтрокаТЧ);
ДокОбъект.ТранспортныеУслуги.Удалить(ИндексСтроки);
КонецЦикла;
ДокОбъект.ОбменДанными.Загрузка = Истина;
ДокОбъект.Записать();
КонецЦикла;
Если необходимо удалить большую часть строк или выполнить сложный отбор, метод Загрузить() будет наиболее производительным. Вместо того чтобы «дёргать» объект и искать каждую строку по отдельности, мы можем выбрать запросом только те данные, которые должны остаться, и перезаписать всю табличную часть целиком.
Алгоритм действий:
Загрузить() у табличной части объекта.
// Внутри цикла обработки документов:
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ * ИЗ Документ.ТТН.ТранспортныеУслуги
|ГДЕ Ссылка = &СсылкаТТН И ПолеТЧ_СоСсылкой <> &СсылкаНаБП";
Запрос.УстановитьПараметр("СсылкаТТН", Строка.СсылкаНаДокумент);
Запрос.УстановитьПараметр("СсылкаНаБП", Строка.СсылкаНаБП);
ДокОбъект.ТранспортныеУслуги.Загрузить(Запрос.Выполнить().Выгрузить());
ДокОбъект.ОбменДанными.Загрузка = Истина;
ДокОбъект.Записать();
При работе с коллекциями и объектами 1С, учитывайте следующие важные нюансы:
ПолучитьОбъект() для одного и того же документа многократно внутри цикла. Если у вас есть список строк для одного документа, сначала соберите их все, а затем совершите одну операцию записи.ОбменДанными.Загрузка = Истина отключает проведение, контроль заполнения и пересчет итогов. Это значительно ускоряет запись, но помните, что вы берете на себя ответственность за целостность данных документа.Элементы.Данные.Удалить()) подходят только для визуального удаления строк в интерфейсе, но не меняют данные самого объекта в базе.Следуя этим методам, вы сможете избежать распространенных ошибок и сделать код вашей обработки более надежным и быстрым.