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

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

Как очистить значение элемента формы в 1С

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

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

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

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

Что именно очищается: элемент формы или данные

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

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

Исключение — обычные формы (в старых конфигурациях на платформе 8.2 и ранее), где элементы управления могли хранить значение сами. Там работают свойства элемента вроде Значение. Но в современных конфигурациях на управляемых формах такой подход не применяется.

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

Для реквизитов примитивных типов — строка, число, дата, булево — очистка выполняется присвоением подходящего пустого значения. Самый универсальный вариант — присвоить значение Неопределено, если тип реквизита это допускает.

&НаКлиенте

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

Комментарий = ""; // строка

Количество = 0; // число

ДатаОтгрузки = '00010101'; // пустая дата

Согласовано = Ложь; // булево

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

Для ссылочных реквизитов (справочники, документы, перечисления) пустое значение получают через менеджер соответствующего типа. Например, для реквизита типа «СправочникСсылка.Номенклатура» пустая ссылка формируется так:

&НаСервере

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

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

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

Универсальный способ: приведение к пустому значению типа

Когда тип реквизита заранее неизвестен или пишется универсальная процедура очистки, удобно использовать объект ОписаниеТипов. Его метод ПривестиЗначение() без параметра возвращает пустое значение заданного типа. Это позволяет очистить реквизит любого состава корректно, без ветвлений по типам.

&НаСервере

Процедура ОчиститьРеквизитУниверсально(ИмяРеквизита)

// Получаем тип реквизита из метаданных объекта

ТипРеквизита = ТипЗнч(Объект[ИмяРеквизита]);

МассивТипов = Новый Массив;

МассивТипов.Добавить(ТипРеквизита);

Описание = Новый ОписаниеТипов(МассивТипов);

Объект[ИмяРеквизита] = Описание.ПривестиЗначение();

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

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

Очистка таблиц, табличных частей и списков значений

Табличные данные очищаются методом Очистить(), который удаляет все строки коллекции. Это относится к табличным частям объекта, реквизитам формы типа «ТаблицаЗначений» и «ДанныеФормыКоллекция», а также к спискам значений.

&НаКлиенте

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

Объект.Товары.Очистить(); // табличная часть документа

СписокВыбранных.Очистить(); // список значений

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

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

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

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

Программная очистка через свойства элемента формы

В отдельных сценариях нужно повлиять именно на элемент, а не на данные: сбросить текст редактирования, который пользователь ввёл, но не зафиксировал, или очистить поле, не связанное с реквизитом. Для этого у поля ввода есть свойство ТекстРедактирования, доступное на клиенте.

&НаКлиенте

Процедура СброситьТекстПоля(Команда)

Элементы.ПолеПоиска.ТекстРедактирования = "";

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

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

Дополнительно можно управлять доступностью и видимостью очищенного поля: например, после сброса значения установить Элементы.ПолеВвода.Доступность = Ложь, чтобы пользователь не ввёл данные до выполнения других условий.

Сравнение способов очистки

Присвоение пустого значения

Подходит для простых и ссылочных реквизитов; требует знания типа

ОписаниеТипов.ПривестиЗначение()

Универсальный вариант для любого типа; чуть более громоздкий код

Метод Очистить()

Для таблиц, табличных частей и списков значений; не работает с примитивами

ТекстРедактирования элемента

Только для сброса незафиксированного ввода на клиенте; не меняет данные

Типичные ошибки и ограничения

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

Вторая распространённая проблема — очистка реквизита объекта на клиенте при отсутствии контекста объекта. Если реквизит относится к данным объекта (Объект.Реквизит), а процедура выполняется в директиве &НаКлиенте, убедитесь, что реквизит объекта доступен в клиентском контексте — основные реквизиты формы обычно доступны, но сложная логика может потребовать серверного вызова.

Третья ошибка — очистка поля, значение которого пересчитывается в обработчиках ПриИзменении других полей. После очистки зависимые обработчики могут тут же заполнить поле заново. В таких случаях очищайте цепочку связанных реквизитов или временно блокируйте пересчёт флагом.

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

Проверка результата и контрольные точки

После очистки убедитесь, что значение действительно сброшено. Для проверки в коде используйте функцию ЗначениеЗаполнено(): она возвращает Ложь для пустых ссылок, пустых строк, нулей, пустых дат и Неопределено. Это надёжнее, чем сравнение с конкретным пустым значением.

Если Не ЗначениеЗаполнено(Объект.Контрагент) Тогда

// поле успешно очищено

КонецЕсли;

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

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

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

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

Поле визуально пустое

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

Значение осталось — очищен не тот реквизит или сработал обработчик

ЗначениеЗаполнено() в отладчике
Норма

Возвращает Ложь

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

Возвращает Истина — значение не очищено

Модифицированность формы
Норма

Форма помечена как изменённая

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

Изменения не зафиксированы, при закрытии данные потеряются без вопроса

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

Пересчитаны после очистки

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

Итоги показывают старые значения

FAQ

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

Если поле не привязано к данным, используйте свойство элемента ТекстРедактирования на клиенте: Элементы.ИмяПоля.ТекстРедактирования = "". Лучшее решение — всё же создать реквизит формы и связать поле с ним, тогда очистка сведётся к присвоению пустого значения реквизиту.

Чем отличается Неопределено от пустой ссылки?

Неопределено — отсутствие значения вообще, оно допустимо для реквизитов составного типа. Пустая ссылка — конкретное значение ссылочного типа, у которого не заполнен идентификатор объекта. Для реквизита строгого ссылочного типа присваивайте пустую ссылку, а не Неопределено.

Как очистить сразу все реквизиты формы?

Единой команды нет. Переберите реквизиты в цикле и присвойте каждому пустое значение через ОписаниеТипов.ПривестиЗначение(), а для коллекций вызовите Очистить(). Либо перечитайте объект с сервера — тогда все несохранённые изменения, включая заполненные поля, откатятся к данным базы.

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

Скорее всего, срабатывает обработчик ПриИзменении очищенного или связанного поля, который программно подставляет значение по умолчанию. Проверьте обработчики событий формы и добавьте флаг, блокирующий автозаполнение во время очистки.

Как очистить динамический список на форме?

Динамический список нельзя очистить методом Очистить() — он отображает данные запроса к базе. Чтобы список стал пустым, измените его отбор или текст запроса так, чтобы ни одна запись не подходила под условия, например установите отбор по заведомо пустой ссылке.

Можно ли очистить значение поля в обычной форме 1С 8.2?

Да, в обычных формах у элементов управления есть свойство Значение, и очистка выполняется напрямую: ЭлементыФормы.ПолеВвода.Значение = Неопределено. Однако этот подход не переносится на управляемые формы — там работайте только с реквизитами.

Итог

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

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