Очистка поля ввода на управляемой форме программно
Содержание
Чтобы очистить поле на форме, не ищите у него метод Очистить() или Обнулить() — у поля ввода такого метода нет. Поле лишь показывает значение реквизита, а чистится сам реквизит: ему присваивают пустое значение нужного типа. Для строки это "", для числа 0, для даты пустая дата, для ссылки — пустая ссылка справочника или документа.
То есть в коде вы пишете не «очисти поле», а «положи в реквизит пустоту». Одна строка на управляемой форме 1С 8.3:
Объект.Контрагент = Справочники.Контрагенты.ПустаяСсылка();
Ниже — пустые значения для каждого типа, где разместить такой код, как сбросить отбор динамического списка, что делать с составными типами и как очистить сразу десяток реквизитов одним циклом.
Поле, реквизит и пустое значение: что чистим на самом деле
На управляемой форме есть три разные сущности, и путаница между ними — причина половины вопросов про очистку.
- 🧩 Поле (элемент формы, тип
ПолеФормы) — то, что видит пользователь: рамка ввода, кнопка выбора. Данных само по себе не хранит. - 📦 Реквизит формы — переменная формы, в которой лежит значение. Поле «привязано» к реквизиту через свойство
ПутьКДанным. - 🗂️ Реквизит объекта — адресуется через
Объект.ИмяРеквизита, если форма открыта для документа или элемента справочника.
Очищаем всегда данные, то есть реквизит. Поле после этого перерисуется само.
Если поле привязано к реквизиту формы ДатаНачала, пишите просто ДатаНачала = '00010101';. Если к реквизиту объекта — Объект.ДатаНачала = '00010101';. Имя после точки должно совпадать с тем, что указано в ПутьКДанным поля.
«Пустое значение» — это не Неопределено для любого типа. Для типизированного реквизита (число, дата, конкретный справочник) пустота имеет свой вид, и присвоить Неопределено числу нельзя — будет ошибка типа. Поэтому сначала разберёмся с типами.
Пустое значение для каждого типа реквизита
Самый частый способ — присвоить реквизиту пустое значение его же типа. Таблица-шпаргалка:
| Тип реквизита | Чем очистить |
|---|---|
| Строка | "" |
| Число | 0 |
| Дата | '00010101' (пустая дата) |
| Булево | Ложь |
| СправочникСсылка | Справочники.Имя.ПустаяСсылка() |
| ДокументСсылка | Документы.Имя.ПустаяСсылка() |
| ПеречислениеСсылка | Перечисления.Имя.ПустаяСсылка() |
| Составной / необязательный | Неопределено |
Примеры в коде — очистка четырёх полей карточки:
Объект.Комментарий = ""; // строка
Объект.Сумма = 0; // число
Объект.ДатаОплаты = '00010101'; // дата
Объект.Организация = Справочники.Организации.ПустаяСсылка(); // ссылка
Пустая дата записывается литералом '00010101' — это 1 января 0001 года, внутреннее «ничто» для даты в 1С. Ноль в поле даты писать не нужно, он туда не встанет.
Для ссылочного поля "" и 0 не подойдут — получите ошибку преобразования типа. Ссылку чистят только пустой ссылкой соответствующего менеджера или, если тип составной, значением Неопределено.
Проверить, что поле уже пустое, помогает функция ЗначениеЗаполнено(): она возвращает Ложь для пустой ссылки, нуля, пустой строки и пустой даты одинаково. Удобно перед очисткой не городить сравнения под каждый тип.
Где разместить очистку: команда, обработчик, создание объекта
Код очистки сам по себе не сработает — его нужно вызвать в нужный момент. Три типовых места.
1. По кнопке «Очистить». Добавляете на форму команду, в её обработчике на клиенте чистите реквизиты:
&НаКлиенте
Процедура ОчиститьФильтры(Команда)
Организация = Справочники.Организации.ПустаяСсылка();
ДатаНачала = '00010101';
ДатаКонца = '00010101';
КонецПроцедуры
Присваивание реквизитам формы работает прямо из клиентского кода, сервер для этого дёргать не надо.
2. В обработчике ПриИзменении зависимого поля. Выбрали организацию — сбросили связанный с ней договор, чтобы не остался чужой:
&НаКлиенте
Процедура ОрганизацияПриИзменении(Элемент)
Объект.Договор = Справочники.Договоры.ПустаяСсылка();
КонецПроцедуры
3. При создании нового объекта. Чтобы в новом документе часть полей стартовала пустой или, наоборот, сбрасывалась после копирования, используйте серверный обработчик формы. В нём доступны и Объект, и реквизиты формы:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Объект.Ссылка.Пустая() Тогда
Объект.Ответственный = Справочники.Пользователи.ПустаяСсылка();
КонецЕсли;
КонецПроцедуры
Условие Объект.Ссылка.Пустая() отличает новый объект от открытого существующего — чтобы не затирать данные при обычном открытии карточки.
Иногда очистку удобнее делать на сервере — например, если рядом идёт запрос или обращение к объекту. Реквизиты формы, изменённые в серверной процедуре, которую вызвали с клиента, обновятся на экране автоматически, когда управление вернётся на клиент. Отдельно «перерисовывать» поле не нужно:
&НаКлиенте
Процедура Очистить(Команда)
ОчиститьНаСервере(); // поля обновятся на экране после возврата
КонецПроцедуры
&НаСервере
Процедура ОчиститьНаСервере()
Организация = Справочники.Организации.ПустаяСсылка();
КонецПроцедуры
После программной очистки обработчик ПриИзменении этого поля не срабатывает. Если по изменению поля что-то пересчитывалось, вызовите эту логику вручную — платформа сама её не запустит.
Сброс отборов и фильтров в динамическом списке
Отдельная история — очистить не поле ввода, а наложенный на список фильтр. Динамический список на управляемой форме хранит условия отбора в коллекции, которую можно опустошить целиком.
&НаСервере
Процедура СброситьОтборНаСервере()
Список.Отбор.Элементы.Очистить();
КонецПроцедуры
Список.Отбор.Элементы.Очистить() снимает программные условия отбора списка. После этого список покажет все записи.
Если нужно убрать не все условия, а одно, пройдите по Список.Отбор.Элементы циклом и либо удалите нужный элемент, либо выставьте ему Использование = Ложь — так условие останется в структуре, но перестанет действовать:
&НаСервере
Процедура СнятьОтборПоОрганизации()
Для Каждого Элемент Из Список.Отбор.Элементы Цикл
Если Элемент.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Организация") Тогда
Элемент.Использование = Ложь;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Выключение через Использование удобнее удаления, когда отбор задаётся кодом и потом включается обратно — не нужно каждый раз пересоздавать элемент.
Пользовательские отборы (те, что человек задал через «Ещё → Настроить список») живут в компоновщике настроек списка. Их сбрасывают через настройки компоновки, а в типовых конфигурациях на БСП для этого есть готовые процедуры работы с отбором динамического списка — ими и пользуйтесь, чтобы не воспроизводить логику руками.
Отбор у динамического списка и значение поля ввода — разные вещи. ПустаяСсылка() для списка бесполезна: там чистят коллекцию элементов отбора, а не реквизит.
Составные типы и значение Неопределено
Когда реквизит может хранить значения нескольких типов (составной тип) или тип вообще не задан, пустым состоянием становится Неопределено.
Объект.ЗначениеСвойства = Неопределено;
Так очищают, например, реквизит «Значение» в дополнительных сведениях, который в разных строках бывает то ссылкой, то числом, то строкой. Единого «пустого значения типа» у него нет — есть только отсутствие значения, и это Неопределено.
Проверка на такое поле:
Если Объект.ЗначениеСвойства = Неопределено Тогда
// поле пустое
КонецЕсли;
Важная тонкость: Неопределено нельзя присвоить реквизиту со строгим одиночным типом. Если реквизит объявлен как СправочникСсылка.Контрагенты без примеси составного типа, Неопределено в него не положить — только ПустаяСсылка(). Поэтому прежде чем писать очистку, посмотрите тип реквизита в конфигураторе: одиночный типизированный чистят пустым значением типа, составной — Неопределено.
Функция ЗначениеЗаполнено() считает Неопределено незаполненным и возвращает по нему Ложь — так что проверку «поле пустое» для составного реквизита можно писать единообразно, не сравнивая отдельно с Неопределено, пустой ссылкой и нулём.
Отдельно про булево в составном типе: если поле «флажок» вдруг составного типа (Булево + Неопределено), то «снятый» и «не заданный» — это разные состояния. Ложь — осознанно снят, Неопределено — не выбирали. Для очистки до «не выбирали» нужен именно Неопределено.
Массовая очистка нескольких реквизитов формы
Чистить двадцать полей по одному — скучно и легко что-то забыть. Когда нужно сбросить целую группу реквизитов (например, блок фильтров отчёта), удобнее перебрать их списком.
Подготовьте структуру «имя → пустое значение» и примените её одним проходом:
&НаКлиенте
Процедура ОчиститьВсеФильтры(Команда)
ПустыеЗначения = Новый Структура;
ПустыеЗначения.Вставить("Организация", ПредопределенноеЗначение("Справочник.Организации.ПустаяСсылка"));
ПустыеЗначения.Вставить("ДатаНачала", '00010101');
ПустыеЗначения.Вставить("ДатаКонца", '00010101');
ПустыеЗначения.Вставить("Комментарий", "");
Для Каждого КлючЗначение Из ПустыеЗначения Цикл
ЭтотОбъект[КлючЗначение.Ключ] = КлючЗначение.Значение;
КонецЦикла;
КонецПроцедуры
Обращение ЭтотОбъект[ИмяРеквизита] позволяет присвоить реквизит по строковому имени — отсюда и перебор структуры.
Другой приём, когда пустое состояние совпадает с «эталонным» объектом: скопировать значения свойств через ЗаполнитьЗначенияСвойств(Приёмник, Источник) — она переносит одноимённые реквизиты из источника в приёмник за один вызов.
Полный список реквизитов формы отдаёт метод ПолучитьРеквизитыФормы() — массив объектов РеквизитФормы с именами и типами. По нему строят универсальную очистку, когда полей много и перечислять их руками неудобно:
&НаСервере
Процедура ОчиститьВсеСтроковыеРеквизиты()
Для Каждого Реквизит Из ПолучитьРеквизитыФормы() Цикл
Если Реквизит.Тип.СодержитТип(Тип("Строка")) Тогда
ЭтотОбъект[Реквизит.Имя] = "";
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Для разовой задачи структура из примера выше проще и прозрачнее перебора всех реквизитов. Универсальный цикл оправдан, когда форма генерируется динамически и состав полей заранее не известен.
Очистка табличных частей, таблиц и списков значений
У реквизита-поля пустое значение присваивают. А у коллекций есть собственный метод Очистить() — он удаляет все строки или элементы сразу. Это как раз тот метод, который ошибочно ищут у поля ввода, — но принадлежит он коллекциям.
Объект.Товары.Очистить(); // табличная часть документа — удалить все строки
ТаблицаЗначений.Очистить(); // таблица значений
СписокЗначений.Очистить(); // список значений
Массив.Очистить(); // массив
Соответствие.Очистить(); // соответствие
Разница принципиальная:
- 🔹 Реквизит-значение (число, ссылка, дата) — присваиваем пустое значение, метода
Очистить()у него нет. - 🔸 Коллекция (таблица, список, массив, табличная часть) — зовём
Очистить(), он убирает содержимое, но сама коллекция остаётся.
Если нужно очистить одну колонку таблицы, а строки сохранить, идите по строкам циклом и чистьте конкретный реквизит строки:
Для Каждого Строка Из Объект.Товары Цикл
Строка.Цена = 0;
КонецЦикла;
Типичные ошибки при очистке полей
Большинство ошибок — это несовпадение типа пустого значения с типом реквизита и путаница «поле против коллекции».
"" или 0. Нужна пустая ссылка нужного менеджера: Справочники.Имя.ПустаяСсылка(). Строку и число так не очистить.Очистить() у поля ввода или у реквизита-значения. У них этого метода нет — присвойте пустое значение. Очистить() есть только у коллекций: таблиц, списков, массивов, табличных частей.Неопределено. Для одиночного типа используйте его пустое значение (ПустаяСсылка()), Неопределено — только для составного типа.ПриИзменении не срабатывает. Пересчёт связанных полей вызовите вручную из той же процедуры.Список.Отбор.Элементы — его и очищайте, а пользовательские настройки — через компоновщик настроек.Ещё одна засада — очистка «не в том контексте». Реквизиты формы доступны и на клиенте, и на сервере, а вот операции с объектом иногда требуют серверного обработчика. Если сомневаетесь, где выполняется код, посмотрите директиву компиляции процедуры: &НаКлиенте или &НаСервере.
И не путайте очистку значения с очисткой «истории выбора» в поле ввода — это настройка самого поля (автоподбор, список выбора), а не данные реквизита. Само значение после такой настройки остаётся на месте, меняется лишь поведение подсказок при вводе.
Частые вопросы
Чем очистить поле с датой — нулём или пустой датой?
Реквизит = '00010101';. Ноль в реквизит типа «Дата» не встанет. Проверить заполненность удобно через ЗначениеЗаполнено().Почему `Поле.Очистить()` выдаёт ошибку?
Очистить(). Присвойте пустое значение нужного типа. Метод Очистить() есть только у коллекций — таблиц значений, списков, массивов, табличных частей.Как очистить ссылочное поле, если тип составной?
Неопределено: Объект.Реквизит = Неопределено;. Для строгого одиночного ссылочного типа это не сработает — там нужна ПустаяСсылка() соответствующего менеджера.Поле очистилось, но связанные реквизиты остались заполненными. Почему?
ПриИзменении. Логику пересчёта зависимых полей запустите из кода вручную, сразу после очистки.Как сбросить сразу все фильтры отчёта или списка?
Список.Отбор.Элементы.Очистить();. Это две разные операции, в одном вызове их не совместить.