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