В управляемых формах 1С задача очистки реквизитов часто вызывает трудности у начинающих разработчиков. Это связано с тем, что архитектура управляемого приложения разделяет клиентскую и серверную части, а объект формы Объект является специфической структурой, а не самим объектом базы данных. Давайте подробно разберем, как правильно реализовать массовую очистку данных.
Наиболее надежный способ — перебор реквизитов через обращение к метаданным объекта. Это позволяет нам не перечислять каждый реквизит вручную, а пройтись циклом по всей структуре. Рассмотрим реализацию, где мы очищаем как основные реквизиты, так и табличные части. Подобный алгоритм заложен в профессиональное выборочное удаление данных организации, которое обходит метаданные для полной очистки накопленных сведений.
Для начала создадим процедуру на сервере. Важно помнить, что доступ к метаданным Объект.Ссылка.Метаданные позволяет нам динамически определять состав полей.
&НаСервере
Процедура ОчиститьРеквизитыНаСервере(МассивИсключений)
// Очистка основных реквизитов
Для Каждого ТекРеквизит Из Объект.Ссылка.Метаданные.Реквизиты Цикл
Если МассивИсключений.Найти(ТекРеквизит.Имя) = Неопределено Тогда
Объект[ТекРеквизит.Имя] = Неопределено;
КонецЕсли;
КонецЦикла;
// Очистка табличных частей
Для Каждого ТекТабЧасть Из Объект.Ссылка.Метаданные.ТабличныеЧасти Цикл
Если МассивИсключений.Найти(ТекТабЧасть.Имя) = Неопределено Тогда
Объект[ТекТабЧасть.Имя].Очистить();
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Этот метод хорош тем, что он универсален. Если вы добавите новый реквизит в структуру документа или справочника, процедура автоматически начнет его очищать без необходимости правки кода.
Если вам нужно очистить не только реквизиты объекта, но и дополнительные реквизиты формы (которые не входят в состав объекта), стоит использовать связку методов РеквизитФормыВЗначение и ЗначениеВРеквизитФормы. Это позволяет работать с данными как с полноценным объектом 1С.
Разберем по шагам, как это реализовать:
&НаСервере
Процедура ОчиститьНаСервере()
// Получаем прикладной объект
ДанныеОбъекта = РеквизитФормыВЗначение("Объект");
// Очистка реквизитов объекта
МетаданныеОбъекта = ДанныеОбъекта.Метаданные();
// Перебираем реквизиты
Для Каждого Рекв Из МетаданныеОбъекта.Реквизиты Цикл
ДанныеОбъекта[Рекв.Имя] = Неопределено;
КонецЦикла;
// Очищаем табличные части
Для Каждого ТЧ Из МетаданныеОбъекта.ТабличныеЧасти Цикл
ДанныеОбъекта[ТЧ.Имя].Очистить();
КонецЦикла;
// Возвращаем данные обратно в форму
ЗначениеВРеквизитФормы(ДанныеОбъекта, "Объект");
КонецПроцедуры
Иногда задача заключается не в очистке данных объекта, а в визуальной очистке полей ввода. Если вы хотите сбросить значения, отображаемые на форме, вы можете воспользоваться коллекцией Элементы. Важно помнить, что обращаться нужно к свойству Значение конкретного элемента.
&НаСервере
Процедура ОчиститьЭлементыФормы()
Для Каждого ЭлементФормы Из ЭтаФорма.Элементы Цикл
Попытка
// Проверяем, является ли элемент полем ввода
Если ТипЗнч(ЭлементФормы) = Тип("ПолеФормы") Тогда
ЭтаФорма[ЭлементФормы.Имя] = Неопределено;
КонецЕсли;
Исключение
// Игнорируем элементы, которые нельзя очистить (группы, кнопки и т.д.)
КонецПопытки;
КонецЦикла;
КонецПроцедуры
При реализации механизмов очистки обратите внимание на следующие нюансы. Для автоматического тестирования и архивирования баз 1С после внесения подобных изменений в конфигурацию применяются специализированные утилиты технического обслуживания.
Дата, Номер или Автор.Неопределено безопасно для большинства типов, но в строгих условиях, когда реквизит не может быть пустым, лучше присваивать пустую ссылку или пустую строку.Выполнить(). Несмотря на то, что это позволяет динамически формировать код, такой подход крайне опасен с точки зрения безопасности и очень сложен в отладке.Комбинируя эти методы, вы сможете создать гибкую и надежную систему очистки формы, которая будет корректно работать в любой ситуации. В случаях, когда требуется роботизация действий пользователя в интерфейсе без изменения кода конфигурации, применяются специализированные RPA-платформы.