При разработке в управляемом приложении 1С программисты часто сталкиваются с особенностью: объект ТабличныйДокумент позволяет менять оформление ячеек на клиенте, но метод Очистить() требует серверного контекста. В этой статье мы подробно разберем, почему платформа накладывает такие ограничения, и рассмотрим несколько эффективных способов очистки документа, в том числе без явного написания серверных процедур.
Для начала проанализируем ситуацию с точки зрения архитектуры «Клиент-Сервер». В управляемом приложении 1С реализовано четкое разделение между данными и их представлением. Рассмотрим основные факторы:
Очистить() полностью уничтожает внутреннюю структуру данных, что является фундаментальной операцией, которую платформа доверяет только серверу.SpreadsheetDocument на JS, размер программного ядра платформы значительно бы увеличился. Это привело бы к замедлению работы интерфейса.Рассмотрим стандартный способ, который рекомендует документация. Если нам нужно очистить реквизит формы с типом ТабличныйДокумент, мы создаем серверную процедуру. Выясним, как это выглядит в коде:
&НаКлиенте
Процедура ОчиститьДокумент(Команда)
ОчиститьНаСервере();
КонецПроцедуры
&НаСервере
Процедура ОчиститьНаСервере()
// Обращаемся напрямую к реквизиту формы
ОбъектРезультат.Очистить();
КонецПроцедуры
Этот метод является самым «чистым» с точки зрения логики платформы, но он требует контекстного вызова сервера, что может быть накладно при медленном соединении. Однако, это гарантирует, что серверный объект будет приведен в исходное состояние правильно.
Проанализируем интересную особенность: хотя вызвать метод Очистить() на клиенте нельзя, нам никто не запрещает присвоить реквизиту формы новый объект того же типа. Это сработает как «неявная очистка». Разберем пример:
&НаКлиенте
Процедура ОчиститьНаКлиентеБыстро(Команда)
// Просто заменяем старый объект новым пустым
ИмяРеквизитаТД = Новый ТабличныйДокумент;
КонецПроцедуры
Почему это работает? Когда вы выполняете инструкцию Новый ТабличныйДокумент, создается пустой экземпляр. Присваивая его реквизиту формы, вы заставляете платформу при следующем обращении к серверу просто заменить старый серверный объект новым. С точки зрения пользователя результат идентичен вызову Очистить(), но программно мы обошли ограничение доступности метода.
Существует еще один специфический способ, который иногда используют разработчики для форсированной очистки памяти или сброса состояния реквизита. Выясним, как применить типизацию для очистки:
&НаКлиенте
Процедура ОчиститьЧерезТип(Команда)
// В некоторых случаях это может привести к потере типа реквизита,
// если он не жестко типизирован на форме
ИмяРеквизитаТД = Неопределено;
// А затем возвращаем пустой документ
ИмяРеквизитаТД = Новый ТабличныйДокумент;
КонецПроцедуры
Этот метод менее предпочтителен, чем прямое создание Новый ТабличныйДокумент, так как может вызвать ошибки в коде, который ожидает наличие объекта, а не Неопределено.
Проанализируем границы дозволенного для объекта ТабличныйДокумент на стороне клиента, чтобы лучше понимать возможности оптимизации интерфейса:
Доступно на клиенте:
ТолькоПросмотр).Доступно только на сервере:
Очистить() — полная очистка данных.Вывести() и Присоединить() — формирование документа по макету.Прочитать() и Записать() — работа с файловой системой (кроме веб-клиента, где есть свои нюансы работы с файлами).Рисунки и Области (в части их создания и удаления).Разберем, какой подход выбрать в реальной практике. Если ваша задача — просто очистить поле на форме перед формированием нового отчета, используйте способ Решение 2 (Новый ТабличныйДокумент). Это сэкономит время на разработку и уменьшит количество серверных вызовов в коде.
Однако, если очистка является частью большой цепочки серверных вычислений (например, вы сначала очищаете документ, а потом тут же заполняете его данными из запроса), всегда используйте Решение 1 (метод Очистить() на сервере). Это обеспечит консистентность данных и позволит избежать лишних пересылок тяжелых объектов между клиентом и сервером.
Помните, что понимание того, «где живут данные», — это ключ к написанию производительного кода в 1С. Работа с табличным документом — классический пример того, как платформа балансирует между удобством интерфейса и скоростью обработки данных.