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