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

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

Как программно очистить поле ввода в 1С

Как программно очистить поле ввода в 1С: обнуление реквизитов формы, очистка строк, чисел и ссылок, работа с таблицами значений и типовые ошибки разработчика.

Очистка поля ввода — одна из самых частых задач при разработке форм в 1С: сброс фильтров, подготовка формы к вводу новых данных, реакция на выбор пользователя. Проблема в том, что универсальной команды «очистить всё» не существует: способ зависит от типа данных реквизита, привязанного к полю, и от того, где находится поле — на форме, в табличной части или в динамическом списке.

Ключевой принцип: поле ввода на форме — это только визуальное отображение. Реальные данные хранятся в реквизите формы или объекта, поэтому очищать нужно именно реквизит, а не «поле». Попытка манипулировать элементом формы напрямую обычно заканчивается тем, что на экране поле выглядит пустым, а в данных значение осталось — и попадёт в запись или запрос.

Ниже разобраны рабочие способы очистки для основных типов данных, особенности управляемых и обычных форм, очистка табличных частей и типичные ошибки, из-за которых «очищенное» поле продолжает вести себя как заполненное.

Как устроена связь поля ввода с данными

Каждое поле ввода на форме связано с реквизитом через свойство «ПутьКДанным» (DataPath). Когда пользователь вводит текст, платформа записывает значение в реквизит; когда реквизит меняется программно, платформа перерисовывает поле. Поэтому правильная очистка — это присваивание пустого значения реквизиту, а не поиск элемента формы и попытка «стереть» его содержимое.

В управляемых формах обращение к реквизиту идёт через объект формы: Объект.Наименование = ""; для реквизита объекта или ЭтаФорма.Комментарий = ""; для реквизита самой формы. В обычных формах синтаксис похож, но доступ к элементам формы прямее — тем не менее принцип тот же: меняем данные, а не элемент.

Очистка строковых и числовых полей

Для строки пустое значение — это пустая строка: Объект.Комментарий = "";. Учтите, что строка из одних пробелов — не пустая, и проверка ПустаяСтрока() её не отловит, если пробелы там действительно есть. Для надёжной очистки после пользовательского ввода полезно применять СокрЛП() перед проверками.

Для числового поля пустое значение — ноль: Объект.Количество = 0;. Здесь есть нюанс восприятия: пользователь может не отличить «очищено» от «введён ноль». Если для бизнес-логики это разные состояния, используйте реквизит составного типа (число + неопределено) или отдельный признак заполненности.

Для даты пустое значение — начало отсчёта: Объект.ДатаНачала = '00010101';. Для булева — Ложь. Эти значения платформа считает «пустыми», и функция ЗначениеЗаполнено() вернёт для них Ложь.

1c
Объект.Комментарий = "";
Объект.Количество = 0;
Объект.ДатаНачала = '00010101';
Объект.Согласовано = Ложь;

Очистка ссылочных полей и полей составного типа

Ссылочные реквизиты (СправочникСсылка, ДокументСсылка и т.п.) очищаются присваиванием пустой ссылки: Объект.Контрагент = Справочники.Контрагенты.ПустаяСсылка();. Для документов аналогично — через менеджер соответствующего вида: Документы.РеализацияТоваровУслуг.ПустаяСсылка().

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

Очистка табличных частей и таблиц значений на форме

Для табличной части объекта или таблицы значений, выведенной на форму, используется метод Очистить(): Объект.Товары.Очистить();. Метод удаляет все строки, и связанный элемент формы (таблица) обновляется автоматически. Если нужно удалить только часть строк — перебирайте коллекцию с конца или собирайте строки к удалению в отдельный массив, затем удаляйте через Удалить().

Для динамических списков метод Очистить() не применяется: список отражает данные базы, и «очистить» его можно только изменив запрос или отбор. Если задача — сбросить отбор, установленный пользователем или программно, работайте с коллекцией Список.Отбор.Элементы: удалите добавленные элементы отбора или отключите их, установив Использование = Ложь.

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

Очистка нескольких полей одним проходом

Когда нужно сбросить форму целиком (например, кнопка «Очистить фильтры»), удобно собрать имена реквизитов в массив и пройти по нему циклом. Для реквизитов формы обращение идёт через ЭтаФорма[ИмяРеквизита], что позволяет работать по имени строкой. Тип значения при этом нужно либо знать заранее, либо определять через ТипЗнч().

Альтернатива для формы объекта — повторное чтение объекта из базы (Прочитать() в обычной форме или метод прочитать у расширения формы объекта в управляемой), если требуется откатить все изменения, а не только очистить поля. Но это перезапишет и те данные, которые пользователь, возможно, хотел сохранить, поэтому применяйте такой подход осознанно.

1c
ОчищаемыеПоля = Новый Массив;
ОчищаемыеПоля.Добавить("Контрагент");
ОчищаемыеПоля.Добавить("Договор");
ОчищаемыеПоля.Добавить("Комментарий");

Для Каждого ИмяПоля Из ОчищаемыеПоля Цикл
    ЭтаФорма[ИмяПоля] = Неопределено;
КонецЦикла;

Типичные ошибки и как их избежать

Самая частая ошибка — попытка очистить элемент формы вместо реквизита. В управляемых формах у элемента «ПолеВвода» вообще нет свойства «Значение», доступного для записи, поэтому код либо не работает, либо разработчик придумывает обходные пути, которые ломаются при обновлении формы. Всегда ищите реквизит, указанный в «ПутьКДанным».

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

Третья группа проблем — события. После программной очистки не срабатывают обработчики «ПриИзменении», потому что они вызываются интерактивным вводом. Если после очистки нужно пересчитать зависимые поля, вызовите соответствующую процедуру явно.

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

Проверка результата и отладка

После очистки проверяйте состояние данных, а не экрана. Универсальная функция — ЗначениеЗаполнено(Значение): она корректно обрабатывает пустые строки, нули, пустые даты, пустые ссылки и Неопределено. Для строк дополнительно полезна ПустаяСтрока(), но помните про пробелы.

Если поле на экране осталось заполненным после присваивания пустого значения, проверьте: тот ли реквизит вы меняете (посмотрите «ПутьКДанным» в свойствах поля), не перезаписывает ли значение другой обработчик (например, «ПриСозданииНаСервере» или подписка на событие), и не выполняется ли код в другом экземпляре формы.

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

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

Значение реквизита после очистки
Норма

ЗначениеЗаполнено() возвращает Ложь

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

Функция возвращает Истина — очищен не тот реквизит или значение перезаписано

Отображение поля на форме
Норма

Поле визуально пустое после выполнения кода

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

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

Зависимые поля и итоги
Норма

Пересчитаны вызовом соответствующих процедур

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

Показывают устаревшие данные — обработчики не вызваны явно

Итог

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

Очищайте реквизит данных, а не элемент формы. Подбирайте пустое значение под тип: "", 0, '00010101', пустая ссылка или Неопределено. Табличные части очищайте методом Очистить(), отборы динамических списков — через коллекцию отбора. После программной очистки вызывайте зависимые пересчёты вручную и проверяйте результат через ЗначениеЗаполнено().

Частые вопросы

Как очистить поле ввода, если оно не связано с реквизитом?

В управляемой форме поле ввода без пути к данным практически не используется. Добавьте реквизит формы нужного типа, свяжите поле с ним через «ПутьКДанным» и очищайте реквизит. Это единственный надёжный способ управлять значением поля программно.

Чем отличается Неопределено от пустой ссылки при очистке?

Пустая ссылка — это значение конкретного ссылочного типа, которое можно записать в базу и сравнить в запросе. Неопределено — отсутствие значения вообще; оно подходит для составных типов и реквизитов формы, но не всегда допустимо для записываемых реквизитов объекта со строгим типом.

Почему после очистки поле снова заполняется старым значением?

Чаще всего значение перезаписывает другой код: обработчик ожидания, подписка на событие, пересчёт в «ПриИзменении» связанного поля или повторное чтение объекта. Поставьте точку останова сразу после строки очистки и пройдите код по шагам — найдёте место, где значение возвращается.

Как очистить все строки табличной части, кроме помеченных?

Метод Очистить() удаляет всё, поэтому действуйте иначе: соберите строки к удалению в массив по условию, затем в цикле вызовите Удалить() для каждой. Удалять строки прямо в цикле перебора коллекции нельзя — индексы сдвигаются, и часть строк будет пропущена.

Нужно ли вызывать ОбновитьОтображениеДанных() после очистки?

Обычно нет: при изменении реквизитов формы платформа обновляет связанные элементы автоматически. Метод может понадобиться в редких случаях — например, когда меняются данные, от которых зависит оформление, но сами реквизиты формы не изменялись.

Как сбросить поле поиска в динамическом списке?

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