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

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

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

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

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

Интерактивное удаление стандартно для всех конфигураций на платформе 1С:Предприятие 8: достаточно выделить строку и нажать Delete или кнопку удаления в командной панели таблицы. Программное удаление выполняется методами коллекции табличной части — Удалить() и Очистить(), и требует понимания контекста: на клиенте или на сервере выполняется код, работаем мы с данными формы или с объектом напрямую.

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

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

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

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

Строка исчезает из таблицы сразу, но физически изменение попадёт в базу данных только после записи объекта — кнопкой «Записать» или «Провести». Если закрыть форму без записи, платформа спросит о сохранении изменений; при отказе строка останется в документе.

Порядок действий в режиме 1С:Предприятие
  1. 1
    Откройте документ или элемент справочника и перейдите к нужной табличной части
  2. 2
    Выделите строку кликом мыши (несколько строк — с Ctrl или Shift)
  3. 3
    Нажмите Delete, кнопку «Удалить» или выберите команду в контекстном меню
  4. 4
    Запишите или проведите объект, чтобы зафиксировать изменение
  5. 5
    При необходимости проверьте, что связанные итоги (суммы, количество) пересчитались

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

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

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

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

Кнопка «Удалить» сераяУдаление заблокировано

Проверьте свойство «Изменять состав строк» и права пользователя

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

Ищите код в обработчиках ПриИзменении, который пересчитывает таблицу

Форма открыта только на просмотрДата запрета или документ проведён

Проверьте дату документа и настройки дат запрета изменения данных

Программное удаление строки в модуле объекта

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

// Удалить конкретную строку

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

// Удалить строку по индексу (первая строка — индекс 0)

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

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

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

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

// Вариант 1: сбор строк в массив, затем удаление

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

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

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

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

КонецЕсли;

КонецЦикла;

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

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

КонецЦикла;

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

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

Индекс = Объект.Товары.Количество() - Сч;

Если Объект.Товары[Индекс].Количество = 0 Тогда

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

КонецЕсли;

КонецЦикла;

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

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

&НаКлиенте

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

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

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

Возврат; // строка не выбрана

КонецЕсли;

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

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

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

КонецЕсли;

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

Если на форме используется не табличная часть объекта, а реквизит формы типа «ТаблицаЗначений» или «ДанныеФормыКоллекция», подход тот же: удаление выполняется методом Удалить() коллекции, а текущая строка получается через Элементы.<ИмяТаблицы>.ТекущаяСтрока и НайтиПоИдентификатору(). Для динамических списков удаление строки из таблицы формы вообще не имеет смысла — нужно удалять сам объект базы данных и обновлять список.

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

bsl
СтрокаТаблицы = Объект.Товары.НайтиПоИдентификатору(Элементы.Товары.ТекущаяСтрока);
Если СтрокаТаблицы <> Неопределено Тогда
    Объект.Товары.Удалить(СтрокаТаблицы);
КонецЕсли;

Перехват и контроль удаления: обработчик ПередУдалением

Разработчик может управлять интерактивным удалением через событие таблицы формы ПередУдалением. В нём доступны параметр Отказ (установка в Истина запрещает удаление) и возможность задать пользователю вопрос. В управляемых формах вопрос задаётся асинхронно — через ПоказатьВопрос() с описанием оповещения, потому что модальные вызовы в тонком и веб-клиенте запрещены.

Типовой сценарий — подтверждение удаления строки с критичными данными или запрет удаления строк, добавленных автоматически (например, по данным учёта). В обработчике доступна текущая строка через Элементы.<Таблица>.ТекущиеДанные, что позволяет проверить её реквизиты и принять решение.

&НаКлиенте

Процедура ТоварыПередУдалением(Элемент, Отказ)

ТекущиеДанные = Элементы.Товары.ТекущиеДанные;

Если ТекущиеДанные <> Неопределено

И ТекущиеДанные.СтрокаЗагруженаИзДокумента Тогда

Отказ = Истина; // такие строки удалять нельзя

КонецЕсли;

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

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

Типичные ошибки и как их избежать

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

Вторая ошибка — путать индекс строки (нумерация с нуля) и номер строки (нумерация с единицы, реквизит НомерСтроки). Вызов Удалить(НомерСтроки) удалит не ту строку или вызовет ошибку выхода за границы коллекции. Если работаете с номером, вычитайте единицу или ищите строку методом Найти() / отбором.

Третья группа ошибок связана с контекстом исполнения: попытка обратиться к Элементы формы в серверной процедуре без контекста формы, использование ТекущаяСтрока как готовой строки данных (это идентификатор, а не строка) и ожидание, что удаление на форме сразу изменит данные в базе без записи объекта.

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

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

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

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

Перед массовым программным удалением строк в рабочей базе сделайте резервную копию или сначала выполните обработку в тестовой копии. Ошибка в условии отбора строк (например, = 0 вместо > 0) удалит противоположный набор данных, и восстановить его без копии будет невозможно.

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

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

Строка в таблице формы
Норма

Строка исчезла сразу после Delete или вызова Удалить()

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

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

Данные после записи
Норма

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

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

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

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

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

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

Итоги устарели — не срабатывает пересчёт, проверяйте обработчики ПриИзменении

Количество удалённых строк
Норма

Разница Количество() до и после равна ожидаемому числу

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

Удалено больше или меньше — ошибка в условии отбора строк

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

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

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

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

Интерактивно: выделите все строки (Ctrl+A в таблице) и нажмите Delete, либо используйте команду очистки, если она предусмотрена конфигурацией. Программно вызовите метод Очистить(): Объект.Товары.Очистить() — он удаляет все строки коллекции за один вызов.

Почему в управляемой форме нельзя использовать Вопрос() перед удалением?

Модальные методы (Вопрос, Предупреждение, ОткрытьЗначение) заблокированы в тонком и веб-клиенте — платформа выдаст ошибку о недопустимости модального вызова. Используйте асинхронный аналог ПоказатьВопрос() с описанием оповещения: удаление выполняется в процедуре-обработчике ответа, а до получения ответа в ПередУдалением следует установить Отказ = Истина.

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

Табличная часть хранится внутри объекта, и удаление строки изменяет этот объект — результат фиксируется при его записи. Динамический список отображает результат запроса к нескольким записям базы; чтобы «удалить» из него строку, нужно удалить соответствующий объект базы данных (пометить на удаление или удалить непосредственно), после чего список обновится.

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

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

Удаляется ли строка физически из базы сразу после нажатия Delete?

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

Итог

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

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