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