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