К статье
Практический материал

Разработка и Конфигурация · 11 мин

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

Способы удаления строк из табличной части документа 1С: вручную в форме, программно через Удалить(), Очистить(), по условию. Примеры кода, ошибки и проверка результата.

Табличная часть документа в 1С — это коллекция строк, хранящая, например, перечень товаров в накладной или начисления в документе по зарплате. Удалять строки приходится и пользователю в форме документа, и разработчику в коде: при очистке документа перед новым заполнением, при отборе позиций по условию, при обработке данных из внешних источников.

Способ удаления зависит от ситуации. Разовая правка вручную делается прямо в форме документа. Массовое или условное удаление удобнее выполнять программно — методами Удалить(), Очистить() или через цикл с обходом строк. Ошибки в коде удаления — одна из частых причин «потерянных» строк и битых данных, поэтому важно понимать, как работает обход коллекции.

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

Удаление строк вручную в форме документа

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

Для удаления нескольких строк выделите их с зажатой клавишей Ctrl (отдельные строки) или Shift (диапазон) и нажмите Delete. Чтобы очистить табличную часть целиком, во многих типовых конфигурациях есть кнопка «Очистить» в меню «Ещё» командной панели таблицы; если её нет — выделите все строки через Ctrl+A и удалите.

После удаления документ нужно записать: до записи изменения существуют только в открытой форме. Если документ проведён, потребуется перепроведение, чтобы движения по регистрам соответствовали новому составу строк.

Как обратиться к табличной части в коде

В модуле объекта или внешней обработке табличная часть доступна как свойство объекта документа по её имени, заданному в конфигураторе. Например, для табличной части «Товары» документа «РеализацияТоваровУслуг» обращение выглядит так: ДокументОбъект.Товары. Это коллекция значений типа «ТабличнаяЧасть», поддерживающая перебор, индексированный доступ и методы добавления и удаления.

Важно различать объект и ссылку. Через ссылку (Документы.РеализацияТоваровУслуг.НайтиПоНомеру(...)) табличную часть можно только прочитать. Для изменения нужно получить объект методом ПолучитьОбъект(), внести изменения и вызвать Записать().

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

Метод Удалить() принимает либо саму строку коллекции, либо её индекс (нумерация с нуля). Типовой фрагмент удаления первой строки:

ДокОбъект = СсылкаНаДокумент.ПолучитьОбъект();

Если ДокОбъект.Товары.Количество() > 0 Тогда

ДокОбъект.Товары.Удалить(0); // по индексу

КонецЕсли;

ДокОбъект.Записать();

Если строка найдена перебором или методом Найти(), её можно передать в Удалить() напрямую:

СтрокаТовара = ДокОбъект.Товары.Найти(НужнаяНоменклатура, "Номенклатура");

Если СтрокаТовара <> Неопределено Тогда

ДокОбъект.Товары.Удалить(СтрокаТовара);

КонецЕсли;

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

Удаление всех строк: метод Очистить()

Когда табличную часть нужно полностью освободить — например, перед повторной загрузкой данных из файла — используется метод Очистить(). Он удаляет все строки за один вызов и работает быстрее, чем цикл с удалением по одной:

ДокОбъект.Товары.Очистить();

ДокОбъект.Услуги.Очистить();

ДокОбъект.Записать();

После Очистить() коллекция продолжает существовать — можно сразу добавлять новые строки через Добавить(). Сам метод не вызывает записи в базу: пока не выполнен Записать(), в данных документа ничего не изменилось.

Удаление строк по условию в цикле

Самая частая задача — удалить строки, удовлетворяющие условию: с нулевым количеством, с определённым складом, с пустой номенклатурой. Здесь кроется классическая ошибка: если удалять строки при прямом переборе «Для Каждого», коллекция сжимается на каждом шаге, и часть строк пропускается.

Надёжный способ — обход с конца коллекции по индексу:

ВсегоСтрок = ДокОбъект.Товары.Количество();

Для Инд = 1 По ВсегоСтрок Цикл

СтрокаТовара = ДокОбъект.Товары[ВсегоСтрок - Инд];

Если СтрокаТовара.Количество = 0 Тогда

ДокОбъект.Товары.Удалить(СтрокаТовара);

КонецЕсли;

КонецЦикла;

Альтернатива без обратного обхода — собрать строки для удаления в отдельный массив, а затем удалить их вторым циклом. Этот вариант нагляднее и удобен, когда условие сложное:

СтрокиКУдалению = Новый Массив;

Для Каждого СтрокаТовара Из ДокОбъект.Товары Цикл

Если Не ЗначениеЗаполнено(СтрокаТовара.Номенклатура) Тогда

СтрокиКУдалению.Добавить(СтрокаТовара);

КонецЕсли;

КонецЦикла;

Для Каждого СтрокаТовара Из СтрокиКУдалению Цикл

ДокОбъект.Товары.Удалить(СтрокаТовара);

КонецЦикла;

1c
// Удаление строк с нулевым количеством, обход с конца
Для Инд = 1 По ДокОбъект.Товары.Количество() Цикл
    СтрокаТовара = ДокОбъект.Товары[ДокОбъект.Товары.Количество() - Инд];
    Если СтрокаТовара.Количество = 0 Тогда
        ДокОбъект.Товары.Удалить(СтрокаТовара);
    КонецЕсли;
КонецЦикла;
ДокОбъект.Записать();

Запись и проведение документа после удаления

После изменения табличной части объект нужно сохранить. Простой вызов Записать() сохраняет документ без проведения. Если документ проведённый и движения должны соответствовать новому составу строк, используйте Записать(РежимЗаписиДокумента.Проведение). При отказе от проведения (например, не хватает остатков на складе) платформа выдаст сообщение, и транзакция не завершится — данные останутся в прежнем состоянии.

Для массовой обработки многих документов полезно оборачивать запись в попытку-исключение и фиксировать ошибки в журнал, чтобы один проблемный документ не прервал всю обработку:

Попытка

ДокОбъект.Записать(РежимЗаписиДокумента.Проведение);

Исключение

ЗаписьЖурналаРегистрации("ОчисткаТЧ", УровеньЖурналаРегистрации.Ошибка, , ,

ОписаниеОшибки());

КонецПопытки;

Порядок действий при программном удалении
  1. 1
    Получите объект документа методом ПолучитьОбъект() по ссылке
  2. 2
    Удалите строки: Удалить() для отдельных или Очистить() для всех
  3. 3
    Вызовите Записать() или Записать(РежимЗаписиДокумента.Проведение)
  4. 4
    Откройте документ в форме и убедитесь, что состав строк соответствует ожиданию
  5. 5
    Проверьте движения документа по регистрам, если он проведён

Типичные ошибки и ограничения

Первая и самая распространённая ошибка — удаление строк в прямом цикле «Для Каждого». Коллекция перестраивается на лету, индексы смещаются, и каждая вторая подходящая строка остаётся на месте. Признак проблемы: после обработки часть строк, удовлетворяющих условию, всё ещё присутствует.

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

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

Типичные ошибки
01
Удаление строк в прямом цикле «Для Каждого» — часть строк пропускается из-за сжатия коллекции
02
Изменение через ссылку без ПолучитьОбъект() — изменения не применяются
03
Пропуск Записать() после удаления — данные в базе остаются прежними
04
Удаление строк в проведённом документе без перепроведения — движения по регистрам расходятся с табличной частью
05
Обращение к строке по устаревшему индексу после удаления — ошибка «Индекс находится за границами массива»

Как проверить результат

После записи откройте документ в пользовательском режиме и визуально сверьте состав строк с ожидаемым. Для программной проверки достаточно перечитать объект и сравнить количество строк: ДокОбъект.Товары.Количество() после записи должно вернуть ожидаемое значение.

Если документ проводится, дополнительно откройте его движения (в форме документа — кнопка перехода к движениям или отчёт «Движения документа») и убедитесь, что записи регистров соответствуют оставшимся строкам. Расхождение состава строк и движений — признак того, что документ записан без перепроведения.

Контрольные точки

Как проверить результат

Количество строк в табличной части
Норма

Совпадает с ожидаемым после записи

Тревожный признак

Строки на месте — не выполнен Записать() или изменялась ссылка, а не объект

Строки, подпадающие под условие удаления
Норма

Отсутствуют полностью

Тревожный признак

Осталась часть строк — удаление шло в прямом цикле

Движения проведённого документа
Норма

Соответствуют оставшимся строкам

Тревожный признак

Движения по старым строкам — документ не перепроведён

FAQ

Можно ли удалить строки табличной части без открытия формы документа?

Да, программно: получите объект через ПолучитьОбъект(), удалите строки методами Удалить() или Очистить() и вызовите Записать(). Форма для этого не нужна, поэтому такой способ подходит для фоновых и массовых обработок.

Почему после удаления в цикле остались строки, которые должны были удалиться?

Потому что коллекция обходилась в прямом порядке. При удалении строки индексы оставшихся смещаются на единицу, и цикл «перепрыгивает» следующую строку. Обходите коллекцию с конца или сначала соберите строки в массив, а затем удаляйте.

Чем отличается Очистить() от удаления всех строк в цикле?

Результат одинаков — пустая табличная часть, но Очистить() выполняется одним вызовом, работает быстрее и исключает ошибки со смещением индексов. Цикл оправдан только при выборочном удалении по условию.

Можно ли восстановить случайно удалённые строки?

Если документ ещё не записан — закройте форму без сохранения, и строки вернутся. После записи восстановление возможно только из архивной копии базы или повторным вводом данных. Поэтому перед массовой очисткой стоит сделать копию.

Удалится ли табличная часть при пометке документа на удаление?

Строки табличной части хранятся вместе с документом и физически удаляются при его окончательном удалении (процедура «Удаление помеченных объектов»). Отдельно удалять строки перед пометкой документа не требуется.

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

Напишите обработку: выберите ссылки запросом, в цикле получайте объект каждого документа, очищайте табличную часть и записывайте. Оберните запись в попытку-исключение, чтобы ошибка в одном документе не прерывала обработку остальных, и выполняйте её сначала на копии базы.

Итог

Что важно запомнить

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