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

Документы и Печать · 9 мин

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

Как удалить строку из табличной части документа в 1С: клавиши Del и Shift+Del, контекстное меню, удаление программно в 1С 8.3, типичные ошибки.

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

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

Ниже разобраны все рабочие способы: от простого нажатия Delete в форме документа до программного удаления строк по условию в 1С 8.3, а также ограничения, с которыми сталкиваются пользователи на практике.

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

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

Альтернатива — контекстное меню: клик правой кнопкой мыши по строке и выбор пункта «Удалить». В тонком клиенте и веб-клиенте тот же пункт доступен через кнопку с изображением крестика на командной панели табличной части (меню «Ещё» → «Удалить», если кнопка скрыта).

После удаления строки документ нужно записать кнопкой «Записать» или «Провести». Пока документ не записан, удаление существует только в открытой форме: если закрыть окно без записи, строка останется в базе.

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

Удаление нескольких строк сразу

Если нужно убрать несколько строк, выделите их группой: зажмите Ctrl и кликайте по строкам, либо выделите диапазон с зажатой клавишей Shift. Затем нажмите Delete — удалятся все выделенные строки.

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

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

Почему строка не удаляется: типичные причины

Клавиша Delete нажата, а строка на месте — ситуация встречается часто. Причины обычно одни и те же, и все они решаются без привлечения программиста.

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

Вторая причина — недостаток прав. Если у пользователя нет права на интерактивное изменение документа, кнопки удаления будут неактивны. Проверить это просто: если недоступны также кнопки «Добавить» и «Записать», проблема в ролях, и вопрос решается с администратором.

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

Кнопка «Удалить» сераяНет интерактивного доступа

Проверить, проведён ли документ и есть ли права на изменение

Строка удаляется, но появляется сноваАвтозаполнение табличной части

Найти механизм перезаполнения и отключить его или менять данные-источник

Delete не реагируетКурсор не в табличной части

Кликнуть именно по ячейке строки, затем повторить удаление

Программное удаление строки в 1С 8.3

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

bsl
Док = СсылкаНаДокумент.ПолучитьОбъект();
Строка = Док.Товары[0]; // первая строка
Док.Товары.Удалить(Строка);
Док.Записать();

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

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

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

Особенности при записи и проведении

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

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

Типичные ошибки при удалении строк

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

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

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

Проверка результата

После удаления строки в интерфейсе контролируйте три вещи: исчезла ли строка из табличной части, пересчитались ли итоговые суммы документа (количество, сумма, НДС) и записался ли документ без ошибок. Если документ проводится — проверьте движения по регистрам через кнопку «Дт/Кт» или отчёт по проводкам.

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

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

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

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

Строки нет после записи и повторного открытия документа

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

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

Итоги документа
Норма

Суммы пересчитаны с учётом удалённой строки

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

Итоги старые — документ не проведён повторно

Движения по регистрам
Норма

Проводки соответствуют новому составу табличной части

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

Движения содержат удалённую позицию — требуется перепроведение

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

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

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

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

Итоговые суммы в шапке пересчитываются при проведении или по кнопке пересчёта, если она предусмотрено конфигурацией. Отмените проведение, удалите строку и проведите документ заново — суммы обновятся.

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

Используйте метод Очистить(): Док.Товары.Очистить(); — затем запишите объект. Это корректнее, чем удалять строки в цикле, и исключает ошибки со смещением индексов.

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

Пометка на удаление применяется к целым объектам (документам, элементам справочников) и обратима. Строка табличной части — не самостоятельный объект, она удаляется физически из документа сразу и без возможности отмены после записи.

Можно ли удалить строку в проведённом документе, не отменяя проведение?

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

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

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

Итог

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

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