Работа с табличными частями (ТЗ) в 1С:Предприятие — одна из самых частых задач как для разработчиков, так и для пользователей, которые настраивают документы или справочники. Удаление строк в ТЗ кажется простой операцией, но на практике может привести к ошибкам, если не учитывать особенности платформы. Например, попытка удалить строку без проверки прав доступа или в транзакции часто заканчивается сбоем. В этой статье разберём все рабочие способы удаления — от ручного через интерфейс до программных методов с обработкой исключений.
Особое внимание уделим типичным ошибкам: почему после удаления строка остаётся в базе, как избежать нарушения целостности данных при каскадном удалении, и что делать, если система выдаёт сообщение «Объект используется!». Также приведём примеры кода для 1С 8.3 и 8.2, которые работают в большинстве конфигураций (Бухгалтерия 3.0, УТ 11, ЗУП 3.1 и др.).
1. Удаление строки через интерфейс пользователя
Самый простой способ — удалить строку вручную, не прибегая к программированию. Этот метод подходит для одноразовых операций или когда нужно быстро очистить табличную часть от ненужных записей. Однако у него есть ограничения: например, в некоторых конфигурациях права доступа могут блокировать удаление.
Чтобы удалить строку через интерфейс:
- 📄 Откройте документ или справочник, содержащий табличную часть (например,
Заказ клиентаилиНоменклатура). - 🖱️ Выделите строку, которую нужно удалить, кликнув по ней левой кнопкой мыши.
- 🗑️ Нажмите клавишу
Deleteили кнопку «Удалить» на панели инструментов (значок корзины). - ✅ Подтвердите действие в диалоговом окне, если оно появится.
Если кнопка «Удалить» неактивна, проверьте:
- 🔒 Права доступа пользователя — возможно, у вас нет разрешения на изменение данных.
- 🔄 Режим блокировки — документ может быть проведён или заблокирован другим пользователем.
- 📋 Настройки конфигурации — в некоторых случаях удаление строк запрещено на уровне метаданных.
⚠️ Внимание: Если строка связана с другими объектами (например, в заказе есть ссылка на номенклатуру, которая используется в отчётах), её удаление может нарушить целостность данных. В таких случаях лучше использовать пометку на удаление или программные методы с проверкой ссылок.
2. Программное удаление строки в 1С 8.3/8.2
Для автоматизации удаления строк используют встроенный язык 1С. Основной метод — Удалить(), но он работает только для непомеченных объектов. Если строка уже помечена на удаление, потребуется другой подход.
Пример кода для удаления текущей строки в табличной части документа:
Процедура УдалитьТекущуюСтроку(ТабличнаяЧасть)
Если ТабличнаяЧасть.ТекущаяСтрока = Неопределено Тогда
Предупреждение("Не выбрана строка для удаления!");
Возврат;
КонецЕсли;
ТабличнаяЧасть.Удалить(ТабличнаяЧасть.ТекущаяСтрока);
КонецПроцедуры
Для удаления строки по номеру или условию:
Процедура УдалитьСтрокуПоНомеру(ТабличнаяЧасть, НомерСтроки)
Если НомерСтроки > ТабличнаяЧасть.Количество() Тогда
Предупреждение("Некорректный номер строки!");
Возврат;
КонецЕсли;
ТабличнаяЧасть.Удалить(ТабличнаяЧасть.Получить(НомерСтроки - 1));
КонецПроцедуры
Если нужно удалить все строки, соответствующие определённому условию (например, с нулевым количеством):
Процедура УдалитьСтрокиПоУсловию(ТабличнаяЧасть)
Индекс = ТабличнаяЧасть.Количество() - 1;
Пока Индекс >= 0 Цикл
ТекущаяСтрока = ТабличнаяЧасть.Получить(Индекс);
Если ТекущаяСтрока.Количество = 0 Тогда
ТабличнаяЧасть.Удалить(ТекущаяСтрока);
КонецЕсли;
Индекс = Индекс - 1;
КонецЦикла;
КонецПроцедуры
⚠️ Внимание: При удалении строк в цикле всегда перебирайте табличную часть с конца (от последней строки к первой). В противном случае индексы строк сдвинутся, и вы пропустите записи или получите ошибку выхода за границы коллекции.
☑️ Проверка перед программным удалением
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;
КонецЦикла;
КонецПроцедуры
Или через создание новой табличной части:
Процедура ОставитьТолькоОднуСтрокуБыстро(ТабличнаяЧасть, ИндексОставляемойСтроки)
НоваяТабличнаяЧасть = ТабличнаяЧасть.Получить(ИндексОставляемойСтроки).Скопировать();
ТабличнаяЧасть.Очистить();
ТабличнаяЧасть.Добавить(НоваяТабличнаяЧасть);
КонецПроцедуры
Как удалить строку в ТЗ, если она связана с регистром?
Если строка табличной части влияет на регистры накопления или бухгалтерии, её удаление может привести к расхождению итогов. В таких случаях:
- Отмените проведение документа (
Документ.ОтменитьПроведение()). - Удалите строку.
- Проведите документ заново (
Документ.Провести()).
Если после этого возникают ошибки в итогах, используйте перепроводку документов за период или воспользуйтесь обработкой Помощник исправления ошибок учета (доступна в типовой Бухгалтерии 3.0).
Можно ли удалить строку в ТЗ без прав администратора?
Да, но для этого у пользователя должны быть права на изменение данного документа или справочника. Если прав недостаточно, появится ошибка Недостаточно прав.
Чтобы проверить права:
- Откройте
Администрирование → Пользователи. - Выберите пользователя и проверьте права на объект (например, документ
РеализацияТоваровУслуг). - Убедитесь, что установлены флаги
Чтение,Добавление,ИзменениеиУдаление.
Если изменять права нельзя, попробуйте:
- 🔑 Выполнить операцию от имени администратора.
- 📝 Использовать пометку на удаление вместо полного удаления.