Как удалить элементы заимствованной формы в расширении 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

В этой статье мы подробно разберем, почему платформа накладывает такие ограничения, проанализируем архитектуру работы расширений и рассмотрим 5 практических способов решения этой задачи — от стандартного скрытия элементов до продвинутых методов с использованием XML-выгрузки и программных интерфейсов БСП.

---

Почему платформа 1С запрещает удалять заимствованные элементы?

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

Таким образом, запрет на удаление — это защитный механизм платформы. Тем не менее, существует несколько проверенных способов получить нужный результат.

---

Способ 1. Управление видимостью (Рекомендованный стандарт 1С)

Если ваша цель заключается в том, чтобы пользователи просто не видели определенные стандартные элементы формы, самым простым, надежным и безопасным путем является отключение их видимости. При этом элементы физически остаются в структуре, но скрываются с экрана.

Вариант А. Интерактивная настройка в дизайнере:

  1. Откройте заимствованную форму в редакторе расширения.
  2. Выберите элемент, который хотите скрыть.
  3. В палитре свойств найдите флаг Видимость и снимите его. Свойство примет значение Ложь (в расширении оно будет выделено жирным шрифтом).

Вариант Б. Программное скрытие в коде:

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


&НаСервере
Процедура Расш1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
    
    // Скрываем ненужное поле ввода
    Если Элементы.Найти("Цена") <> Неопределено Тогда
        Элементы.Цена.Видимость = Ложь;
    КонецЕсли;
    
    // Скрываем кнопку командной панели
    Если Элементы.Найти("ФормаПровестиИЗакрыть") <> Неопределено Тогда
        Элементы.ФормаПровестиИЗакрыть.Видимость = Ложь;
    КонецЕсли;
    
КонецПроцедуры

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

---

Способ 2. Создание собственной формы в расширении (Вместо заимствования)

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

  1. Заимствуйте в ваше расширение нужный объект метаданных (например, справочник Номенклатура), но не заимствуйте его формы.
  2. В дереве метаданных расширения кликните правой кнопкой мыши по заимствованному объекту, перейдите в ветку Формы и нажмите кнопку Добавить.
  3. Создайте абсолютно новую форму (например, с именем ФормаЭлементаСобственная). Она изначально будет чистой.
  4. Откройте свойства заимствованного справочника в расширении и в строке Основная форма элемента укажите вашу вновь созданную форму.

Теперь при открытии карточки номенклатуры система будет запускать вашу пустую форму из расширения. Вы можете конструировать её интерфейс так, как вам угодно, без оглядки на ограничения вендора.

---

Способ 3. Очистка формы через выгрузку и загрузку файлов XML

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

Для выполнения этой операции выполните следующие действия:

  1. Создайте в конфигураторе новую временную базу данных и добавьте в её конфигурацию пустой документ/справочник с тем же именем, что и целевой объект в рабочей базе (реквизиты добавлять не нужно).
  2. Выгрузите ваше рабочее расширение в файл .cfe и загрузите его в созданную временную базу. Игнорируйте предупреждения платформы о несоответствии структуры метаданных.
  3. В конфигурации временной базы создайте пустую форму для этого документа и заимствуйте её в расширение.
  4. Выполните выгрузку конфигурации временного расширения в файлы XML через меню: Конфигурация -> Выгрузить конфигурацию в файлы....
  5. Платформа при выгрузке и последующей обратной загрузке сбросит жесткие связи элементов формы. Сразу после выгрузки выполните команду: Конфигурация -> Загрузить конфигурацию из файлов....
  6. Сохраните полученное расширение обратно в файл .cfe.
  7. Откройте вашу основную рабочую базу, перейдите в рабочее расширение и запустите процедуру Сравнить, объединить с конфигурацией из файла..., указав подготовленный файл .cfe. Объедините только нужную форму.

В результате в вашем рабочем расширении появится заимствованная форма, полностью очищенная от элементов в визуальном редакторе.

---

Способ 4. Динамическое изменение интерфейса без заимствования форм (Через БСП)

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

Для реализации этого подхода выполните следующие шаги:

  1. Заимствуйте в расширение общий модуль БСП, отвечающий за интеграцию интерфейса (например, УправлениеКлиентскимИнтерфейсомБСП или МодификацияКонфигурацииПереопределяемый).
  2. Используйте механизм перехвата вызовов (аннотации &Вместо, &Перед или &После).
  3. Внедрите программный код, который будет анализировать тип открываемой формы и динамически модифицировать её состав "на лету" при запуске приложения:

&Вместо("ПриСозданииНаСервере")
Процедура Мод_ПриСозданииНаСервере(Форма, Отказ, СтандартнаяОбработка)
    
    // Проверяем, что открывается форма нужного нам справочника
    Если Форма.ИмяФормы = "Справочник.Номенклатура.Форма.ФормаЭлемента" Тогда
        
        // Программно добавляем новую команду формы
        НоваяКоманда = Форма.Команды.Добавить("СпецДействие");
        НоваяКоманда.Действие = "Подключаемый_ВыполнитьСпецДействие";
        НоваяКоманда.Заголовок = "Специальное действие";
        
        // Программно добавляем кнопку на форму
        НоваяКнопка = Форма.Элементы.Добавить("КнопкаСпецДействие", Тип("КнопкаФормы"), Форма.Элементы.КоманднаяПанель);
        НоваяКнопка.ИмяКоманды = "СпецДействие";
        
    КонецЕсли;
    
КонецПроцедуры

Почему это выгодно? Формы документов и справочников часто меняются вендором при обновлениях. Если вы не заимствуете форму физически в расширение, то ваше решение гарантированно не сломается при очередном обновлении релиза конфигурации.

---

Сравнение методов: какой вариант выбрать?

Давайте резюмируем информацию и определим, в каких ситуациях предпочтителен каждый из рассмотренных методов:

  1. Управление видимостью (Способ 1) — выбирайте всегда, когда нужно просто убрать с глаз пользователя несколько типовых полей или кнопок. Это быстро и безопасно.
  2. Создание собственной формы (Способ 2) — идеальный вариант, если требуется кардинальное изменение логики работы объекта и стандартный интерфейс полностью не подходит.
  3. Выгрузка в XML-файлы (Способ 3) — подходит для опытных разработчиков, которым принципиально важно очистить заимствованную форму в режиме проектирования конфигуратора.
  4. Использование механизмов БСП (Способ 4) — лучший архитектурный выбор для крупных корпоративных систем, где критически важна простота последующих обновлений программы.
← На главную