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

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

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

Способы очистить табличный документ в 1С на тонком клиенте: метод Очистить(), удаление областей, работа с реквизитами формы. Примеры кода, ошибки и FAQ.

Табличный документ в 1С — универсальный объект: в нём выводятся печатные формы, отчёты, произвольные макеты. Когда документ выводится повторно или пользователь меняет параметры формирования, старое содержимое нужно убрать, иначе новые области добавятся к уже выведенным. На тонком клиенте задача усложняется разделением кода между клиентом и сервером: поле табличного документа живёт на форме, а серверный вызов требует правильной передачи данных.

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

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

Почему очистка на тонком клиенте работает иначе

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

На форме табличный документ обычно представлен реквизитом формы типа ТабличныйДокумент, связанным с элементом «Поле табличного документа». Сам реквизит хранится на сервере, а клиент получает только его отображение. Любые операции с содержимым — очистка, вывод областей, изменение ячеек — выполняются в серверном контексте.

Из этого следует практическое правило: обработчик кнопки «Очистить» или «Сформировать» на клиенте должен быть тонкой обёрткой, которая вызывает серверную процедуру. Вся логика работы с табличным документом сосредоточена в директиве &НаСервере.

Базовый способ: метод Очистить() на сервере

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

&НаКлиенте

Процедура ОчиститьДокумент(Команда)

ОчиститьДокументНаСервере();

КонецПроцедуры

&НаСервере

Процедура ОчиститьДокументНаСервере()

ТабДок.Очистить();

КонецПроцедуры

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

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

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

Очистка при повторном формировании отчёта

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

Стандартный приём — вызывать Очистить() первой строкой серверной процедуры формирования, до получения макета и вывода областей:

&НаСервере

Процедура СформироватьНаСервере()

ТабДок.Очистить();

Макет = ПолучитьМакетОтчета();

ОбластьШапка = Макет.ПолучитьОбласть("Шапка");

ТабДок.Вывести(ОбластьШапка);

// ... вывод остальных областей

КонецПроцедуры

Такой порядок гарантирует, что документ всегда содержит только результат последнего формирования. Дополнительно после вывода имеет смысл установить свойства ТабДок.ТолькоПросмотр = Истина и ТабДок.ОтображатьСетку = Ложь, если документ предназначен только для просмотра и печати.

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

Точечная очистка: удаление областей и ячеек

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

&НаСервере

Процедура УдалитьСтрокиДанных()

ОбластьДанных = ТабДок.Область("Данные");

Если ОбластьДанных <> Неопределено Тогда

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

КонецЕсли;

КонецПроцедуры

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

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

Сравнение вариантов очистки

ТабДок.Очистить()

Полная очистка всего документа. Подходит для повторного формирования отчётов. Удаляет области, рисунки и настройки печати.

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

Удаление конкретного диапазона со сдвигом содержимого. Подходит для точечного удаления строк или секций.

Область.Очистить()

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

Работа через реквизит формы и ДанныеФормыВЗначение

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

Для реквизита формы основной записи (например, форма документа) используется связка РеквизитФормыВЗначение("Объект") и обратно ЗначениеВРеквизитФормы(). Очистку табличного документа, хранящегося в хранилище значений, выполняют, извлекая его через Хранилище.Получить(), очищая и помещая обратно.

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

Типичные ошибки и их признаки

Самая распространённая ошибка — попытка вызвать Очистить() в клиентской процедуре. Компилятор модуля формы либо откажется сохранять код с директивой &НаКлиенте, либо в момент выполнения возникнет ошибка «Метод объекта не обнаружен» или сообщение о недоступности типа на тонком клиенте. Решение одно — перенести вызов в серверную процедуру.

Вторая частая проблема — очистка «визуально не сработала»: код выполнен, но поле на форме показывает старое содержимое. Обычно причина в том, что очищена локальная переменная или копия документа, а не реквизит формы. Проверьте, что обращение идёт именно к реквизиту формы, связанному с элементом поля.

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

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

Проверка результата и ограничения

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

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

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

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

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

ВысотаТаблицы после очистки
Норма

Равна 0

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

Больше 0 — очищена не та переменная или не реквизит формы

Поле на форме
Норма

Пустое, без полос прокрутки

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

Показывает старое содержимое — нет связи элемента с реквизитом

Повторное формирование
Норма

Данные начинаются с первой строки, без дублей

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

Новые области добавляются ниже старых — очистка не вызывается

Печать после очистки
Норма

Ориентация и масштаб корректны

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

Настройки сброшены — их не установили заново после Очистить()

FAQ

Можно ли очистить табличный документ полностью на клиенте без серверного вызова?

Нет. Тип «ТабличныйДокумент» недоступен в контексте тонкого клиента, поэтому любые операции с его содержимым выполняются на сервере. Клиентская процедура может только инициировать серверный вызов.

Чем Очистить() отличается от присвоения нового пустого документа?

Присвоение ТабДок = Новый ТабличныйДокумент заменяет объект целиком и тоже работает, но метод Очистить() сохраняет существующий объект, что предсказуемее для реквизита формы. На практике оба подхода дают пустой документ; Очистить() считается более читаемым и безопасным вариантом.

После очистки пропали настройки печати — это нормально?

Да. Метод Очистить() сбрасывает параметры страницы: ориентацию, поля, масштаб, колонтитулы. Их нужно устанавливать заново после каждой очистки, обычно в той же серверной процедуре формирования.

Как очистить только данные, оставив шапку отчёта?

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

Почему после очистки на форме всё равно виден старый документ?

Чаще всего очищена локальная переменная или копия, а не реквизит формы. Проверьте, что серверная процедура обращается к реквизиту по имени, а элемент «Поле табличного документа» связан с этим реквизитом в свойствах.

Нужно ли спрашивать пользователя перед очисткой?

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

Итог

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

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