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