Разработка и Конфигурация · 10 мин
Как удалить строки из таблицы в 1С
Как удалить строки из табличной части документа, таблицы значений и табличного документа в 1С: интерактивные способы и примеры кода на встроенном языке.
Таблицы в 1С встречаются в нескольких разных видах, и способ удаления строк зависит от того, с чем именно вы работаете. Табличная часть документа или справочника — это данные, хранящиеся в базе. Таблица значений — временная структура в памяти, которую программист заполняет и обрабатывает в коде. Табличный документ — это печатная форма или макет, похожий на лист Excel. У каждого вида свои методы и свои подводные камни.
Ошибка при удалении строк может привести к потере данных в документе, к сбою обработки или к «испорченной» печатной форме. Поэтому важно понимать, какой объект перед вами, и применять правильный метод. Ниже разобраны все основные сценарии: от интерактивного удаления пользователем до программной очистки по условию.
Определите, с какой таблицей вы работаете
Прежде чем удалять строки, убедитесь, что правильно идентифицировали объект. Если вы видите таблицу внутри открытого документа — например, список товаров в «Реализации товаров и услуг» — это табличная часть. Если таблица появилась в результате работы обработки или отчёта, скорее всего, это таблица значений или дерево значений. Если перед вами сформированная печатная форма — это табличный документ.
Данные сохраняются в базе при записи объекта
Существует только в памяти, пропадает после закрытия
Методы работы с областями: УдалитьОбласть, Очистить
От типа зависит и безопасность операции. Удаление строки из табличной части проведённого документа изменит данные учёта после перепроведения. Удаление строки из таблицы значений в памяти ни на что не влияет за пределами текущей обработки. Удаление области из табличного документа меняет только внешний вид печатной формы.
Удаление строк из табличной части документа вручную
В пользовательском режиме строка табличной части удаляется стандартными средствами платформы. Установите курсор на нужную строку и нажмите клавишу Delete, либо кнопку «Удалить» на командной панели таблицы, либо пункт «Удалить» в контекстном меню по правой кнопке мыши. В управляемых формах также работает сочетание Shift+Delete в некоторых конфигурациях, но стандартный вариант — именно Delete.
Чтобы удалить несколько строк сразу, выделите их с зажатой клавишей Ctrl (отдельные строки) или Shift (диапазон), затем нажмите Delete. Чтобы очистить табличную часть полностью, во многих типовых документах есть кнопка «Ещё» → «Очистить» или аналогичная команда на панели таблицы. Если такой кнопки нет, выделите все строки через Ctrl+A и удалите их разом.
Учтите: удалённые строки окончательно пропадут только после записи документа. До записи можно отменить изменения, закрыв документ без сохранения. Если документ уже проведён, после удаления строк его нужно перепровести, чтобы движения по регистрам обновились.
Программное удаление строк из табличной части
В коде на встроенном языке строки табличной части удаляются методом Удалить(). Ему можно передать либо объект строки, либо её индекс. Для полной очистки используется метод Очистить() — это самый быстрый и безопасный способ удалить все строки сразу.
// Удалить все строки табличной части "Товары"
Объект.Товары.Очистить();
// Удалить одну строку по индексу (индексация с нуля)
Объект.Товары.Удалить(0);
// Удалить конкретную строку
СтрокаТаблицы = Объект.Товары[0];
Объект.Товары.Удалить(СтрокаТаблицы);Чаще всего требуется удалить не все строки, а только те, что подходят под условие — например, строки с нулевым количеством. Здесь есть важная тонкость: нельзя удалять строки в прямом цикле «Для Каждого», потому что коллекция меняется прямо во время обхода, и часть строк будет пропущена. Правильные приёмы — обход с конца по индексу или предварительный отбор строк в отдельный массив.
// Способ 1: обход с конца по индексу
Для Индекс = 1 - Объект.Товары.Количество() По 0 Цикл
Если Объект.Товары[-Индекс].Количество = 0 Тогда
Объект.Товары.Удалить(-Индекс);
КонецЕсли;
КонецЦикла;
// Способ 2: сначала найти, потом удалить
СтрокиКУдалению = Объект.Товары.НайтиСтроки(Новый Структура("Количество", 0));
Для Каждого СтрокаТаблицы Из СтрокиКУдалению Цикл
Объект.Товары.Удалить(СтрокаТаблицы);
КонецЦикла;Второй способ с НайтиСтроки() читается проще и надёжнее: сначала формируется массив ссылок на строки, затем они удаляются. Порядок обхода при этом не важен, потому что массив уже зафиксирован.
Удаление строк из таблицы значений в коде
Таблица значений поддерживает те же методы: Удалить(), Очистить(), НайтиСтроки(). Дополнительно доступен метод Найти() для поиска первой подходящей строки. Логика удаления по условию полностью аналогична табличной части: либо обход с конца, либо предварительный отбор.
// Удалить строки с пустой номенклатурой из таблицы значений
Отбор = Новый Структура("Номенклатура", Справочники.Номенклатура.ПустаяСсылка());
СтрокиКУдалению = ТаблицаТоваров.НайтиСтроки(Отбор);
Для Каждого СтрокаТаблицы Из СтрокиКУдалению Цикл
ТаблицаТоваров.Удалить(СтрокаТаблицы);
КонецЦикла;
// Полная очистка таблицы значений
ТаблицаТоваров.Очистить();Если таблица значений выведена на форму как реквизит, удаление строк из неё не требует дополнительных действий — форма обновится автоматически. Но если данные отображаются через динамический список или СКД, удалять строки напрямую нельзя: нужно менять источник данных, то есть запрос или набор записей.
Для больших таблиц (десятки тысяч строк) удаление по одной строке может работать медленно. В таких случаях эффективнее построить новую таблицу запросом с условием ГДЕ, отсекающим ненужные строки, или скопировать нужные строки через Выгрузить() с отбором.
Удаление строк из табличного документа и макета
Табличный документ — это не коллекция данных, а сетка ячеек, поэтому методы Удалить() и Очистить() к нему не применяются. Строки здесь удаляются через область: метод УдалитьОбласть() с типом смещения по вертикали. Сначала получают область строк методом Область(), затем удаляют её.
// Удалить строки с 5 по 7 из табличного документа
ОбластьСтрок = ТабДок.Область(5, , 7, );
ТабДок.УдалитьОбласть(ОбластьСтрок, ТипСмещенияТабличногоДокумента.ПоВертикали);
// Полностью очистить табличный документ
ТабДок.Очистить();Тип смещения ПоВертикали означает, что строки ниже удалённой области сдвинутся вверх, закрывая пустоту. Если указать горизонтальное смещение или не указать его корректно, можно получить «разорванную» печатную форму с пустыми полосами. После удаления областей всегда проверяйте результат визуально, выведя документ на экран.
При работе с макетом учитывайте: если вы удаляете строки из уже выведенного табличного документа, итоговые секции (подвалы, итоги) могут оказаться рассчитанными по старым данным. Надёжнее формировать документ заново, не выводя лишние строки, чем удалять их постфактум.
Типичные ошибки и ограничения
Ещё одно ограничение касается обмена данными. Если объект участвует в планах обмена, программное удаление строк будет зарегистрировано как изменение и уйдёт в другие базы. В большинстве случаев это желаемое поведение, но при массовых служебных чистках стоит контролировать объём регистрируемых изменений.
Проверка результата после удаления
После интерактивного удаления убедитесь, что документ записан и, если он проводится, перепроведён. Откройте движения документа (кнопка «Ещё» → соответствующий пункт в типовых конфигурациях) и сверьте, что движения соответствуют оставшимся строкам.
После программного удаления проверяйте количество строк методом Количество() до и после операции. Разница должна совпадать с ожидаемым числом удалённых строк. Для удаления по условию полезно повторно выполнить НайтиСтроки() с тем же отбором — результат должен быть пустым массивом.
Что важно запомнить
Табличная часть и таблица значений очищаются методами Удалить() и Очистить(), табличный документ — через УдалитьОбласть(). Удаление по условию выполняйте обходом с конца или через НайтиСтроки(), никогда — в прямом цикле. Документ после удаления строк нужно записать и перепровести, а перед массовыми операциями делать копию базы.
Частые вопросы
Как удалить все строки табличной части одной командой?
Используйте метод Очистить(): Объект.Товары.Очистить(). В пользовательском режиме выделите все строки через Ctrl+A и нажмите Delete, либо воспользуйтесь командой очистки в меню «Ещё», если она предусмотрена конфигурацией.
Почему при удалении в цикле «Для Каждого» остаются лишние строки?
При удалении текущей строки коллекция сдвигается, и итератор пропускает следующую строку. Обходите коллекцию с конца по индексу или сначала соберите строки в массив через НайтиСтроки(), а затем удаляйте их отдельным циклом.
Как удалить только строки с определённым значением в колонке?
Сформируйте структуру отбора, например Новый Структура("Склад", ПустойСклад), передайте её в НайтиСтроки() и удалите каждую найденную строку методом Удалить(). Для сложных условий, не сводящихся к равенству, используйте обход с конца с проверкой внутри цикла.
Можно ли отменить удаление строки из документа?
Пока документ не записан — да: закройте его без сохранения или верните строку вручную. После записи и перепроведения отменить удаление штатно нельзя, восстановление возможно только из резервной копии базы.
Чем отличается удаление строки в табличном документе от удаления в таблице значений?
Таблица значений — коллекция данных, строки удаляются методом Удалить(). Табличный документ — сетка ячеек печатной формы, там удаляется область строк методом УдалитьОбласть() со смещением по вертикали, чтобы нижние строки подтянулись вверх.
Нужно ли перепроводить документ после удаления строк?
Да, если документ проведённый. Удаление строки меняет табличную часть, но движения по регистрам обновятся только при перепроведении. Иначе учётные данные будут противоречить содержимому документа.