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