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

В этой статье мы разберём 5 рабочих способов удаления строк — от ручного метода через форму документа до программных решений на встроенном языке. Вы узнаете, как безопасно удалять данные без нарушения целостности, какие скрытые ограничения платформы 1С могут помешать операции, и как обойти типичные ошибки при работе с табличными частями в конфигурациях УТ 11, БП 3.0 и ЗУП 3.1.

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

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

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

Более того, в типовой конфигурации 1С:ERP или Комплексная автоматизация 2.4 некоторые табличные части (например, Товары в документе РеализацияТоваровУслуг) имеют программные ограничения на удаление, если строка уже проведена или связана с заказом клиента. В таких случаях требуется либо отмена проведения, либо использование обходных путей через код.

📊 Как вы обычно удаляете строки в 1С?
Вручную через интерфейс
Через обработку с кодом
Прямо в конфигураторе
Использую внешние отчёты
Не удаляю, а помечаю на удаление

Способ 1: Удаление через форму документа (для начинающих)

Самый простой метод, который подходит пользователям без навыков программирования. Рассмотрим на примере документа ПоступлениеТоваровУслуг в 1С:Управление торговлей 11:

  1. Откройте документ в режиме редактирования (двойной клик или кнопка Изменить).
  2. Перейдите на вкладку с табличной частью (например, Товары).
  3. Выделите строку, которую нужно удалить, кликнув по её номеру слева.
  4. Нажмите клавишу Delete или кнопку Удалить текущую строку в панели инструментов таблицы.
  5. Сохраните документ (Ctrl+S или кнопка Записать и закрыть).

⚠️ Внимание: Если строка уже проведена (т.е. документ имеет движения), система может выдать ошибку "Нельзя удалить строку, так как она участвует в движениях!". В этом случае сначала отмените проведение документа (кнопка Ещё → Отмена проведения), затем удалите строку и проведите документ заново.

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

Отмените проведение, если строка участвует в движениях

Сделайте резервную копию документа (например, через "Сохранить как...")

Убедитесь, что у вас есть права на редактирование

-->

Способ 2: Программное удаление по условию (встроенный язык)

Для массового удаления строк по критериям (например, удалить все строки с нулевым количеством или устаревшей номенклатурой) потребуется написать код. Рассмотрим универсальный пример для любой табличной части:

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

// Получаем табличную часть

ТабличнаяЧасть = Документ[ИмяТабличнойЧасти];

// Проходим по строкам с конца, чтобы не сбивать индексы

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

ТекущаяСтрока = ТабличнаяЧасть[Индекс];

Если Условие(ТекущаяСтрока) Тогда

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

КонецЕсли;

КонецЦикла;

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

// Пример использования:

// Удалить все строки с количеством = 0 в документе ПоступлениеТоваровУслуг

Условие = Новый Структура("Количество", 0);

УдалитьСтрокиПоУсловию(ТекущийДокумент, "Товары",

Функция(Строка) Возврат Строка.Количество = Условие.Количество КонецФункции);

Ключевые моменты:

  • 🔄 Обход строк с конца (от последней к первой) обязателен, иначе после удаления строки индексы сдвинутся, и вы пропустите проверку некоторых строк.
  • 📌 Условие можно сделать сколь угодно сложным: проверка по нескольким полям, регулярные выражения для наименований, сравнение с данными из других таблиц.
  • 🛠️ Для работы с управляемыми формами (например, в 1С:Бухгалтерия 3.0) используйте метод Объект.Товары.Удалить() вместо прямого обращения к табличной части.
💡

Если нужно удалить строки по сложному условию (например, "номенклатура из группы 'Устаревшее' И дата поступления старше 1 года"), лучше вынести логику условия в отдельную функцию. Это упростит поддержку кода и тестирование.

Способ 3: Использование запроса для массового удаления

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

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

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

"ВЫБРАТЬ

| ПоступлениеТоваровУслугТовары.Ссылка КАК Ссылка,

| ПоступлениеТоваровУслугТовары.Номенклатура КАК Номенклатура

|ИЗ

| Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары

|ГДЕ

| ПоступлениеТоваровУслугТовары.Ссылка = &СсылкаНаДокумент

| И (ПоступлениеТоваровУслугТовары.Номенклатура.ЭтоГруппа()

| ИЛИ НЕТ ПоступлениеТоваровУслугТовары.Номенклатура В

| (ВЫБРАТЬ Ссылка ИЗ Справочник.Номенклатура)

| ИЛИ ПоступлениеТоваровУслугТовары.Количество = 0)";

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

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

// Удаляем найденные строки

Для Каждого Строка Из Результат Выбрать() Цикл

ТекущийДокумент.Товары.НайтиСтроки(Новый Структура("Номенклатура", Строка.Номенклатура))[0].Удалить();

КонецЦикла;

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

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

ОстаткиНоменклатурыОстатки.Номенклатура КАК Номенклатура

ИЗ

РегистрНакопления.ОстаткиНоменклатуры.Остатки(&ДатаОстатков,) КАК ОстаткиНоменклатурыОстатки

ГДЕ

ОстаткиНоменклатурыОстатки.КоличествоОстаток = 0

Способ 4: Удаление с использованием внешней обработки

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

Элемент обработкиНазначениеПример кода
Реквизит "Документ" Ссылка на обрабатываемый документ Тип: ДокументСсылка.ПоступлениеТоваровУслуг
Команда "УдалитьПоУсловию" Запускает процедуру удаления Действие = "УдалитьСтроки()"
Параметр "Условие" Строка с условием (например, "Количество = 0") Тип: Строка
Функция "ПарситьУсловие" Преобразует текстовое условие в код Возврат Новый Структура("Поле, Значение", РазбитьСтроку(Условие, "="));

Преимущества внешней обработки:

  • 🔧 Гибкость — можно добавлять новые условия без изменения конфигурации.
  • 📂 Безопасность — обработка работает в пользовательском режиме и не требует прав конфигуратора.
  • 📊 Логирование — легко добавить журнал удалённых строк для отчёта.
Как подключить внешнюю обработку в 1С?

1. Скачайте файл обработки (.epf) или создайте свою в конфигураторе (Файл → Новая обработка).

2. В пользовательском режиме откройте Файл → Открыть... и выберите файл.

3. Заполните реквизиты (например, укажите документ) и нажмите кнопку выполнения.

4. Для повторного использования сохраните обработку в каталог шаблонов (Сервис → Шаблоны...).

Способ 5: Прямое удаление через SQL (для опытных)

В редких случаях, когда стандартные методы 1С не работают (например, при восстановлении данных после сбоя), можно обратиться напрямую к SQL-базе. Это рискованный метод, который следует использовать только если:

  • 🔐 У вас есть резервная копия базы.
  • 🛠️ Вы понимаете структуру таблиц 1С (например, _Document{ID} для документов).
  • 📝 Документ не проведён (или движения уже скорректированы).

Пример SQL-запроса для удаления строк из табличной части Товары документа с ID 12345, где количество = 0:

DELETE FROM _Document83_Tovary

WHERE _Document83_ID_RRef = 12345

AND _Fld9876_RRef IN (

SELECT _IDRRef

FROM _Document83

WHERE _IDRRef = 12345

)

AND _Fld1234_Numeric = 0;

⚠️ Внимание: Прямое изменение SQL-таблиц нарушает целостность данных 1С! После такого удаления:

  • Могут остаться "битые" ссылки в индексах платформы.
  • Требуется пересчёт итогов и перепроведение связанных документов.
  • Вероятны ошибки при следующем обновлении конфигурации.

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

💡

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

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

Даже опытные разработчики сталкиваются с проблемами при удалении строк. Вот самые распространённые ошибки и способы их решения:

ОшибкаПричинаРешение
Индекс вне границ массива (0) Попытка удалить несуществующую строку или обход таблицы не с конца. Используйте цикл Для Каждого или обход с конца (как в Способе 2).
Нельзя удалить строку, так как она участвует в движениях Документ проведён, и строка сформировала движения по регистрам. Отмените проведение, удалите строку, проведите заново.
После удаления строки её данные остаются в печатной форме Печатная форма кэширует данные на момент открытия. Закройте и откройте форму документа заново.
Ошибка блокировки при массовом удалении Длительная транзакция блокирует таблицы для других пользователей. Разбейте операцию на пакеты по 100-200 строк с commit.

Особое внимание уделите документам с подчинёнными табличными частями (например, СчётФактураВыданный и его часть Товары). Удаление строки в главном документе может автоматически удалить связанные строки в подчинённых объектах, что приведёт к каскадным ошибкам.

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

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

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

  • Отменить изменения в документе (Ctrl+Z — работает только до сохранения).
  • Восстановить документ из архива (если включена история изменений).
  • Скопировать данные из аналогичного документа.

В конфигурациях с версионированием (например, 1С:ERP) проверьте журнал изменений объекта.

Почему после удаления строки в документе остаются "пустые" движения?

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

  1. Откройте документ.
  2. Выполните Действия → Отмена проведения.
  3. Удалите строку.
  4. Проведите документ заново.

Если движения остались, используйте обработку Поиск и исправление ошибок учёта (доступна в типовой поставке).

Как удалить строки в табличной части справочника (например, "Контрагенты")?

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

  • Для справочника Контрагенты табличная часть Контакты или Адреса удаляется через метод Объект.Контакты.Удалить(Индекс).
  • Если справочник используется в документах, проверьте ссылки через отчёт Где используется.

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

Для Индекс = Контрагент.Контакты.Количество() - 1 По 0 Цикл

Если ПустаяСтрока(Контрагент.Контакты[Индекс].Тип) Тогда

Контрагент.Контакты.Удалить(Индекс);

КонецЕсли;

КонецЦикла;

Можно ли удалить строки в табличной части через RLS (ограничение прав)?

Да, но с оговорками:

  • Если у пользователя нет прав на редактирование табличной части, строку удалить нельзя (даже программно).
  • RLS (Row-Level Security) может скрывать строки от пользователя, но они физически остаются в базе.
  • Для обхода ограничений используйте права Администратор или специальные роли с полным доступом.

Проверьте права в конфигураторе: Администрирование → Пользователи → Настройка прав.

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

В мобильном клиенте 1С функционал ограничен:

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

Пример серверной процедуры:

&НаСервере

Процедура УдалитьСтрокиНаСервере(Документ, Условие)

// Логика удаления (аналогично Способу 2)

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