Как добавить константу из расширения в подсистему основной конфигурации

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

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

Механизм объединения состава подсистем в расширениях

Разберем основной страх разработчиков: «Что будет, если я добавлю одну и ту же подсистему основной конфигурации в несколько разных расширений?». Проанализируем поведение платформы. Когда мы заимствуем подсистему в Расширение1 и Расширение2, 1С не заменяет одну подсистему другой. Напротив, происходит автоматическое слияние (мерж) их состава.

Посмотрим на алгоритм действий:

  1. В Расширение1 добавляем (заимствуем) нужную подсистему и включаем в её состав Константа1.
  2. В Расширение2 выполняем аналогичное действие: заимствуем ту же подсистему и включаем в неё Константа2.
  3. При запуске системы в режиме «Предприятие» платформа объединит эти изменения. В результате пользователь увидит в меню подсистемы оба объекта одновременно.

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

Настройка командного интерфейса подсистемы

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

Внутри расширения для заимствованной подсистемы необходимо вызвать контекстное меню и выбрать пункт «Открыть командный интерфейс». Здесь важно проверить следующее:

Назначение прав доступа (Роли)

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

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

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

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

Программная работа с константами в формах

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

Для чтения и записи значения мы будем использовать стандартные методы. Посмотрим на пример кода в модуле формы:


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

&НаСервере
Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи)
    // Сохраняем значение после записи формы настроек
    Константы.ИмяВашейКонстантыИзРасширения.Установить(ЗначениеПоляНаФорме);
КонецПроцедуры

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

Использование функциональных опций

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

Выясним, как это работает в расширении:

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

Ограничения и приоритеты применения расширений

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

Также стоит помнить об ограничении типов: тип данных константы в расширении может быть примитивным (Число, Строка, Дата, Булево) или ссылочным. Однако нельзя использовать в качестве типа объект, созданный в другом расширении, если между ними не настроена связь «дополнение». Старайтесь использовать типы из основной конфигурации для обеспечения максимальной стабильности системы.

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

← На главную