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

Разработка и Конфигурация · 11 мин

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

Способы удаления строк в табличном документе 1С: метод УдалитьОбласть, интерактивное удаление, очистка по условию. Примеры кода и типичные ошибки.

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

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

Чем табличный документ отличается от таблицы значений

Частая путаница у начинающих разработчиков — попытка удалить строку табличного документа так же, как строку таблицы значений. Это разные объекты. У таблицы значений есть коллекция строк и метод Удалить(), а табличный документ — это сетка ячеек, как лист Excel. У него нет понятия «строка-запись», есть только области с адресами вида R10C1:R10C10.

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

Удаление строк интерактивно, без программирования

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

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

Удаление строк программно: метод УдалитьОбласть

Базовый способ удалить строки из табличного документа в коде — метод УдалитьОбласть(Область, ТипСмещения). Первый параметр — область, которую нужно удалить, второй — направление сдвига оставшихся ячеек. Для удаления целых строк используется ТипСмещенияТабличногоДокумента.СмещениеПоВертикали.

Область строк задаётся через метод Область() с координатами: первая строка, первая колонка, последняя строка, последняя колонка. Если колонки не указывать, область захватит строки целиком. Пример удаления строк с 5 по 8:

ТабДок = Новый ТабличныйДокумент;

// ... заполнение документа

ОбластьУдаления = ТабДок.Область(5, , 8);

ТабДок.УдалитьОбласть(ОбластьУдаления, ТипСмещенияТабличногоДокумента.СмещениеПоВертикали);

bsl
ОбластьУдаления = ТабДок.Область(5, , 8);
ТабДок.УдалитьОбласть(ОбластьУдаления, ТипСмещенияТабличногоДокумента.СмещениеПоВертикали);

После выполнения строки 5–8 исчезнут, а бывшая девятая строка станет пятой. Учитывайте это, если дальше по коду обращаетесь к ячейкам по абсолютным адресам — координаты ниже удалённого блока изменятся.

Удаление строк по условию: обход снизу вверх

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

Пример: удалить все строки, где в первой колонке пустое значение:

ВсегоСтрок = ТабДок.ВысотаТаблицы();

Для НомерСтроки = -ВсегоСтрок По -1 Цикл

Номер = -НомерСтроки;

ТекстЯчейки = ТабДок.Область(Номер, 1).Текст;

Если ПустаяСтрока(ТекстЯчейки) Тогда

ТабДок.УдалитьОбласть(ТабДок.Область(Номер, , Номер),

ТипСмещенияТабличногоДокумента.СмещениеПоВертикали);

КонецЕсли;

КонецЦикла;

Более читаемый вариант — цикл с шагом:

НомерСтроки = ТабДок.ВысотаТаблицы();

Пока НомерСтроки >= 1 Цикл

Если ПустаяСтрока(ТабДок.Область(НомерСтроки, 1).Текст) Тогда

ТабДок.УдалитьОбласть(ТабДок.Область(НомерСтроки, , НомерСтроки),

ТипСмещенияТабличногоДокумента.СмещениеПоВертикали);

КонецЕсли;

НомерСтроки = НомерСтроки - 1;

КонецЦикла;

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

Удаление строк при выводе по шаблону

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

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

Очистка документа целиком и удаление через Очистить

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

Элементы.ТабличныйДокумент.Очистить(); // для реквизита формы

// или

ТабДок.Очистить(); // для программно созданного объекта

Альтернатива — создать новый объект Новый ТабличныйДокумент и присвоить его реквизиту. Результат аналогичен, но при повторном использовании переменной метод Очистить() обычно удобнее и нагляднее.

Сравнение вариантов

УдалитьОбласть

Точечное удаление конкретных строк или диапазона. Требует контроля смещения координат

Не выводить строки при формировании

Лучший вариант при заполнении по макету: нет лишних операций и риска сбить нумерацию

Очистить

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

Проверка результата и типичные ошибки

После программного удаления проверьте результат до вывода пользователю. Контрольные точки: высота документа уменьшилась на ожидаемое число строк, итоговые области (подписи, суммы) остались внизу и не «оторвались», объединённые ячейки не пересекались с удалённой областью.

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

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

ВысотаТаблицы() до и после
Норма

Уменьшилась ровно на число удалённых строк

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

Высота не изменилась — область удаления указана неверно

Содержимое строк под удалённым блоком
Норма

Данные сдвинулись вверх без пропусков

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

Часть строк потеряна или продублирована — обход шёл сверху вниз

Итоговые области и подписи
Норма

Расположены сразу после последней строки данных

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

Между данными и подвалом пустые строки или подвал удалён вместе с данными

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

Ограничения и когда нужна осторожность

Метод УдалитьОбласть необратим в рамках текущего объекта: если документ сформирован программно и не сохранён, восстановить удалённые строки можно только повторным формированием. Перед массовым удалением по условию полезно сначала вывести документ на экран и убедиться, что условие отбирает именно те строки.

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

Итог

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

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

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

Как удалить последнюю строку табличного документа?

Получите высоту через ВысотаТаблицы() и удалите область с этим номером строки: ТабДок.УдалитьОбласть(ТабДок.Область(ТабДок.ВысотаТаблицы(), , ТабДок.ВысотаТаблицы()), ТипСмещенияТабличногоДокумента.СмещениеПоВертикали).

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

Да. Если область имеет имя, получите её через ТабДок.Область("ИмяОбласти") и передайте в УдалитьОбласть. Это удобно для удаления целых логических блоков без расчёта координат.

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

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

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

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

Чем отличается УдалитьОбласть от Очистить?

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

Можно ли отменить удаление строк программно?

Нет, встроенной отмены у табличного документа нет. Чтобы иметь возможность восстановить данные, сохраните копию документа перед удалением — например, присвойте его другой переменной через вывод в новый объект или сохраните в файл методом Записать().