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

Обучение и Решения · 10 мин

Как удалить выделенные строки в 1С

Как удалить выделенные строки в 1С: в табличной части документа, в списке справочника и программно. Пошаговые инструкции, примеры кода, типичные ошибки.

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

В пользовательском режиме удаление выполняется клавишами Delete, Shift+Delete или через контекстное меню, а в режиме разработчика — методами объекта табличной части или набора записей. Важно понимать разницу между удалением строки табличной части (она хранится внутри документа) и удалением самостоятельного объекта базы, такого как элемент справочника или документ.

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

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

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

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

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

Удаление выделенных элементов из списка справочника или документов

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

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

Снять пометку можно так же — выделив объект и нажав Delete повторно. Это удобно, если пометка установлена ошибочно: данные не теряются, пока не запущено физическое удаление.

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

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

ТЧ = Объект.Товары;

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

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

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

ТЧ.Удалить(СтрокаТаблицы);

КонецЕсли;

КонецЦикла;

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

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

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

Если СтрокаТаблицы.Пометка Тогда

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

КонецЕсли;

КонецЦикла;

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

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

КонецЦикла;

Метод Удалить() принимает либо индекс строки, либо саму строку. Передача объекта строки надёжнее, потому что индекс может измениться между отбором и удалением.

bsl
// Удаление выделенных строк табличного поля на форме
Для Каждого ИндексСтроки Из Элементы.Товары.ВыделенныеСтроки Цикл
    Объект.Товары.Удалить(Объект.Товары.НайтиПоИдентификатору(ИндексСтроки));
КонецЦикла;

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

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

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

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

Порядок действий для кнопки «Удалить выделенные»
  1. 1
    Добавьте команду формы и кнопку в командную панель табличной части
  2. 2
    В обработчике получите массив Элементы.Товары.ВыделенныеСтроки
  3. 3
    Для каждого идентификатора найдите строку методом НайтиПоИдентификатору
  4. 4
    Удалите строку методом Удалить() из коллекции табличной части
  5. 5
    Проверьте, что форма стала модифицированной и данные записываются корректно

Удаление строк в обычных формах и на клиенте

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

В тонком и веб-клиенте управляемых форм учитывайте контекст выполнения: обход и удаление строк табличной части объекта допустимы на клиенте, но работа со ссылочными объектами (пометка удаления, запись) требует серверного вызова. Вынесите удаление объектов в серверную процедуру с директивой &НаСервере, передав туда массив ссылок.

При массовом удалении объектов оборачивайте операции в транзакцию: если на середине списка возникнет ошибка ссылочной целостности, база не останется в частично обработанном состоянии.

Типичные ошибки
01
Перебор коллекции с начала при удалении — после удаления строки индексы смещаются, и часть строк пропускается
02
Использование индекса вместо идентификатора в управляемой форме — НайтиПоИдентификатору получает не индекс, а идентификатор строки
03
Удаление строк без записи документа — изменения теряются при закрытии формы
04
Попытка напрямую удалить объект из базы без проверки ссылок — нарушается целостность данных
05
Удаление помеченных объектов без резервной копии — восстановить данные невозможно

Проверка результата и ограничения

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

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

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

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

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

Итоги документа после удаления строк
Норма

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

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

Итоги остались прежними — документ не пересчитан

Состояние документа
Норма

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

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

Форма закрыта без записи — изменения потеряны

Удаление помеченных объектов
Норма

Обработка завершена, список ошибок пуст

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

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

Программное удаление
Норма

Удалены все строки по условию, коллекция не содержит лишнего

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

Часть строк осталась — вероятно, цикл шёл с начала коллекции

Итог

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

Строки табличной части удаляются клавишей Delete и фиксируются записью документа; объекты списков сначала помечаются, а удаляются обработкой с контролем ссылок. Программно коллекцию обходят с конца или через массив строк, а в управляемых формах работают с идентификаторами выделенных строк. Перед массовым физическим удалением всегда делайте резервную копию.

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

Почему клавиша Delete не удаляет строку в документе?

Скорее всего, документ открыт в режиме просмотра, период закрыт для редактирования или у пользователя нет прав на изменение. Проверьте, не стоит ли на форме признак «Только просмотр», и наличие прав в профиле пользователя.

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

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

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

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

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

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

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

Динамический список не редактируется напрямую. Получите ссылку из текущей строки, на сервере получите объект методом ПолучитьОбъект(), установите пометку удаления или вызовите Удалить(), затем обновите список на форме.

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

Да, программно — методом Очистить() у табличной части. В пользовательском режиме выделите все строки через Ctrl+A и нажмите Delete, затем запишите документ.