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

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

1С: как программно удалить элемент формы

Как программно удалить элемент формы в 1С 8.3: метод Удалить коллекции Элементы, работа с управляемыми и обычными формами, типичные ошибки и примеры кода.

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

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

Как работает удаление элементов в управляемой форме

В управляемой форме все визуальные элементы доступны через свойство Элементы объекта формы. Коллекция поддерживает методы Добавить(), Найти(), Переместить() и Удалить(). Удаление выполняется одной строкой кода, но перед этим нужно убедиться, что элемент существует и был создан программно.

// Поиск и удаление программно созданного элемента

НайденныйЭлемент = Элементы.Найти("КнопкаПечатьРеестра");

Если НайденныйЭлемент <> Неопределено Тогда

Элементы.Удалить(НайденныйЭлемент);

КонецЕсли;

Метод Найти() возвращает Неопределено, если элемента с таким именем нет, поэтому проверка перед удалением обязательна. Попытка удалить несуществующий элемент вызовет ошибку исполнения. Обратиться к элементу напрямую по имени тоже можно: Элементы.Удалить(Элементы.КнопкаПечатьРеестра), но без предварительной проверки это рискованно.

Удаление элементов, созданных в конфигураторе

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

// Скрытие элемента, созданного в конфигураторе

Элементы.ГруппаДополнительно.Видимость = Ложь;

// Скрытие по условию

Если Не ПользователиИнформационнойБазы.ТекущийПользователь().Роли.Содержит("Администратор") Тогда

Элементы.КнопкаСлужебныеОперации.Видимость = Ложь;

КонецЕсли;

Если требуется именно динамическое управление составом формы (добавление и удаление), проектируйте такие элементы программно с самого начала: создавайте их в обработчике ПриСозданииНаСервере, а не рисуйте в конфигураторе. Тогда вы получите полный контроль над их жизненным циклом.

Сравнение вариантов

Видимость = Ложь

Подходит для элементов из конфигуратора. Элемент остаётся в структуре формы, его можно быстро показать снова. Минус: элемент продолжает занимать место в дереве и участвует в логике формы.

Элементы.Удалить()

Подходит только для программно созданных элементов. Полное удаление из структуры формы. Минус: для восстановления нужно пересоздавать элемент со всеми свойствами и обработчиками.

Условное создание в ПриСозданииНаСервере

Элемент вообще не создаётся, если не нужен. Самый чистый вариант для динамических форм, но требует продумывания логики заранее.

Удаление элементов в обычной форме

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

// Обычная форма

Элемент = ЭлементыФормы.Найти("НадписьПодсказка");

Если Элемент <> Неопределено Тогда

ЭлементыФормы.Удалить(Элемент);

КонецЕсли;

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

Удаление связанных элементов: команд, реквизитов, колонок

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

// Полный цикл: удаляем кнопку и связанную команду

Элементы.Удалить(Элементы.КнопкаВыгрузка);

Команда = Команды.Найти("КомандаВыгрузка");

Если Команда <> Неопределено Тогда

Команды.Удалить(Команда);

КонецЕсли;

При удалении колонки таблицы данные в самой таблице значений остаются — удаляется только визуальное отображение. Если нужно убрать и данные, работайте с реквизитом формы через ИзменитьРеквизиты(). Помните, что изменение состава реквизитов возможно только на сервере.

Пошаговый порядок безопасного удаления

Чтобы удаление элемента не сломало форму, действуйте последовательно и проверяйте результат на каждом шаге.

Порядок действий
  1. 1
    Определите, как создан элемент: в конфигураторе или программно. Для элементов из конфигуратора используйте Видимость = Ложь.
  2. 2
    Найдите элемент методом Элементы.Найти() и проверьте, что он не равен Неопределено.
  3. 3
    Проверьте зависимости: назначенные команды, связанные реквизиты, подчинённые элементы внутри группы.
  4. 4
    Удалите элемент методом Элементы.Удалить(), затем удалите связанную команду, если она больше не нужна.
  5. 5
    Откройте форму в режиме предприятия и убедитесь, что элемент исчез, а ошибок в журнале регистрации нет.

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

Типичные ошибки и как их избежать

Большинство проблем при программном удалении элементов связано с нарушением ограничений платформы или потерей ссылок на удалённые объекты.

Типичные ошибки
01
Попытка удалить элемент, созданный в конфигураторе — платформа выдаёт ошибку. Решение: использовать Видимость = Ложь или перенести создание элемента в код.
02
Удаление элемента без проверки через Найти() — если элемента нет, код падает с ошибкой. Всегда проверяйте результат поиска.
03
Обращение к удалённому элементу позже в коде формы — после удаления все обращения по имени вызывают ошибку. Пересмотрите логику обработчиков.
04
Удаление элемента на клиенте при работе с реквизитами — изменение состава реквизитов возможно только в серверном контексте.
05
Удаление группы с нужными вложенными элементами — они удаляются вместе с родителем. Сначала переместите нужные элементы.

Ещё одна тонкость — контекст выполнения. Само удаление элемента (Элементы.Удалить) доступно и на клиенте, и на сервере, но если логика удаления завязана на изменение реквизитов формы, весь блок должен выполняться в серверной процедуре, обычно в ПриСозданииНаСервере или в вызове сервера с клиента.

Контрольные точки

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

Открытие формы после изменений
Норма

Форма открывается без ошибок, удалённый элемент отсутствует в интерфейсе

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

Ошибка «Элемент формы не найден» или «не может быть удален» при открытии

Работа оставшихся элементов
Норма

Кнопки и поля, связанные логикой с удалённым элементом, работают корректно

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

Ошибки при нажатии кнопок или перерисовке формы

Журнал регистрации
Норма

Нет новых ошибок после работы с формой

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

Ошибки обращения к несуществующему элементу формы

FAQ

Можно ли удалить элемент формы, созданный в конфигураторе?

В управляемой форме — нет, платформа запрещает удаление таких элементов. Используйте свойство Видимость = Ложь. Если нужен полный контроль, создавайте элемент программно в ПриСозданииНаСервере. В обычных формах ограничения нет — удалить можно любой элемент через ЭлементыФормы.Удалить().

Как удалить элемент, если я не знаю, существует ли он?

Используйте метод Элементы.Найти("ИмяЭлемента") — он вернёт элемент или Неопределено. Удаляйте только при условии, что результат не равен Неопределено. Прямое обращение Элементы.ИмяЭлемента без проверки вызовет ошибку, если элемента нет.

Что происходит с вложенными элементами при удалении группы?

Все элементы внутри группы удаляются вместе с ней. Если часть вложенных элементов нужно сохранить, переместите их в другую группу методом Элементы.Переместить() до удаления родителя.

Удаляется ли команда вместе с кнопкой?

Нет. Команда формы — отдельный объект в коллекции Команды. После удаления кнопки команда остаётся и, если она больше не нужна, её следует удалить отдельно: Команды.Удалить(Команды.ИмяКоманды). Удалять команду раньше кнопки нельзя — кнопка потеряет действие.

Можно ли удалить элемент формы на клиенте?

Метод Элементы.Удалить() доступен в клиентском контексте. Однако если удаление связано с изменением реквизитов формы (ИзменитьРеквизиты), такой код работает только на сервере. Практичное решение — выполнять всю логику перестроения формы в серверных процедурах.

Как вернуть удалённый элемент обратно?

Удаление необратимо: элемент нужно создать заново методом Элементы.Добавить() с указанием типа, родителя и всех необходимых свойств, включая назначение команды и обработчиков. Если элемент может понадобиться снова, надёжнее использовать Видимость вместо удаления.

Итог

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

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