Очистка полей ввода в формах 1С: код и интерфейс
Содержание
Чтобы очистить поле ввода программно, присвойте реквизиту пустое значение его типа: строке — "", числу — 0, дате — '00010101', ссылке — Неопределено. Для пользователя быстрее всего установить курсор в поле, выделить значение и нажать Del. Поле со ссылкой очищается крестиком справа, если у него включена кнопка очистки.
Разберём оба пути — очистку из модуля формы и очистку руками, — а заодно разберёмся с составными типами, табличными частями, табличными документами и обработчиками, которые сбрасывают зависимые поля автоматически. Примеры кода даны для управляемых форм платформы 8.3 (интерфейс «Такси»); для обычных форм логика та же, отличается синтаксис обращения к элементам.
Пустое значение зависит от типа реквизита
Поле ввода связано с реквизитом формы (или реквизитом объекта). «Очистить поле» означает присвоить этому реквизиту пустое значение — но у каждого типа оно своё.
| Тип реквизита | Пустое значение | Пример |
|---|---|---|
| Строка | пустая строка | Объект.Комментарий = ""; |
| Число | ноль | Объект.Сумма = 0; |
| Дата | пустая дата | Объект.ДатаОтгрузки = '00010101'; |
| Булево | Ложь | Объект.Проведён = Ложь; |
| Ссылка (справочник, документ) | пустая ссылка | Объект.Контрагент = Неопределено; |
Пустая дата в 1С — это '00010101' (первое января первого года), а не Дата(0,0,0). Можно записать и Дата(1,1,1) — результат тот же.
Поле перечисления (например, вид операции, способ оплаты) очищается пустой ссылкой перечисления:
Объект.ВидОперации = Перечисления.ВидыОпераций.ПустаяСсылка();
Присвоить перечислению 0 нельзя — это не число, а ссылка. Для числового поля есть нюанс отображения: на форме пустое число показывается как 0, не как пустая ячейка. Если бизнес-логике нужно именно «не заполнено», а не ноль, такое поле делают строкового типа или заводят отдельный флаг «заполнено».
Для ссылочного реквизита присвоение Неопределено визуально очищает поле. Если нужна именно типизированная пустая ссылка (например, для сравнения в коде), берите её у менеджера:
Объект.Контрагент = Справочники.Контрагенты.ПустаяСсылка();
Поле ввода на форме и реквизит — не одно и то же. Присваивать значение нужно реквизиту (Объект.Контрагент или реквизиту формы), а не элементу формы. Элемент формы (Элементы.Контрагент) отвечает только за внешний вид.
Реквизиты объекта (Объект.Что-то) и собственные реквизиты формы доступны на клиенте, поэтому простую очистку по кнопке делают в клиентской процедуре &НаКлиенте — без обращения к серверу. На сервер идут только тогда, когда очистка связана с данными, которые читаются на сервере (динамический список, запрос, перезаполнение по данным базы).
Очистка из модуля формы: код с привязкой к событию
Чаще всего очистку вешают на кнопку «Очистить» или на команду формы. Процедуру выполняем на клиенте — реквизиты формы доступны без обращения к серверу.
&НаКлиенте
Процедура ОчиститьПоля(Команда)
Объект.Контрагент = Неопределено;
Объект.Договор = Неопределено;
Объект.Сумма = 0;
Объект.Комментарий = "";
Объект.ДатаОплаты = '00010101';
КонецПроцедуры
Если чистите реквизит самой формы (не объекта), обращайтесь к нему напрямую по имени:
&НаКлиенте
Процедура ОчиститьОтбор(Команда)
ОтборПоСкладу = Неопределено;
СтрокаПоиска = "";
КонецПроцедуры
Чтобы не перечислять поля вручную, когда их много, можно пройтись по реквизитам объекта и сбросить строковые и ссылочные значения — но такой универсальный код уместен, только если вы точно знаете состав формы. Явное перечисление надёжнее: видно, что именно очищается.
Отдельный случай — очистка отбора динамического списка (например, когда форма списка показывает отфильтрованные данные, а нужно показать всё). Отбор хранится в свойстве Отбор динамического списка, и его элементы очищаются своим методом:
&НаСервере
Процедура СброситьОтборНаСервере()
Список.Отбор.Элементы.Очистить();
КонецПроцедуры
Здесь важно, что динамический список — реквизит формы, доступный на сервере, поэтому процедуру выполняем с директивой &НаСервере. После очистки список перечитает данные без фильтра.
Как очистить поле вручную, без программирования
Пользователю код не нужен. Способы по порядку скорости:
- 🖱 Установите курсор в поле, выделите значение (
Ctrl+Aвнутри поля) и нажмитеDelилиBackspace. - ❌ У поля со ссылкой справа есть кнопка очистки — крестик. Один клик обнуляет значение. Крестик виден, если поле заполнено и кнопка включена в настройках формы.
- 📋 Правый клик по полю → в контекстном меню есть пункт очистки (для полей с выбором).
Кнопка-крестик появляется не всегда: это свойство элемента формы «Кнопка очистки». Разработчик включает его в конфигураторе — в палитре свойств поля ввода. Если крестика нет, а он нужен всем пользователям, попросите администратора включить это свойство у поля.
Поведение по типам поля отличается. Строку и число достаточно выделить и удалить Del — поле станет пустым (число покажет 0). Поле даты после очистки отображается пустым, календарь при повторном открытии стартует с текущей даты. Поле со ссылкой (справочник, документ) кроме Del можно очистить крестиком, а заполнить заново — через кнопку выбора или вводом по строке с автоподбором.
Del очищает только то поле, где стоит курсор. Если нужно сбросить всю форму разом, это делает кнопка «Очистить» — её добавляет разработчик, стандартной такой кнопки у произвольного документа нет.
Поле составного типа: сначала выбор типа, потом значение
Если реквизит имеет составной тип (например, «Справочник.Контрагенты» ИЛИ «Справочник.ФизическиеЛица»), пустое поле показывает ссылку выбора типа. Платформа не знает заранее, значение какого типа вы введёте.
Программно такое поле очищается тем же Неопределено:
Объект.Плательщик = Неопределено;
После этого поле снова покажет кнопку выбора типа. Если нужно не просто очистить, а переключить тип, сначала присвойте значение нужного типа — поле перестроится само.
Перед очисткой иногда нужно проверить, значение какого типа сейчас в составном поле, — например, чтобы очищать только ссылки на физлиц. Текущий тип возвращает ТипЗнч:
Если ТипЗнч(Объект.Плательщик) = Тип("СправочникСсылка.ФизическиеЛица") Тогда
Объект.Плательщик = Неопределено;
КонецЕсли;
Вручную составное поле очищают так же: выделить значение и Del. После очистки появится маленькая кнопка со стрелкой — через неё выбирается тип при повторном вводе.
Табличная часть: очистить все строки или одну колонку
Табличная часть документа — это не одно поле, а таблица. Способы зависят от задачи.
Удалить все строки целиком:
Объект.Товары.Очистить();
Метод Очистить() убирает все строки табличной части. После него таблица на форме становится пустой.
Очистить одну колонку, оставив строки: пройдите по строкам и обнулите нужный реквизит.
Для Каждого СтрокаТаблицы Из Объект.Товары Цикл
СтрокаТаблицы.Цена = 0;
СтрокаТаблицы.Сумма = 0;
КонецЦикла;
Удалить одну строку по индексу, а не всю таблицу:
Объект.Товары.Удалить(0); // удаляет первую строку
Метод Очистить() стирает все строки, Удалить(Индекс) — одну. Не путайте их: Очистить() параметров не принимает.
Вручную строки табличной части удаляют клавишей Del на выделенной строке или командой удаления в командной панели таблицы (значок с минусом/крестиком). Чтобы убрать сразу все строки, выделите их (Ctrl+A в таблице) и нажмите Del.
Очистка табличной части в проведённом документе меняет его содержимое. После массовой очистки документ нужно перепровести — иначе движения по регистрам останутся от старого состава строк.
Табличный документ: очистка ячеек печатной формы и отчёта
Табличная часть и табличный документ — разные объекты, и путать их не стоит. Табличная часть входит в документ или справочник. Табличный документ (ТабличныйДокумент) — это таблица-полотно, на которой строятся печатные формы и отчёты. Чистят их по-разному.
Чтобы полностью очистить табличный документ в коде:
ТабДок.Очистить();
Метод Очистить() убирает всё содержимое и области. Если нужно очистить только часть — область с определёнными строками и колонками — задайте её границы:
// очистить строки с 5 по 20
ТабДок.ОчиститьОбласть(5, , 20, );
Параметры ОчиститьОбласть — это координаты (начальная строка, начальная колонка, конечная строка, конечная колонка). Пропущенный параметр означает «от начала» или «до конца». Если сомневаетесь в сигнатуре метода, посмотрите синтакс-помощник по слову ОчиститьОбласть — порядок параметров там описан точно.
Очистить текст в одной ячейке можно через область по её координатам в формате «строка-колонка»:
ТабДок.Область("R5C2").Текст = "";
Запись R5C2 означает пятую строку, вторую колонку. Так удобно обнулять отдельные ячейки, не трогая остальную таблицу.
Вручную, когда табличный документ открыт на экране (готовая печатная форма), ячейки выделяют мышью и удаляют содержимое клавишей Del. Но правка уже сформированной печатной формы — разовое действие: при повторном формировании документ построится заново из макета.
Сброс зависимых полей через обработчики событий
Часто поле нужно очищать не по кнопке, а автоматически — когда меняется другое поле. Классический пример: сменили контрагента — договор по старому контрагенту больше не подходит, его надо сбросить.
Это делается в обработчике события «ПриИзменении» у поля-источника:
&НаКлиенте
Процедура КонтрагентПриИзменении(Элемент)
// контрагент сменился — очищаем договор
Объект.Договор = Неопределено;
КонецПроцедуры
Обработчик привязывается к элементу формы в конфигураторе (палитра свойств → события → «ПриИзменении»). Внутри можно очистить любое число зависимых реквизитов.
Важная тонкость: событие «ПриИзменении» срабатывает, когда значение меняет пользователь в поле. При программном присвоении (Объект.Контрагент = ... в коде) этот обработчик не вызывается. Поэтому если вы очищаете контрагента кодом, то и зависимый договор нужно очистить тут же, в том же коде, — платформа за вас это не сделает.
Если очистку надо выполнить и при открытии формы (сбросить временные отборы), используйте обработчик формы «ПриОткрытии» или «ПриСозданииНаСервере»:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
СтрокаПоиска = "";
ОтборПоСтатусу = Неопределено;
КонецПроцедуры
Когда очистка стирает уже введённые данные (например, сбрасывает заполненную табличную часть), стоит переспросить пользователя. В управляемой форме это делают асинхронно — через ПоказатьВопрос с оповещением:
&НаКлиенте
Процедура ОчиститьТовары(Команда)
Оповещение = Новый ОписаниеОповещения("ОчиститьТоварыЗавершение", ЭтотОбъект);
ПоказатьВопрос(Оповещение, "Очистить все строки таблицы товаров?", РежимДиалогаВопрос.ДаНет);
КонецПроцедуры
&НаКлиенте
Процедура ОчиститьТоварыЗавершение(Результат, ДопПараметры) Экспорт
Если Результат = КодВозвратаДиалога.Да Тогда
Объект.Товары.Очистить();
КонецЕсли;
КонецПроцедуры
Такой диалог спасает от случайного стирания заполненного документа — особенно когда кнопка очистки стоит рядом с кнопкой проведения.
Частые ошибки при очистке полей
Ошибки здесь однотипны и ловятся по симптому.
Объект.Поле, а не Элементы.Поле. Элемент формы отвечает только за отображение.0, числу — "", ссылке — пустую строку. Для ссылки используйте Неопределено или ПустаяСсылка().&НаКлиенте.Отдельно про дату: распространённая попытка очистить дату через Дата(0,0,0) вызывает ошибку. Пустая дата — '00010101'. А «нулевая» дата как число не существует.
Частые вопросы
Чем очистить ссылочное поле — `Неопределено` или `ПустаяСсылка()`?
Неопределено короче и универсально. ПустаяСсылка() даёт типизированное пустое значение — берите его, если дальше в коде сравниваете поле с пустой ссылкой конкретного справочника.Как очистить все поля формы одной командой?
Можно ли очистить поле, не открывая конфигуратор?
Del, либо нажмите крестик очистки справа от поля. Код нужен только для автоматической очистки по событию или кнопке.Почему `Del` очищает только одно поле, а не всю форму?
Del работает с полем, где стоит курсор. Массовый сброс — это отдельная логика (кнопка «Очистить»), которую закладывает разработчик формы.Как очистить табличную часть целиком?
Очистить() у табличной части: Объект.Товары.Очистить();. Вручную — выделить строки (Ctrl+A в таблице) и нажать Del. В проведённом документе после очистки перепроведите его.