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

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

1С: как очистить поле на форме

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

Очистка поля на форме 1С — типовая задача, которая возникает при разработке и доработке конфигураций: нужно сбросить введённое пользователем значение, обнулить реквизит при изменении связанного поля или вернуть форму в исходное состояние. Способ зависит от того, с чем вы работаете — с реквизитом формы, реквизитом объекта (документа, справочника) или непосредственно с элементом формы.

Ключевой принцип: в 1С элемент формы (поле ввода) лишь отображает данные, а реальное значение хранится в реквизите формы или объекта. Поэтому корректная очистка почти всегда сводится к присвоению пустого значения реквизиту, а не к манипуляциям с самим элементом. Ниже разобраны основные сценарии с примерами кода для управляемых и обычных форм.

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

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

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

Очистка реквизита простым присвоением

Самый частый случай — реквизит формы или объекта примитивного типа. Пустое значение зависит от типа:

  • строка — пустая строка "";
  • число — 0;
  • дата — '00010101' (пустая дата);
  • булево — Ложь;
  • ссылочные типы — Неопределено или пустая ссылка конкретного типа.

Пример на управляемой форме документа, где нужно очистить поле «Комментарий» и ссылочное поле «Контрагент»:

&НаКлиенте

Процедура ОчиститьПоля(Команда)

Объект.Комментарий = "";

Объект.Контрагент = Неопределено;

КонецПроцедуры

Если реквизит имеет составной тип и важно сохранить ожидаемый тип значения, вместо Неопределено лучше присвоить пустую ссылку нужного вида, например ПредопределенноеЗначение("Справочник.Контрагенты.ПустаяСсылка"). Это избавит от ситуаций, когда проверки заполнения или обработчики ожидают именно ссылку, а получают Неопределено.

Универсальная очистка через ОписаниеТипов

Когда тип реквизита заранее неизвестен (например, вы пишете универсальную процедуру очистки), удобно получить пустое значение через объект ОписаниеТипов — метод ПривестиЗначение() без аргумента вернёт значение по умолчанию для заданного типа:

&НаСервере

Процедура ОчиститьРеквизитПоТипу()

ОписаниеТипа = Новый ОписаниеТипов("СправочникСсылка.Номенклатура");

Объект.ОсновнаяНоменклатура = ОписаниеТипа.ПривестиЗначение();

КонецПроцедуры

Такой подход особенно полезен при программной обходе реквизитов объекта в цикле, когда нужно очистить все поля разом, не заботясь о типе каждого.

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

Для табличных частей и реквизитов типа «ТаблицаЗначений» применяется метод Очистить() — он удаляет все строки:

&НаКлиенте

Процедура ОчиститьТовары(Команда)

Объект.Товары.Очистить();

КонецПроцедуры

Если нужно очистить не всю таблицу, а конкретную ячейку текущей строки, обратитесь к данным строки через Элементы.Товары.ТекущиеДанные и присвойте пустое значение нужной колонке. Помните, что обращение к строке по индексу на клиенте выполняется через коллекцию данных, а не через элемент формы.

Очистка поля при изменении связанного поля

Частый сценарий: при смене значения в одном поле нужно сбросить зависимое. Например, при изменении договора очищать сделку, потому что старая сделка к новому договору не относится. Для этого используется обработчик события ПриИзменении:

&НаКлиенте

Процедура ДоговорПриИзменении(Элемент)

Объект.Сделка = Неопределено;

КонецПроцедуры

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

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

Сброс всех полей формы и возврат к исходному состоянию

Иногда требуется очистить форму целиком — например, в обработке после выполнения операции подготовить её к следующему вводу. Два рабочих подхода:

  • перечислить реквизиты вручную и обнулить каждый — надёжно и прозрачно;
  • для формы объекта — перечитать объект заново: ЭтотОбъект.Прочитать() на сервере вернёт сохранённое состояние, а для нового объекта достаточно закрыть и открыть форму заново.

Для произвольных реквизитов формы на управляемой форме можно пройтись по массиву, возвращаемому методом ПолучитьРеквизиты(), но присваивать пустые значения придётся с учётом типа каждого реквизита, иначе получите ошибки преобразования.

Очистка поля в обычных формах

В обычном приложении логика та же: поле ввода связано с данными, и очистка выполняется присвоением пустого значения источнику. Дополнительно там доступно прямое обращение к элементу управления, например ЭлементыФормы.Комментарий.Значение = "", но если у поля задана связь с данными, надёжнее менять именно данные — иначе при следующем обновлении формы значение может восстановиться из источника.

Частые ошибки при очистке полей

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

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

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

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

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

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

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

Значение осталось или появилось после обновления формы

Тип значения
Норма

Проверки заполнения и обработчики работают без ошибок

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

Ошибки преобразования типа или «Поле не заполнено» там, где очистка законна

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

Связанные поля очищены или содержат актуальные значения

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

В зависимых полях остались данные, относящиеся к старому значению

Итог

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

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

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

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

Присвойте либо Неопределено, либо пустую ссылку того вида, который ожидается дальше по логике. Универсальный способ — получить пустое значение через Новый ОписаниеТипов с нужным составом и метод ПривестиЗначение() без аргумента.

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

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

Как очистить поле списка выбора (выпадающий список)?

Если нужно очистить выбранное значение — присвойте реквизиту пустое значение. Если нужно очистить сам список вариантов, обратитесь к элементу формы: Элементы.ИмяПоля.СписокВыбора.Очистить() — это единственный случай, когда работа идёт именно с элементом.

Как очистить все реквизиты формы одной процедурой?

На сервере получите массив реквизитов через ПолучитьРеквизиты(), пройдите по нему в цикле и каждому присвойте пустое значение, определённое по типу реквизита. Для формы объекта проще перечитать объект методом Прочитать() или переоткрыть форму.

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

Обычно нет: при изменении реквизита формы платформа обновляет связанные элементы автоматически. Явный вызов может понадобиться только в нестандартных сценариях с динамически созданными элементами.

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

Пройдите по строкам в цикле: Для Каждого Строка Из Объект.Товары Цикл Строка.Цена = 0; КонецЦикла. Метод Очистить() здесь не подходит — он удаляет строки целиком.