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

Особое внимание уделим типичным ошибкам: почему после удаления строка остаётся в базе, как избежать нарушения целостности данных при каскадном удалении, и что делать, если система выдаёт сообщение «Объект используется!». Также приведём примеры кода для 1С 8.3 и 8.2, которые работают в большинстве конфигураций (Бухгалтерия 3.0, УТ 11, ЗУП 3.1 и др.).

1. Удаление строки через интерфейс пользователя

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

Чтобы удалить строку через интерфейс:

  • 📄 Откройте документ или справочник, содержащий табличную часть (например, Заказ клиента или Номенклатура).
  • 🖱️ Выделите строку, которую нужно удалить, кликнув по ней левой кнопкой мыши.
  • 🗑️ Нажмите клавишу Delete или кнопку «Удалить» на панели инструментов (значок корзины).
  • ✅ Подтвердите действие в диалоговом окне, если оно появится.

Если кнопка «Удалить» неактивна, проверьте:

  • 🔒 Права доступа пользователя — возможно, у вас нет разрешения на изменение данных.
  • 🔄 Режим блокировки — документ может быть проведён или заблокирован другим пользователем.
  • 📋 Настройки конфигурации — в некоторых случаях удаление строк запрещено на уровне метаданных.
⚠️ Внимание: Если строка связана с другими объектами (например, в заказе есть ссылка на номенклатуру, которая используется в отчётах), её удаление может нарушить целостность данных. В таких случаях лучше использовать пометку на удаление или программные методы с проверкой ссылок.
📊 Как вы обычно удаляете строки в 1С?
Через интерфейс (Delete)
Программно (1С-код)
С помощью обработки
Не удаляю, использую пометку

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

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

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

Процедура УдалитьТекущуюСтроку(ТабличнаяЧасть)

Если ТабличнаяЧасть.ТекущаяСтрока = Неопределено Тогда

Предупреждение("Не выбрана строка для удаления!");

Возврат;

КонецЕсли;

ТабличнаяЧасть.Удалить(ТабличнаяЧасть.ТекущаяСтрока);

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

Для удаления строки по номеру или условию:

Процедура УдалитьСтрокуПоНомеру(ТабличнаяЧасть, НомерСтроки)

Если НомерСтроки > ТабличнаяЧасть.Количество() Тогда

Предупреждение("Некорректный номер строки!");

Возврат;

КонецЕсли;

ТабличнаяЧасть.Удалить(ТабличнаяЧасть.Получить(НомерСтроки - 1));

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

Если нужно удалить все строки, соответствующие определённому условию (например, с нулевым количеством):

Процедура УдалитьСтрокиПоУсловию(ТабличнаяЧасть)

Индекс = ТабличнаяЧасть.Количество() - 1;

Пока Индекс >= 0 Цикл

ТекущаяСтрока = ТабличнаяЧасть.Получить(Индекс);

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

ТабличнаяЧасть.Удалить(ТекущаяСтрока);

КонецЕсли;

Индекс = Индекс - 1;

КонецЦикла;

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

⚠️ Внимание: При удалении строк в цикле всегда перебирайте табличную часть с конца (от последней строки к первой). В противном случае индексы строк сдвинутся, и вы пропустите записи или получите ошибку выхода за границы коллекции.

☑️ Проверка перед программным удалением

Выполнено: 0 / 4

3. Удаление с проверкой ссылочной целостности

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

Чтобы избежать этого, перед удалением проверяйте ссылки:

Процедура БезопасноеУдалениеСтроки(ТабличнаяЧасть, Строка)

Попытка

// Проверяем, используется ли номенклатура из строки в других документах

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ РАЗРЕШЕННЫЕ

| ДокументСсылка КАК Ссылка

|ИЗ

| Документ.ЗаказКлиента.Товары КАК Товары

|ГДЕ

| Товары.Номенклатура = &Номенклатура

| И Товары.Ссылка <> &ТекущийДокумент";

Запрос.УстановитьПараметр("Номенклатура", Строка.Номенклатура);

Запрос.УстановитьПараметр("ТекущийДокумент", ТабличнаяЧасть.Владелец.Ссылка);

Результат = Запрос.Выполнить();

Если Результат.Пустой() Тогда

ТабличнаяЧасть.Удалить(Строка);

Иначе

Предупреждение("Номенклатура используется в других документах! Удаление невозможно.");

КонецЕсли;

Исключение

Сообщить(ОписаниеОшибки());

КонецПопытки;

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

Альтернативный вариант — не удалять строку, а пометить её на удаление:

Строка.ПометкаУдаления = Истина;

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

Метод удаления Когда использовать Риски
Удалить() Для немедленного удаления строки Нарушение ссылочной целостности, ошибки прав доступа
Пометка на удаление Если строка может использоваться в других объектах Требует дополнительной обработки для окончательного удаления
Удаление через запрос Для массового удаления по условию Сложнее отладить, возможны блокировки
Очистка табличной части Для удаления всех строк Потеря данных, если не сделать резервную копию

4. Удаление строк в транзакции

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

Пример кода с транзакцией:

Процедура УдалитьСтрокуВТранзакции(Документ)

НачатьТранзакцию();

Попытка

// Удаляем строку

Документ.Товары.Удалить(Документ.Товары.ТекущаяСтрока);

// Сохраняем документ

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

// Перепроводим документ (если нужно)

Документ.Провести();

ЗафиксироватьТранзакцию();

Исключение

ОтменитьТранзакцию();

Сообщить("Ошибка при удалении строки: " + ОписаниеОшибки());

КонецПопытки;

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

Если документ уже проведён, перед удалением строки его нужно ОтменитьПроведение(), а после изменений — провести заново. Иначе возникнет ошибка «Документ проведён и не может быть изменён».

⚠️ Внимание: В 1С 8.3 при работе с транзакциями учитывайте уровень изоляции. Если в этот момент другой пользователь блокирует документ, ваша транзакция может завершиться с ошибкой. В таких случаях используйте повторные попытки или уведомляйте пользователя о необходимости повторить операцию позже.
💡

Перед массовым удалением строк в транзакции проверьте количество записей — если их больше 1000, разбейте операцию на части по 500-1000 строк, чтобы избежать тайм-аута сервера.

5. Массовое удаление строк по условию

Иногда требуется удалить не одну строку, а все строки, соответствующие определённому условию. Например, очистить табличную часть от номенклатуры с нулевым количеством или устаревших записей. Для этого удобно использовать цикл с обратным перебором или запрос.

Пример 1: Удаление строк с нулевым количеством через цикл

Процедура УдалитьСтрокиСНулевымКоличеством(ТабличнаяЧасть)

Индекс = ТабличнаяЧасть.Количество() - 1;

Пока Индекс >= 0 Цикл

ТекущаяСтрока = ТабличнаяЧасть.Получить(Индекс);

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

ТабличнаяЧасть.Удалить(ТекущаяСтрока);

КонецЕсли;

Индекс = Индекс - 1;

КонецЦикла;

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

Пример 2: Удаление через запрос (для больших таблиц)

Процедура УдалитьУстаревшиеСтроки(ТабличнаяЧасть, ДатаГраница)

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| ТоварыСсылка КАК Ссылка

|ИЗ

| Документ.&ДокументТип.Товары КАК Товары

|ГДЕ

| Товары.Дата < &ДатаГраница";

Запрос.УстановитьПараметр("ДокументТип", ТабличнаяЧасть.Владелец.Метаданные().Имя);

Запрос.УстановитьПараметр("ДатаГраница", ДатаГраница);

Результат = Запрос.Выполнить();

Выборка = Результат.Выбрать();

Пока Выборка.Следующий() Цикл

Строка = ТабличнаяЧасть.НайтиПоРеквизиту("Ссылка", Выборка.Ссылка);

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

ТабличнаяЧасть.Удалить(Строка);

КонецЕсли;

КонецЦикла;

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

Для ускорения массового удаления можно использовать Очистить(), но это удалит все строки без возможности отмены:

ТабличнаяЧасть.Очистить();
Что делать, если после удаления строки документ не проводится?

Если после удаления строки документ отказывается проводиться, проверьте:

1. Целостность данных — возможно, в табличной части остались обязательные реквизиты с пустыми значениями.

2. Проведение документа — некоторые конфигурации требуют ручного запуска процедуры ОбработкаПроведения().

3. Блокировки — если документ заблокирован другим пользователем, проведение будет невозможно до снятия блокировки.

4. Ошибки в модуле — откройте журнал регистрации (Администрирование → Журнал регистрации) и проверьте последние ошибки.

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

В управляемых формах (используемых в 1С 8.3) удаление строк имеет особенности. Здесь нельзя напрямую обращаться к табличной части — нужно работать через элементы формы.

Пример кода для управляемой формы:

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

ТабличнаяЧасть = Элементы.Товары.Значение;

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

Если ТекущаяСтрока = Неопределено Тогда

Предупреждение("Выберите строку для удаления!");

Возврат;

КонецЕсли;

ТабличнаяЧасть.Удалить(ТекущаяСтрока);

Элементы.Товары.Значение = ТабличнаяЧасть;

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

Если строка связана с динамическим списком, после удаления нужно обновить форму:

Элементы.Товары.Обновить();

В управляемых формах также можно использовать Командный интерфейс для добавления кнопки удаления:

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

Команды.УдалитьСтроку.Видимость = Истина;

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

⚠️ Внимание: В управляемых формах после изменения табличной части обязательно обновляйте элемент формы (Элементы.ИмяТаблицы.Обновить()), иначе пользователь не увидит изменений до сохранения документа.

7. Типичные ошибки и их решения

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

Ошибка Причина Решение
Объект используется (LockError) Строка или документ заблокированы другим пользователем Проверьте блокировки в Администрирование → Активные пользователи или повторите операцию позже
Недостаточно прав У пользователя нет прав на изменение данных Настройте права в Администрирование → Пользователи или выполните операцию от имени администратора
Индекс вне границ массива Попытка удалить несуществующую строку или ошибка в цикле Проверьте количество строк перед удалением и используйте обратный перебор
Документ проведён и не может быть изменён Попытка изменить проведённый документ без отмены проведения Отмените проведение (Документ.ОтменитьПроведение()), удалите строку, затем проведите заново
Нарушение ссылочной целостности Строка используется в других объектах базы Используйте пометку на удаление или проверяйте ссылки перед удалением

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

ФоновоеЗадание = ФоновыеЗадания.Создать("ОчисткаТабличнойЧасти");

ФоновоеЗадание.Параметры.Документ = СсылкаНаДокумент;

ФоновоеЗадание.Выполнить();

💡

Всегда проверяйте результат удаления! После выполнения операции обновите форму и убедитесь, что строка действительно удалена. В некоторых случаях (например, при ошибках транзакций) изменения могут не сохраниться.

FAQ: Частые вопросы по удалению строк в ТЗ 1С

Можно ли восстановить удалённую строку в 1С?

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

  • 🔄 Откат транзакции — если удаление было в транзакции, которая не зафиксирована.
  • 💾 Восстановление из резервной копии — если есть бэкап базы до удаления.
  • 📄 Журнал изменений — в некоторых конфигурациях ведётся история изменений документов (например, в Бухгалтерии 3.0).

Если строка была помечена на удаление, её можно вернуть, сняв пометку:

Строка.ПометкаУдаления = Ложь;
Почему после удаления строки документ не сохраняется?

Это может происходить по нескольким причинам:

  • 🔒 Блокировка — документ заблокирован другим пользователем.
  • ⚠️ Ошибки заполнения — после удаления строки в табличной части остались обязательные реквизиты без значений.
  • 📝 Нарушение логики проведения — в модуле документа прописана проверка, которая не позволяет сохранить документ без определённых строк.

Проверьте журнал регистрации (Администрирование → Журнал регистрации) для детальной информации об ошибке.

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

Для этого можно использовать цикл с условием:

Процедура ОставитьТолькоОднуСтроку(ТабличнаяЧасть, ИндексОставляемойСтроки)

Индекс = ТабличнаяЧасть.Количество() - 1;

Пока Индекс >= 0 Цикл

Если Индекс <> ИндексОставляемойСтроки Тогда

ТабличнаяЧасть.Удалить(ТабличнаяЧасть.Получить(Индекс));

КонецЕсли;

Индекс = Индекс - 1;

КонецЦикла;

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

Или через создание новой табличной части:

Процедура ОставитьТолькоОднуСтрокуБыстро(ТабличнаяЧасть, ИндексОставляемойСтроки)

НоваяТабличнаяЧасть = ТабличнаяЧасть.Получить(ИндексОставляемойСтроки).Скопировать();

ТабличнаяЧасть.Очистить();

ТабличнаяЧасть.Добавить(НоваяТабличнаяЧасть);

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

Как удалить строку в ТЗ, если она связана с регистром?

Если строка табличной части влияет на регистры накопления или бухгалтерии, её удаление может привести к расхождению итогов. В таких случаях:

  1. Отмените проведение документа (Документ.ОтменитьПроведение()).
  2. Удалите строку.
  3. Проведите документ заново (Документ.Провести()).

Если после этого возникают ошибки в итогах, используйте перепроводку документов за период или воспользуйтесь обработкой Помощник исправления ошибок учета (доступна в типовой Бухгалтерии 3.0).

Можно ли удалить строку в ТЗ без прав администратора?

Да, но для этого у пользователя должны быть права на изменение данного документа или справочника. Если прав недостаточно, появится ошибка Недостаточно прав.

Чтобы проверить права:

  1. Откройте Администрирование → Пользователи.
  2. Выберите пользователя и проверьте права на объект (например, документ РеализацияТоваровУслуг).
  3. Убедитесь, что установлены флаги Чтение, Добавление, Изменение и Удаление.

Если изменять права нельзя, попробуйте:

  • 🔑 Выполнить операцию от имени администратора.
  • 📝 Использовать пометку на удаление вместо полного удаления.