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