Как вывести на форму реквизит, скрытый функциональной опцией, с помощью расширения

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

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

Анализируем механизмы работы функциональных опций

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

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

Ограничения расширений по изменению состава функциональных опций

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

Также стоит учитывать влияние режима совместимости конфигурации:

  1. Режим совместимости 8.3.14 и ниже: Функциональные опции, созданные в расширении, могут управлять только теми объектами, которые также созданы (или добавлены) в этом же расширении. Управлять видимостью «родных» реквизитов типовой конфигурации из расширения с помощью ФО не получится.
  2. Режим совместимости 8.3.15 и выше: Здесь возможности расширились, и ФО из расширения могут влиять на объекты основной конфигурации, но правило логического «И» сохраняется, что делает создание «разрешающей» опции бесполезным, если основная запрещает показ.

Решение 1: Активация типового механизма и исправление ошибок метаданных

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

При включении учета по подразделениям система обращается к плану видов характеристик ВидыСубконтоХозрасчетные. В версии ПРОФ там может отсутствовать предопределенное значение РегистрацияВНалоговомОргане. Чтобы решить проблему, выполним следующие шаги:

  1. Добавим в расширение План видов характеристик ВидыСубконтоХозрасчетные.
  2. Создадим программно или через расширение недостающий элемент.
  3. Используем программную подмену предопределенного значения.

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


// В модуле расширения или внешней обработке
Процедура НастроитьУчетПоПодразделениям() Экспорт
    НовоеЗначение = ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.НайтиПоНаименованию("Регистрация в налоговом органе");
    Если ЗначениеЗаполнено(НовоеЗначение) Тогда
        // Вызываем типовую процедуру настройки (если она доступна в ПРОФ)
        // БухгалтерскийУчетКлиентСервер.НастроитьПланСчетовДляОбособленныхПодразделений(НовоеЗначение);
    КонецЕсли;
КонецПроцедуры

Решение 2: Программный обход видимости на форме

Если мы не хотим включать тяжелую функциональность КОРП, нам нужно заставить форму игнорировать состояние функциональной опции. Простое изменение свойства Видимость в событии ПриСозданииНаСервере часто не помогает, так как механизмы ФО отрабатывают позже.

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

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


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

Решение 3: Работа с движениями документа

Важно понимать, что просто «показать» поле на форме недостаточно. Если функциональная опция ВестиУчетПоПодразделениям выключена, типовые механизмы проведения документов (модули объектов) будут игнорировать заполненное подразделение при формировании проводок. Даже если пользователь выберет подразделение, в регистре бухгалтерии Хозрасчетный измерение Подразделение останется пустым.

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


&После("ОбработкаПроведения")
Процедура Расш1_ОбработкаПроведенияПосле(Отказ, РежимПроведения)
    // Проверяем, нужно ли нам заполнять подразделение принудительно
    Для Каждого Движение Из Движения.Хозрасчетный Цикл
        // Допустим, мы берем подразделение из реквизита шапки документа
        Если Не ЗначениеЗаполнено(Движение.ПодразделениеДт) Тогда
            Движение.ПодразделениеДт = ЭтотОбъект.ПодразделениеОрганизации;
        КонецЕсли;
        Если Не ЗначениеЗаполнено(Движение.ПодразделениеКт) Тогда
            Движение.ПодразделениеКт = ЭтотОбъект.ПодразделениеОрганизации;
        КонецЕсли;
    КонецЦикла;
    
    // Не забываем записать изменения, если это необходимо
    Движения.Хозрасчетный.Записывать = Истина;
КонецПроцедуры

Подведем итоги

Исключение реквизита из состава функциональной опции в расширении — задача, не имеющая прямого решения «одной галочкой» из-за ограничений платформы. Однако, комбинируя программное управление формой и корректировку движений, мы можем добиться желаемого результата.

Помните о рисках:

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

← На главную