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

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

Как очистить поле формы в 1С: практическое руководство

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

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

Главная сложность в том, что «очистить поле» можно по-разному: присвоить реквизиту пустое значение его типа, вызвать стандартный метод очистки таблицы, сбросить данные через объект или просто пересоздать форму. Выбор зависит от типа поля (строка, число, ссылка, таблица значений) и от того, где выполняется код — на клиенте или на сервере.

Материал рассчитан на разработчиков и продвинутых пользователей, работающих с управляемыми формами на платформе 1С:Предприятие 8.3. Примеры приведены на встроенном языке; для обычных форм синтаксис в целом аналогичен, но с поправкой на другую модель работы с данными формы.

Как 1С хранит данные полей формы

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

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

Очистка простых полей: строки, числа, даты

Для примитивных типов очистка сводится к присвоению значения по умолчанию. Строковое поле очищается пустой строкой, числовое — нулём, дата — пустой датой '00010101' или значением Неопределено, булево — значением Ложь.

&НаКлиенте

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

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

Объект.СуммаДокумента = 0; // число

Объект.ДатаОтгрузки = '00010101'; // дата

Объект.Согласовано = Ложь; // булево

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

Использовать Неопределено для примитивных типов стоит осторожно: если тип реквизита строго определён (например, только «Число»), присвоение Неопределено может привести к ошибке преобразования или к неожиданному отображению. Безопаснее присваивать «нулевое» значение именно того типа, который объявлен у реквизита.

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

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

Объект.Контрагент = ПредопределенноеЗначение("Справочник.Контрагенты.ПустаяСсылка");

// или универсально:

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

После очистки ссылочного поля часто требуется сбросить связанные данные: например, при очистке контрагента теряют смысл поля «Договор», «Адрес доставки», «Контактное лицо». Такие зависимости лучше оформлять отдельной процедурой, чтобы логика очистки была в одном месте и не дублировалась по обработчикам.

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

Табличная часть документа или таблица значений на форме очищается методом Очистить(). Метод удаляет все строки коллекции, и элемент формы, связанный с таблицей, автоматически показывает пустой список.

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

ТаблицаРезультатов.Очистить(); // реквизит формы типа ТаблицаЗначений

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

bsl
Найденные = Объект.Товары.НайтиСтроки(Новый Структура("Отменено", Истина));
Для Каждого Строка Из Найденные Цикл
    Объект.Товары.Удалить(Строка);
КонецЦикла;

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

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

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

Маршрут решения

Как выбрать способ очистки

Нужно сбросить 1–3 поля после изменения ключевого реквизитаПрисвойте пустые значения конкретным реквизитам в обработчике ПриИзменении
Нужно очистить табличную часть или таблицу результатовВызовите метод Очистить() у коллекции
Нужно полностью сбросить форму обработкиЗакройте и откройте форму заново или вынесите сброс всех реквизитов в отдельную процедуру
Форма связана с объектом БД и нужен новый документОткройте форму нового объекта вместо очистки текущей

Клиент и сервер: где выполнять очистку

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

Для форм с разделением контекста (директивы &НаКлиенте, &НаСервере) помните: изменение реквизитов формы на сервере автоматически передаётся на клиент при возврате из вызова. Дополнительно «обновлять форму» после серверной очистки обычно не требуется — достаточно корректного возврата управления.

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

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

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

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

Значение реквизита после очистки
Норма

Поле пустое, функция ЗначениеЗаполнено() возвращает Ложь

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

Поле показывает старое значение или 0 там, где ожидалась пустая ссылка

Табличная часть
Норма

Количество() возвращает 0, на форме пустой список

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

Строки остались или пропали только частично

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

Итоги пересчитаны, недоступные кнопки заблокированы

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

Итоговая сумма показывает старое значение после очистки таблицы

Часто задаваемые вопросы

Как очистить поле, не зная его типа заранее?

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

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

Чаще всего очищен не тот реквизит, к которому привязан элемент. Проверьте свойство «ПутьКДанным» поля в конфигураторе. Реже помогает явный вызов обновления отображения или повторное присвоение значения.

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

Очистите связанный реквизит тем же способом, что и обычное поле. Сам список выбора (СписокЗначений в свойстве элемента) очищается отдельно методом СписокВыбора.Очистить(), если нужно убрать и варианты выбора.

Вызывается ли обработчик ПриИзменении при программной очистке?

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

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

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

Чем очистка отличается для обычных и управляемых форм?

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

Итог

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

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