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

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

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

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

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

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

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

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

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

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

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

Печатная форма, макет, отчёт. Удаление через УдалитьОбласть() со сдвигом ячеек. Нет именованных колонок.

Табличная часть объекта

Строки документа или справочника. Удаление через Удалить(Строка) или по индексу. Есть именованные реквизиты.

Таблица значений

Временная структура данных в памяти. Удаление через Удалить() коллекции строк, поиск через Найти() и НайтиСтроки().

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

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

bsl
// ТабДок — объект ТабличныйДокумент
НомерСтроки = 5;
ОбластьСтроки = ТабДок.ПолучитьОбласть("R" + Формат(НомерСтроки, "ЧГ="));
ТабДок.УдалитьОбласть(ОбластьСтроки.Область(), ТипСмещенияТабличногоДокумента.ПоВертикали);

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

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

Удаление строк по условию в цикле

На практике чаще нужно удалить не конкретную строку, а все строки, подходящие под условие: пустые строки, строки с нулевой суммой, служебные строки-разделители. Для этого табличный документ обходят снизу вверх и проверяют значения ячеек через метод Область() с координатами.

bsl
ВысотаТаблицы = ТабДок.ВысотаТаблицы;
Для НомерСтроки = -ВысотаТаблицы По -1 Цикл
    ТекНомер = -НомерСтроки;
    ЗначениеЯчейки = ТабДок.Область(ТекНомер, 2).Текст;
    Если ПустаяСтрока(ЗначениеЯчейки) Тогда
        ОбластьСтроки = ТабДок.ПолучитьОбласть("R" + Формат(ТекНомер, "ЧГ="));
        ТабДок.УдалитьОбласть(ОбластьСтроки.Область(), ТипСмещенияТабличногоДокумента.ПоВертикали);
    КонецЕсли;
КонецЦикла;

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

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

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

Очистка содержимого строки без удаления

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

bsl
ОбластьСтроки = ТабДок.Область("R" + Формат(НомерСтроки, "ЧГ="));
ОбластьСтроки.Очистить(Истина, Истина, Истина); // значения, формат, границы

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

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

Значительная часть запросов про «удаление строки табличного документа» на деле касается табличной части — например, списка товаров в документе «Реализация товаров и услуг». Здесь синтаксис проще: коллекция строк имеет метод Удалить(), принимающий строку или её индекс.

bsl
// Удаление по условию, обход снизу вверх
ТЧ = ДокументОбъект.Товары;
Для Индекс = -ТЧ.Количество() + 1 По 0 Цикл
    СтрокаТЧ = ТЧ[-Индекс];
    Если СтрокаТЧ.Количество = 0 Тогда
        ТЧ.Удалить(СтрокаТЧ);
    КонецЕсли;
КонецЦикла;
ДокументОбъект.Записать();

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

После удаления строк из табличной части объекта изменения существуют только в памяти. Чтобы они попали в базу, объект нужно записать методом Записать(). Если удаление выполняется в форме документа, запись произойдёт при стандартном нажатии «Записать» или «Провести» пользователем.

Удаление строки таблицы значений

Таблица значений используется как промежуточное хранилище при обработках и отчётах. Удаление строк в ней аналогично табличной части: метод Удалить() коллекции строк. Для поиска удаляемых строк удобны методы Найти() и НайтиСтроки().

bsl
Отбор = Новый Структура("Сумма", 0);
НайденныеСтроки = ТаблицаЗначений.НайтиСтроки(Отбор);
Для Каждого СтрокаТЗ Из НайденныеСтроки Цикл
    ТаблицаЗначений.Удалить(СтрокаТЗ);
КонецЦикла;

Метод НайтиСтроки() возвращает массив найденных строк, поэтому его можно безопасно обходить в прямом порядке — массив не связан с индексами таблицы. Это самый читаемый и надёжный способ массового удаления по условию.

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

Проверка результата и отладка

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

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

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

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

ВысотаТаблицы после удаления
Норма

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

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

Не изменилась — сдвиг не выполнен, удалено только содержимое

Итоговая строка печатной формы
Норма

Поднялась вплотную к последней строке данных

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

Между данными и итогом пустая полоса

Табличная часть после записи
Норма

Лишние строки отсутствуют, суммы пересчитаны

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

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

FAQ

Можно ли удалить сразу несколько подряд идущих строк табличного документа?

Да. Получите область диапазона через ПолучитьОбласть("R5:R9") — она охватит строки с пятой по девятую — и передайте её в УдалитьОбласть со сдвигом ПоВертикали. Все строки диапазона удалятся за один вызов, что быстрее и безопаснее, чем удалять по одной.

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

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

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

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

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

Через объект данных формы: Объект.Товары.Удалить(Строка) в серверной процедуре, либо стандартной командой удаления текущей строки таблицы через Элементы.Товары.ТекущаяСтрока. Изменения применятся при записи документа.

Влияет ли удаление строк табличного документа на данные в базе?

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

Что делать, если строка входит в объединённую область ячеек?

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

Итог

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

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