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