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

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

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

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

Почему платформа скрывает реквизит даже во внешней обработке?

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

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

Способ 1. Программное создание реквизита с «размытым» типом

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

Разберем по шагам, как реализовать это в событии ПриСозданииНаСервере:

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

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


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

Использование составного типа ОписаниеТипов позволяет элементу оставаться видимым, так как он больше не привязан монолитно к объекту, скрытому функциональной опцией. Для изучения практической реализации таких механизмов подойдёт обработка с примером динамического создания элементов формы.

Способ 2. Использование метода УстановитьОтображениеФункциональныхОпций

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

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

Пример вызова в модуле формы:


&НаКлиенте
Процедура ПриОткрытии(Отказ)
    // Принудительно включаем отображение всех элементов, завязанных на ФО
    УстановитьОтображениеФункциональныхОпций(Истина);
КонецПроцедуры

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

Способ 3. Реквизит с типом «ЛюбаяСсылка» и ручная обработка выбора

Проанализируем еще одну ситуацию: если нам не хочется динамически менять состав реквизитов формы, мы можем заранее создать в обработке реквизит с типом ЛюбаяСсылка. Платформа 1С не связывает этот тип с конкретной функциональной опцией справочника ЕдиницыИзмерения, поэтому поле всегда будет видимым.

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

Алгоритм действий следующий:

  1. Создаем реквизит формы ВыбраннаяЕдиница с типом ЛюбаяСсылка.
  2. Выносим его на форму.
  3. В свойствах элемента формы включаем КнопкаВыбора.
  4. Создаем обработчик события НачалоВыбора.

Пример реализации подмены выбора:


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

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

Способ 4. Подмена параметров функциональных опций для формы

Если функциональная опция в конфигурации привязана не к простой константе, а к параметру (например, Организация или Склад), мы можем воспользоваться методом УстановитьПараметрыФункциональныхОпцийФормы.

Этот метод позволяет установить значения параметров ФО индивидуально для конкретной формы. Рассмотрим пример, когда видимость единиц измерения зависит от параметра ИспользоватьЕдиницы в регистре сведений.


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

Этот способ является наиболее «чистым» с точки зрения архитектуры 1С, так как он не меняет глобальные данные базы (константы), а лишь переопределяет логику отображения для конкретного окна. Однако он работает только в том случае, если ФО настроена на использование параметров.

Резюме и рекомендации

Подведем итог нашему анализу. Выбор метода зависит от ваших задач:

  1. Если нужна максимальная простота: Используйте реквизит типа ЛюбаяСсылка и переопределите событие НачалоВыбора. Это гарантирует видимость и не требует сложного программного создания элементов.
  2. Если нужно сохранить строгую типизацию: Используйте программное добавление реквизита с составным типом (СправочникСсылка... + Строка) в событии ПриСозданииНаСервере.
  3. Если нужно временно включить всё: Используйте УстановитьОтображениеФункциональныхОпций(Истина), но не забывайте возвращать значение в Ложь при закрытии обработки.

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

← На главную