Как в расширении исключить реквизит из состава функциональной опции

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

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

Анализ ограничений механизмов расширения

Прежде всего, нам необходимо проанализировать, как работают расширения на уровне метаданных. В текущей реализации платформы 1С:Предприятие 8.3 расширения работают по принципу дополнения. Мы можем добавить новый объект, включить существующий объект в новую функциональную опцию или расширить состав существующей. Однако платформа не позволяет выполнять операцию «вычитания». Это означает, что «снять галочку» с реквизита в составе типовой функциональной опции через расширение физически невозможно.

Также важно прояснить логику работы платформы при включении реквизита в несколько функциональных опций. Рассмотрим ситуацию: реквизит СкладОтправитель входит в типовую ФО_ИспользоватьПеремещения. Вы создаете в расширении свою МояФО_ВсегдаВключена и добавляете туда этот же реквизит. Вопреки ожиданиям, реквизит не станет видимым. Платформа использует логическое правило «И»: для отображения элемента формы должны быть включены все функциональные опции, в которые он входит. Таким образом, добавление в новую опцию только усугубит ситуацию.

Способ 1: Отвязка элемента формы от функциональной опции

Если ваша задача — просто отобразить реквизит на конкретной форме, наиболее правильным путем будет работа с метаданными самой формы в расширении. Проанализируем шаги:

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

Способ 2: Программное управление видимостью

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

Рассмотрим использование обработчика ПриСозданииНаСервере. Нам нужно установить видимость после того, как отработали стандартные механизмы. Используем аннотацию &После:


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

Условное оформление формы часто имеет приоритет выше, чем стандартные настройки видимости элементов, продиктованные функциональными опциями, что позволяет «вытащить» поле на форму.

Способ 3: Использование «прокси-реквизита» в расширении

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

Проанализируем алгоритм реализации:

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

Рассмотрим пример кода в модуле формы расширения для синхронизации:


&НаСервере
Процедура Расш1_ПриЧтенииНаСервере(ТекущийОбъект)
    // Переносим данные из типового реквизита в наш расширенный при открытии
    ЭтаФорма.Расш1_СкладОтправитель = ТекущийОбъект.СкладОтправитель;
КонецПроцедуры

&НаКлиенте
Процедура Расш1_СкладОтправительПриИзменении(Элемент)
    // Синхронизируем данные при изменении пользователем
    КопироватьРеквизитВОбъект();
КонецПроцедуры

&НаСервере
Процедура КопироватьРеквизитВОбъект()
    // Записываем значение обратно в типовой реквизит объекта формы
    Объект.СкладОтправитель = ЭтаФорма.Расш1_СкладОтправитель;
КонецПроцедуры

Этот метод позволяет полностью игнорировать влияние функциональных опций на интерфейс, так как ваш новый реквизит Расш1_СкладОтправитель в них не входит. При этом целостность данных сохраняется, так как перед записью объекта данные всегда попадают в основное поле СкладОтправитель.

Влияние на отчеты и динамические списки

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

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

← На главную