Разработка и Конфигурация · 10 мин
Как очистить поле табличного документа в 1С
Как очистить поле табличного документа в 1С: методы Очистить, ОчиститьОбласть, работа с областями ячеек, типовые ошибки и примеры кода для разработчика.
Поле табличного документа — это элемент управляемой или обычной формы, связанный с реквизитом типа «ТабличныйДокумент». Очистка такого поля требуется при повторном формировании отчёта, сбросе результата перед новым выводом или при подготовке формы к печати другого документа. Если не очистить область перед выводом, новые данные наложатся на старые или добавятся ниже, и пользователь увидит смешанный результат.
В языке 1С предусмотрено несколько способов очистки: метод Очистить() табличного документа, удаление отдельных областей через УдалитьОбласть(), обнуление текста конкретных ячеек и полная пересоздание реквизита. Выбор зависит от того, нужно ли убрать всё содержимое, только данные с сохранением оформления или часть строк.
Важно понимать разницу между полем формы и самим табличным документом: поле лишь отображает объект, поэтому все операции выполняются над реквизитом типа «ТабличныйДокумент», а не над элементом формы. Ниже разобраны конкретные сценарии с примерами кода.
Что такое поле табличного документа и с чем работаем на самом деле
На форме размещается элемент «Поле табличного документа», а его свойство «ПутьКДанным» указывает на реквизит формы с типом «ТабличныйДокумент». Все манипуляции — очистка, вывод областей, изменение ячеек — выполняются программно именно с этим реквизитом. Попытка «очистить элемент формы» напрямую не имеет смысла: элемент лишь визуализирует содержимое.
Табличный документ в 1С — это объект, похожий на лист электронной таблицы: он состоит из ячеек, объединённых областей, рисунков и параметров. У него есть свойства (защита, отображение сетки, фиксация) и методы, среди которых ключевые для нашей задачи — Очистить(), УдалитьОбласть(), ПолучитьОбласть() и Область().
Полная очистка документа методом Очистить()
Самый простой и безопасный способ — вызвать метод Очистить() у табличного документа. Он удаляет всё содержимое: значения ячеек, форматирование, области, рисунки и именованные диапазоны. После вызова документ становится пустым, как только что созданный.
Типовой пример для управляемой формы, где реквизит называется «РезультатТаб»:
&НаКлиенте
Процедура ОчиститьРезультат(Команда)
РезультатТаб.Очистить();
КонецПроцедуры
Метод работает и на клиенте, и на сервере, поскольку табличный документ доступен в обоих контекстах. Это удобно: очистку можно делать в клиентской процедуре без лишнего серверного вызова, что снижает нагрузку и ускоряет интерфейс.
После Очистить() высота документа становится нулевой, поэтому при повторном выводе макета области начнут размещаться с первой строки. Это именно то поведение, которое нужно при перегенерации отчёта.
РезультатТаб.Очистить(); // полная очистка табличного документаОчистка части документа: областей и строк
Когда нужно удалить не весь документ, а только его часть — например, строки данных, оставив шапку, — используется метод УдалитьОбласть(). Он принимает область и способ смещения оставшихся строк.
&НаСервере
Процедура УдалитьСтрокиДанных()
// Удаляем строки с 5 по последнюю, сдвигая остаток вверх
Область = РезультатТаб.Область(5, 1, РезультатТаб.ВысотаТаблицы, РезультатТаб.ШиринаТаблицы);
РезультатТаб.УдалитьОбласть(Область, ТипСмещенияТабличногоДокумента.ПоВертикали);
КонецПроцедуры
Параметр ТипСмещенияТабличногоДокумента определяет, куда сдвинутся ячейки после удаления: по вертикали (вверх) или по горизонтали (влево). Для удаления строк почти всегда нужен вариант «ПоВертикали», иначе структура таблицы разрушится.
Если нужно не удалить строки, а только стереть значения в ячейках, сохранив форматирование и высоту, обратитесь к области и установите пустой текст:
ОбластьЯчеек = РезультатТаб.Область(2, 1, 10, 5);
ОбластьЯчеек.Текст = "";
ОбластьЯчеек.Очистить(Истина, Ложь, Ложь); // очистить только значения
У области ячеек собственный метод Очистить() с параметрами: что именно очищать — значения, формат, границы. Это даёт тонкий контроль, когда шаблон оформления должен остаться нетронутым.
Способы очистки
Удаляет всё содержимое целиком. Подходит перед повторным формированием отчёта или печатной формы.
Убирает заданный диапазон строк или колонок со смещением остатка. Подходит для удаления данных при сохранении шапки.
Стирает значения или формат выбранных ячеек без удаления строк. Подходит для шаблонов с фиксированной структурой.
Очистка при повторном формировании отчёта
Наиболее частый сценарий — отчёт на управляемой форме, где пользователь меняет параметры и нажимает «Сформировать». Без очистки каждый новый результат добавится ниже предыдущего, и документ будет расти. Правильная последовательность: очистить, вывести макет заново, при необходимости обновить отображение.
&НаСервере
Процедура СформироватьНаСервере()
РезультатТаб.Очистить();
Макет = РеквизитФормыВЗначение("Объект").ПолучитьМакет("МакетОтчета");
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
РезультатТаб.Вывести(ОбластьШапка);
// ... вывод строк данных
КонецПроцедуры
Если отчёт строится через СКД (схему компоновки данных), очистку обычно выполняет сам механизм при вызове Вывести() процессора вывода с параметром очистки, но при ручном выводе областей ответственность за очистку лежит на разработчике. Полезно также сбрасывать свойство «Защита» и состояние «ОтображатьСетку», если они менялись под конкретный результат.
- 1Вызовите РезультатТаб.Очистить() в начале процедуры формирования
- 2Получите макет и выведите области заново через Вывести() или Присоединить()
- 3Проверьте, что высота документа соответствует новым данным, а старых строк нет
Особенности для управляемых и обычных форм
В управляемых формах реквизит «ТабличныйДокумент» доступен и на клиенте, поэтому Очистить() можно вызывать в клиентском коде без обращения к серверу. Это рекомендуемый подход для кнопки «Очистить», так как исключает лишний серверный вызов.
В обычных формах (толстый клиент, режим обычного приложения) элемент формы «ПолеТабличногоДокумента» тесно связан с реквизитом, и очистка выполняется тем же методом: ЭлементыФормы.Результат.Очистить() или через реквизит. Разницы в логике нет, отличается только способ обращения к объекту.
Учтите, что в управляемой форме табличный документ сериализуется между клиентом и сервером. Если документ большой, частые серверные вызовы с его передачей замедляют работу. Очистка на клиенте и формирование на сервере с однократной передачей результата — оптимальная схема.
Типичные ошибки и как их избежать
Первая распространённая ошибка — очистка не того объекта. Разработчик создаёт локальную переменную «ТабДок = Новый ТабличныйДокумент», выводит в неё данные, но забывает присвоить результат реквизиту формы. Очистка реквизита при этом не влияет на локальную переменную, и наоборот. Всегда проверяйте, с каким именно объектом работаете.
Вторая ошибка — вызов Очистить() после вывода данных вместо вызова до. Симптом очевиден: отчёт пустой, хотя код формирования отработал без ошибок. Порядок должен быть строго: очистка → вывод → отображение.
Третья проблема — очистка на сервере в то время, как пользователь редактировал документ на клиенте. Изменения, сделанные вручную в поле, будут потеряны без предупреждения. Если ручное редактирование допускается, перед очисткой стоит запросить подтверждение.
Проверка результата очистки
Убедиться, что документ действительно пуст, можно через свойства ВысотаТаблицы и ШиринаТаблицы: у пустого документа оба равны нулю. Это удобный программный критерий для отладки и для условий в коде.
Если РезультатТаб.ВысотаТаблицы = 0 Тогда
Сообщить("Документ пуст");
КонецЕсли;
Визуально признак успешной очистки — пустое поле на форме без сетки данных и без полосы прокрутки к старым строкам. Если после очистки внизу остаются «хвосты» прежнего отчёта, значит, очистка не выполнялась или выполнялась над другим объектом.
Как проверить результат
Равно 0
Больше 0 — очистка не выполнена или выполнена над другим объектом
Пустая область без строк и прокрутки
Видны остатки прежнего отчёта
Данные начинаются с первой строки
Новые строки добавлены ниже старых
FAQ
Чем отличается Очистить() табличного документа от Очистить() области ячеек?
Метод документа вызывается без параметров и удаляет всё содержимое целиком. Метод области ячеек принимает параметры, позволяющие выборочно стереть значения, формат или границы, сохраняя остальное. Область не удаляет строки — она лишь меняет содержимое ячеек.
Можно ли очистить поле табличного документа на клиенте без серверного вызова?
Да. Реквизит типа ТабличныйДокумент доступен в клиентском контексте управляемой формы, поэтому РезультатТаб.Очистить() работает в клиентской процедуре. Это быстрее серверного вызова и является рекомендуемым подходом для кнопки очистки.
Почему после очистки и повторного формирования отчёт выводится ниже прежнего места?
Такое происходит, если очистка вызывалась не для того объекта, который связан с полем формы, либо вывод выполняется методом Присоединить() вместо Вывести(). Проверьте, что очищается именно реквизит формы и что очистка стоит первой строкой процедуры формирования.
Как удалить только строки данных, оставив шапку отчёта?
Определите номер первой строки данных, получите область от неё до конца документа через Область() и удалите её методом УдалитьОбласть() со смещением ПоВертикали. Шапка выше указанной строки останется нетронутой.
Теряются ли настройки расшифровки при очистке?
Да. Очистить() удаляет вместе с содержимым и данные расшифровки ячеек. Если отчёт использует интерактивную расшифровку, после очистки прежние ссылки на ячейки недействительны, и расшифровку нужно формировать заново вместе с новым выводом.
Можно ли отменить очистку табличного документа?
Нет, метод необратим: содержимое удаляется без возможности восстановления. Если данные могут понадобиться, перед очисткой сохраните копию документа в переменную или файл через метод Записать().
Что важно запомнить
Очистка выполняется методом Очистить() у реквизита типа ТабличныйДокумент, а не у элемента формы. Для частичного удаления используйте УдалитьОбласть() со смещением по вертикали, для стирания значений без удаления строк — очистку области ячеек. Всегда очищайте документ до вывода новых данных и проверяйте результат через ВысотаТаблицы.