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

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

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

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

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

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

Удаление строки пользователем в форме документа

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

Далее нажмите клавишу Delete на клавиатуре. Платформа либо удалит строку сразу, либо спросит подтверждение — это зависит от настроек конфигурации. Альтернативные варианты: щелчок правой кнопкой мыши по строке и выбор пункта «Удалить», либо кнопка с красным крестиком на командной панели табличной части.

Важный нюанс: клавиша Delete работает только тогда, когда фокус находится на самой таблице, а не внутри поля редактирования. Если вы начали редактировать число в ячейке и нажали Delete — сотрётся символ в поле, а не строка. Сначала завершите редактирование клавишей Enter или Esc, затем нажмите Delete.

Порядок действий в форме
  1. 1
    Откройте документ и перейдите на вкладку с табличной частью
  2. 2
    Щелкните по нужной строке, чтобы она стала текущей
  3. 3
    Нажмите Delete, кнопку с красным крестиком или выберите «Удалить» в контекстном меню
  4. 4
    Подтвердите удаление, если программа задаст вопрос
  5. 5
    Запишите или проведите документ, чтобы изменения сохранились в базе

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

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

Третья причина — у таблицы в конфигураторе отключено свойство «Изменять состав строк» или установлен режим «Только просмотр». Четвёртая — документ открыт другим пользователем или заблокирован. В этом случае платформа выдаст сообщение о конфликте блокировок при попытке записи.

Программное удаление текущей строки

Разработчику текущая строка доступна через объект формы. В управляемой форме текущую строку табличного поля получают через свойство ТекущаяСтрока элемента формы, а затем находят данные по идентификатору:

&НаКлиенте

Процедура УдалитьТекущуюСтроку(Команда)

Идентификатор = Элементы.Товары.ТекущаяСтрока;

Если Идентификатор = Неопределено Тогда

Возврат;

КонецЕсли;

Объект.Товары.Удалить(Объект.Товары.НайтиПоИдентификатору(Идентификатор));

КонецПроцедуры

Если работа ведётся на сервере или во внешней обработке, где есть объект документа, всё проще — метод Удалить() принимает либо саму строку, либо её индекс (нумерация начинается с нуля):

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

// Удаление конкретной строки по ссылке на неё

ДокументОбъект.Товары.Удалить(СтрокаТабличнойЧасти);

// Удаление первой строки по индексу

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

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

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

bsl
ДокументОбъект.Товары.Удалить(СтрокаТабличнойЧасти); // удалить одну строку
ДокументОбъект.Товары.Очистить(); // удалить все строки

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

Чтобы удалить не одну, а все строки табличной части, используется метод Очистить(). Он быстрее, чем цикл с удалением каждой строки, и не требует дополнительных проверок: Объект.Товары.Очистить();.

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

// Вариант 1: обход с конца по индексу

Для Индекс = 1 - Объект.Товары.Количество() По 0 Цикл

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

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

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

КонецЕсли;

КонецЦикла;

// Вариант 2: сначала собрать, потом удалить

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

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

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

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

КонецЕсли;

КонецЦикла;

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

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

КонецЦикла;

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

Особенности управляемых и обычных форм

В управляемых формах табличная часть хранится в реквизите формы, а к строкам обращаются по идентификаторам через НайтиПоИдентификатору(). Напрямую удалять «по номеру строки» нельзя — номер строки на форме может не совпадать с индексом в коллекции после сортировки или отбора.

В обычных формах (толстый клиент, старые конфигурации) текущую строку даёт свойство ТекущиеДанные элемента формы, и удаление выглядит проще: ЭлементыФормы.Товары.ТекущиеДанные передаётся напрямую в Удалить(). Однако принцип тот же: сначала получить строку, затем вызвать метод коллекции.

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

Что происходит с данными после удаления

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

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

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

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

Строка исчезла из таблицы на форме
Норма

Строки нет, итоги документа пересчитались

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

Строка на месте — возможно, фокус был в поле редактирования, а не на таблице

Документ записан после удаления
Норма

При повторном открытии строки нет

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

После переоткрытия строка вернулась — документ не был записан

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

После перепроведения проводки по удалённой строке исчезли

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

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

Частые вопросы

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

Штатной «корзины» в 1С нет. Если документ после удаления не записывался — закройте его без сохранения, и строка вернётся. Если записан, строку придётся вводить заново вручную либо восстанавливать документ из резервной копии базы.

Почему Delete не удаляет строку, а стирает текст в ячейке?

Значит, активен режим редактирования ячейки. Нажмите Enter или Esc, чтобы выйти из редактирования, убедитесь, что выделена вся строка, и только затем нажмите Delete. Либо используйте кнопку удаления на командной панели таблицы — она работает независимо от фокуса.

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

Сначала отмените проведение кнопкой «Отменить проведение» (или командой в меню «Ещё»), затем удалите строку и проведите документ заново. Учтите, что перепроведение изменит движения по регистрам и может повлиять на отчёты за период.

Чем Удалить() отличается от Очистить()?

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

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

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

Можно ли запретить пользователю удалять строки?

Да. На уровне конфигурации у таблицы формы отключается свойство «Изменять состав строк», на уровне прав — настраиваются роли с запретом изменения объекта. Дополнительно можно программно отменять удаление в обработчике «ПередУдалением» табличной части, выводя пользователю пояснение.