Разработка и Конфигурация · 11 мин
Как удалить строки из табличного документа 1С
Удаление строк из табличного документа 1С: методы УдалитьОбласть, Очистить, сдвиг областей, примеры кода на встроенном языке и типичные ошибки разработчиков.
Табличный документ в 1С — это объект типа «ТабличныйДокумент», который используется для формирования печатных форм, отчётов и вывода произвольных данных. В отличие от таблицы значений, здесь нет привычного метода «Удалить(Строка)» для отдельной строки: работа идёт через области ячеек. Поэтому удаление строк выполняется либо методом УдалитьОбласть, либо очисткой содержимого, либо перестроением документа заново.
Выбор способа зависит от задачи: убрать одну строку из уже сформированного документа, очистить документ целиком перед повторным выводом или не выводить лишние строки ещё на этапе формирования. Ниже разобраны все рабочие варианты с примерами кода на встроенном языке и ограничениями каждого подхода.
Как устроено удаление в табличном документе
Табличный документ состоит из ячеек, объединённых в области. Платформа не знает понятия «строка данных» — есть только номера строк сетки документа, как в электронной таблице. Поэтому удалить строку можно только как прямоугольную область, охватывающую нужные номера строк по вертикали.
При удалении области задаётся тип смещения: что делать с ячейками, расположенными ниже или правее удаляемой зоны. Для удаления целых строк используется смещение по вертикали — тогда нижние строки «подтягиваются» вверх, и документ сокращается без пустых промежутков.
Важно понимать, что форматные строки (служебные области, задающие оформление) и объединённые ячейки могут вести себя неочевидно при удалении. Если строка входит в объединённую область, удаление части этой области может привести к ошибке или к разрушению форматирования.
Удаление строк методом УдалитьОбласть
Основной способ — метод УдалитьОбласть. Сначала получают область нужных строк методом Область, затем удаляют её с вертикальным смещением. Координаты можно задать номерами строк или использовать именованную область, если она создана в макете.
ТабДок = Новый ТабличныйДокумент;
// ... формирование документа ...
// Удалить строки с 5 по 8 включительно
ОбластьСтрок = ТабДок.Область("R5:R8");
ТабДок.УдалитьОбласть(ОбластьСтрок, ТипСмещенияТабличногоДокумента.ПоВертикали);
Тот же приём работает с числовыми координатами: Область(5, , 8) вернёт область с пятой по восьмую строку без ограничения по колонкам. Если нужно удалить строки только в пределах определённых колонок, укажите все четыре координаты — но помните, что тогда смещение затронет только ячейки внутри этих колонок.
ОбластьСтрок = ТабДок.Область("R5:R8");
ТабДок.УдалитьОбласть(ОбластьСтрок, ТипСмещенияТабличногоДокумента.ПоВертикали);Удаление одной строки
Для одной строки область задаётся как RНомер:RНомер или просто RНомер. Например, ТабДок.Область("R10") вернёт десятую строку целиком. Далее применяется тот же УдалитьОбласть с вертикальным смещением.
Удаление строк по условию в цикле
Типовая задача — удалить строки, содержащие определённое значение, например пустые строки или строки с нулевой суммой. Здесь есть важный нюанс: при удалении строки номера всех нижних строк смещаются вверх, поэтому перебирать строки нужно снизу вверх либо корректировать счётчик после каждого удаления.
ВсегоСтрок = ТабДок.ВысотаТаблицы;
Для НомерСтроки = -ВсегоСтрок По -1 Цикл
ТекНомер = -НомерСтроки;
ТекстЯчейки = ТабДок.Область(ТекНомер, 2).Текст;
Если ПустаяСтрока(ТекстЯчейки) Тогда
ТабДок.УдалитьОбласть(ТабДок.Область(ТекНомер, , ТекНомер),
ТипСмещенияТабличногоДокумента.ПоВертикали);
КонецЕсли;
КонецЦикла;
Обход снизу вверх гарантирует, что удаление не нарушит нумерацию ещё не проверенных строк. Прямой цикл сверху вниз без корректировки счётчика пропустит каждую строку, следующую за удалённой.
Полная очистка документа методом Очистить
Если нужно удалить все строки разом — например, перед повторным формированием отчёта в ту же переменную — используется метод Очистить(). Он удаляет все области, содержимое ячеек, оформление и настройки печати, возвращая документ к исходному пустому состоянию.
ТабДок.Очистить();
// После этого документ можно формировать заново
Альтернатива — создать новый объект ТабличныйДокумент вместо очистки старого. Это предпочтительнее, если документ передаётся между процедурами: вы избегаете ситуации, когда где-то осталась ссылка на старый экземпляр с частично очищенным содержимым.
Удаление строк в табличном документе на форме
Когда табличный документ отображается в элементе формы, пользователь может удалять строки интерактивно: выделить строки мышью, нажать Delete или выбрать «Удалить» в контекстном меню — если у поля не отключено редактирование. Программно удаление выполняется тем же методом УдалитьОбласть через реквизит формы, связанный с полем табличного документа.
Для управляемых форм есть ограничение: методы работы с областями табличного документа выполняются на сервере, а сам документ нельзя напрямую передавать между клиентом и сервером в некоторых контекстах. Обычно логику удаления размещают в серверной процедуре, а на клиенте только вызывают её и обновляют отображение.
Если пользователь должен удалять строки вручную, проверьте свойство поля «ТолькоПросмотр» и защиту документа. При установленной защите интерактивное редактирование заблокировано, и попытка удалить строку не даст результата.
- 1Определите номера строк для удаления: по номеру, имени области или поиском по содержимому ячеек
- 2Получите область методом Область с координатами или именем
- 3Вызовите УдалитьОбласть с типом смещения ПоВертикали
- 4При удалении в цикле перебирайте строки снизу вверх
- 5Проверьте результат: высоту таблицы и содержимое соседних строк
Альтернатива: не выводить лишние строки при формировании
На практике удаление строк из готового документа часто свидетельствует о неоптимальной архитектуре. Надёжнее и быстрее решить задачу на этапе формирования: проверять условие перед выводом области макета и просто не выводить ненужные строки.
Для Каждого СтрокаТовара Из Товары Цикл
Если СтрокаТовара.Количество = 0 Тогда
Продолжить; // строку не выводим вовсе
КонецЕсли;
ОбластьСтрока.Параметры.Заполнить(СтрокаТовара);
ТабДок.Вывести(ОбластьСтрока);
КонецЦикла;
Такой подход исключает двойной проход по данным, не ломает нумерацию и не зависит от того, как устроены объединённые ячейки и форматные строки. Кроме того, в СКД фильтрация строк решается отбором в настройках отчёта, и ручное удаление из результата там вообще не требуется.
Сравнение вариантов
Подходит для точечного удаления строк из готового документа. Требует аккуратности с нумерацией при удалении в цикле
Удаляет всё содержимое разом. Подходит перед повторным формированием, но сбрасывает настройки печати
Самый надёжный вариант: строки просто не попадают в документ. Требует доступа к коду формирования
Правильный путь для отчётов: лишние строки отсекаются на уровне данных, а не табличного документа
Типичные ошибки и ограничения
Самая частая ошибка — удаление строк в прямом цикле сверху вниз. После удаления строки N строка N+1 становится строкой N, счётчик увеличивается, и одна строка пропускается. Итог — часть лишних строк остаётся в документе без видимой причины.
Вторая типичная проблема — попытка удалить строки, пересекающие объединённую область. Если объединение захватывает несколько строк (например, многострочный заголовок), удаление части этих строк вызовет ошибку или исказит макет. Перед удалением проверяйте структуру макета.
Также учитывайте, что после удаления областей итоговые строки, рассчитанные заранее (например, «Итого» с конкретной суммой), не пересчитаются автоматически. Табличный документ — это не формульная таблица: значения в ячейках статичны. Если удаление меняет итоги, их нужно пересчитать и записать в ячейки заново.
Проверка результата после удаления
После удаления строк полезно программно убедиться, что документ в ожидаемом состоянии. Свойство ВысотаТаблицы показывает текущее количество строк — сравните его с расчётным значением. Дополнительно проверьте содержимое первой и последней строки данных, чтобы убедиться, что смещение прошло корректно.
Для печатных форм финальная проверка — вывод документа на экран или в файл и визуальный контроль: нет ли пустых промежутков, «оторванных» итоговых строк и съехавшего оформления. Автоматизировать такую проверку можно, сравнив текст ключевых ячеек с эталонными значениями.
Как проверить результат
Уменьшилась ровно на число удалённых строк
Не изменилась или изменилась больше ожидаемого
Данные сместились вверх без пропусков
Пустые строки или дублирование данных
Суммы соответствуют оставшимся данным
Итоги отражают удалённые строки
Границы и объединения сохранены
Разорванные объединения, потерянное форматирование
FAQ
Можно ли удалить строку табличного документа по номеру без создания области?
Нет, метод УдалитьОбласть требует именно объект области. Однако получить её по номеру строки — одна строка кода: ТабДок.Область("R5") или ТабДок.Область(5, , 5). Отдельного метода «удалить строку по номеру» в объектной модели табличного документа не предусмотрено.
Чем удаление из табличного документа отличается от удаления из таблицы значений?
Таблица значений — структура данных с методами Удалить и Очистить на уровне строк-коллекций. Табличный документ — визуальная сетка ячеек, где операции выполняются над прямоугольными областями. Если данные ещё можно обработать как таблицу значений, делайте это до вывода в табличный документ.
Почему после удаления строк в цикле остаются лишние строки?
Почти всегда причина в прямом переборе сверху вниз: после удаления строки нижние строки смещаются на её место, а счётчик цикла уже перешёл дальше. Решение — перебор снизу вверх либо уменьшение счётчика на единицу после каждого удаления.
Как удалить строки, которые пользователь выделил в табличном документе на форме?
Интерактивно — клавишей Delete или через контекстное меню, если поле доступно для редактирования. Программно определить выделенную область можно через свойство ВыделенныеОбласти элемента формы, затем удалить каждую область методом УдалитьОбласть с вертикальным смещением.
Пересчитаются ли итоги и номера строк после удаления?
Нет. Содержимое ячеек статично: если в ячейке записана сумма или порядковый номер, после удаления строк эти значения не изменятся. Пересчёт итогов и перенумерацию нужно выполнять в коде отдельно либо формировать документ заново с корректными данными.
Что делать, если при удалении возникает ошибка из-за объединённых ячеек?
Сначала снимите объединение с пересекающихся областей: получите область, проверьте свойство Объединенная, и при необходимости разъедините ячейки перед удалением. Либо скорректируйте границы удаляемой области так, чтобы она не разрывала объединённые диапазоны.
Что важно запомнить
Строки табличного документа удаляются как области методом УдалитьОбласть со смещением по вертикали; при удалении в цикле перебирайте строки снизу вверх. Для полной очистки используйте Очистить с повторной настройкой параметров страницы. Там, где возможно, не выводите лишние строки на этапе формирования — это надёжнее постобработки.