Разработка и Конфигурация · 9 мин
Как удалить текущую строку табличной части в 1С
Как удалить текущую строку табличной части в 1С: клавиша Delete, команда формы, программные методы Удалить() и Очистить(). Ошибки, права, FAQ для пользователя и разработчика.
Удаление строки табличной части — одна из самых частых операций при работе с документами и справочниками 1С: она нужна и бухгалтеру, исправляющему накладную, и разработчику, пишущему обработку. Способ зависит от того, кто выполняет действие: пользователь в форме документа или программист в коде на встроенном языке.
В пользовательском режиме строка удаляется клавишей Delete, командой контекстного меню или кнопкой на панели таблицы. В коде используются методы коллекции табличной части — Удалить() и Очистить(), а в управляемых формах дополнительно применяются стандартные команды таблицы. Ниже разобраны все варианты с примерами и типичными ошибками.
Удаление строки пользователем в форме документа
Самый простой сценарий: открыт документ (например, «Реализация товаров и услуг»), в табличной части «Товары» есть лишняя позиция. Установите курсор на нужную строку — щелкните по любой её ячейке, чтобы строка стала текущей (подсвечена).
Далее нажмите клавишу Delete на клавиатуре. Платформа либо удалит строку сразу, либо спросит подтверждение — это зависит от настроек конфигурации. Альтернативные варианты: щелчок правой кнопкой мыши по строке и выбор пункта «Удалить», либо кнопка с красным крестиком на командной панели табличной части.
Важный нюанс: клавиша Delete работает только тогда, когда фокус находится на самой таблице, а не внутри поля редактирования. Если вы начали редактировать число в ячейке и нажали Delete — сотрётся символ в поле, а не строка. Сначала завершите редактирование клавишей Enter или Esc, затем нажмите Delete.
- 1Откройте документ и перейдите на вкладку с табличной частью
- 2Щелкните по нужной строке, чтобы она стала текущей
- 3Нажмите Delete, кнопку с красным крестиком или выберите «Удалить» в контекстном меню
- 4Подтвердите удаление, если программа задаст вопрос
- 5Запишите или проведите документ, чтобы изменения сохранились в базе
Почему кнопка удаления может быть недоступна
Если кнопка с крестиком серая, а Delete не срабатывает, причина обычно одна из четырёх. Первая — документ проведён, а конфигурация запрещает редактирование проведённых документов: тогда нужно сначала отменить проведение. Вторая — у пользователя нет прав на изменение этого объекта: проверьте роли в разделе администрирования.
Третья причина — у таблицы в конфигураторе отключено свойство «Изменять состав строк» или установлен режим «Только просмотр». Четвёртая — документ открыт другим пользователем или заблокирован. В этом случае платформа выдаст сообщение о конфликте блокировок при попытке записи.
Программное удаление текущей строки
Разработчику текущая строка доступна через объект формы. В управляемой форме текущую строку табличного поля получают через свойство ТекущаяСтрока элемента формы, а затем находят данные по идентификатору:
&НаКлиенте
Процедура УдалитьТекущуюСтроку(Команда)
Идентификатор = Элементы.Товары.ТекущаяСтрока;
Если Идентификатор = Неопределено Тогда
Возврат;
КонецЕсли;
Объект.Товары.Удалить(Объект.Товары.НайтиПоИдентификатору(Идентификатор));
КонецПроцедуры
Если работа ведётся на сервере или во внешней обработке, где есть объект документа, всё проще — метод Удалить() принимает либо саму строку, либо её индекс (нумерация начинается с нуля):
ДокументОбъект = СсылкаНаДокумент.ПолучитьОбъект();
// Удаление конкретной строки по ссылке на неё
ДокументОбъект.Товары.Удалить(СтрокаТабличнойЧасти);
// Удаление первой строки по индексу
ДокументОбъект.Товары.Удалить(0);
ДокументОбъект.Записать();
После программного удаления обязательно вызовите Записать() у объекта документа — иначе изменения останутся только в памяти и пропадут при закрытии сеанса. В форме документа платформа сама предложит записать при закрытии, но в фоновых процедурах и обработках забытая запись — самая частая причина «неработающего» кода.
ДокументОбъект.Товары.Удалить(СтрокаТабличнойЧасти); // удалить одну строку
ДокументОбъект.Товары.Очистить(); // удалить все строкиУдаление всех строк и удаление по условию
Чтобы удалить не одну, а все строки табличной части, используется метод Очистить(). Он быстрее, чем цикл с удалением каждой строки, и не требует дополнительных проверок: Объект.Товары.Очистить();.
Удаление строк по условию (например, всех с нулевым количеством) — задача с подвохом. Нельзя удалять строки внутри цикла Для Каждого: коллекция изменяется во время обхода, и часть строк будет пропущена. Правильные подходы — обход с конца по индексу либо предварительный сбор строк в массив:
// Вариант 1: обход с конца по индексу
Для Индекс = 1 - Объект.Товары.Количество() По 0 Цикл
Строка = Объект.Товары[-Индекс];
Если Строка.Количество = 0 Тогда
Объект.Товары.Удалить(Строка);
КонецЕсли;
КонецЦикла;
// Вариант 2: сначала собрать, потом удалить
КУдалению = Новый Массив;
Для Каждого Строка Из Объект.Товары Цикл
Если Строка.Количество = 0 Тогда
КУдалению.Добавить(Строка);
КонецЕсли;
КонецЦикла;
Для Каждого Строка Из КУдалению Цикл
Объект.Товары.Удалить(Строка);
КонецЦикла;
Особенности управляемых и обычных форм
В управляемых формах табличная часть хранится в реквизите формы, а к строкам обращаются по идентификаторам через НайтиПоИдентификатору(). Напрямую удалять «по номеру строки» нельзя — номер строки на форме может не совпадать с индексом в коллекции после сортировки или отбора.
В обычных формах (толстый клиент, старые конфигурации) текущую строку даёт свойство ТекущиеДанные элемента формы, и удаление выглядит проще: ЭлементыФормы.Товары.ТекущиеДанные передаётся напрямую в Удалить(). Однако принцип тот же: сначала получить строку, затем вызвать метод коллекции.
Если на форме включён отбор строк (пользователь отфильтровал таблицу), удаление текущей строки всё равно удалит её из основной коллекции — отбор влияет только на отображение. Это стоит учитывать при программной обработке: ТекущиеДанные всегда указывает на реальную строку табличной части.
Что происходит с данными после удаления
Удалённая строка не попадает в корзину и не восстанавливается командой «Отменить» в большинстве форм. Если документ ещё не записан после удаления, можно закрыть его без сохранения — строка вернётся. После записи восстановить строку можно только вручную или из резервной копии.
Если документ проведён, удаление строки и перепроведение изменят движения по регистрам: остатки склада, взаиморасчёты, партии. При включённом механизме удаления движений проведённого документа платформа может потребовать отменить проведение перед редактированием. Также помните, что на удаление строки могут реагировать подписки на события и обработчики записи — например, пересчёт итоговых сумм шапки документа.
Как проверить результат
Строки нет, итоги документа пересчитались
Строка на месте — возможно, фокус был в поле редактирования, а не на таблице
При повторном открытии строки нет
После переоткрытия строка вернулась — документ не был записан
После перепроведения проводки по удалённой строке исчезли
Старые движения остались — документ не перепроведён
Частые вопросы
Можно ли восстановить удалённую строку табличной части?
Штатной «корзины» в 1С нет. Если документ после удаления не записывался — закройте его без сохранения, и строка вернётся. Если записан, строку придётся вводить заново вручную либо восстанавливать документ из резервной копии базы.
Почему Delete не удаляет строку, а стирает текст в ячейке?
Значит, активен режим редактирования ячейки. Нажмите Enter или Esc, чтобы выйти из редактирования, убедитесь, что выделена вся строка, и только затем нажмите Delete. Либо используйте кнопку удаления на командной панели таблицы — она работает независимо от фокуса.
Как удалить строку в проведённом документе?
Сначала отмените проведение кнопкой «Отменить проведение» (или командой в меню «Ещё»), затем удалите строку и проведите документ заново. Учтите, что перепроведение изменит движения по регистрам и может повлиять на отчёты за период.
Чем Удалить() отличается от Очистить()?
Удалить() убирает одну конкретную строку — по ссылке на неё или по индексу. Очистить() удаляет все строки табличной части за один вызов и работает быстрее цикла. Если нужно убрать часть строк по условию, используйте Удалить() с обходом коллекции с конца.
Почему код удаляет не все строки, хотя цикл проходит по всем?
Почти наверняка вы удаляете строки внутри цикла «Для Каждого»: при удалении коллекция сжимается, и итератор перескакивает через строку. Решение — обход по индексу с конца коллекции или предварительный сбор удаляемых строк в массив с последующим удалением.
Можно ли запретить пользователю удалять строки?
Да. На уровне конфигурации у таблицы формы отключается свойство «Изменять состав строк», на уровне прав — настраиваются роли с запретом изменения объекта. Дополнительно можно программно отменять удаление в обработчике «ПередУдалением» табличной части, выводя пользователю пояснение.