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