Почему новые объекты из расширения 1С не отображаются в меню «Все функции»?

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

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

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

Выясняем причину: как роли в расширении влияют на видимость объектов

Для начала проанализируем поведение платформы «1С:Предприятие» при работе с правами доступа в расширениях. Логика работы системы безопасности зависит от наличия ролей внутри самого расширения. Здесь действует важное правило, которое делит работу расширения на два режима:

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

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

Решение проблемы в современных версиях платформы (8.3.14 и выше)

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

Разберем по шагам процесс настройки:

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

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

Интеграция с Библиотекой стандартных подсистем (БСП)

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

Альтернативный вариант: программное управление доступом

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

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


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

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

Важные архитектурные риски: почему не стоит злоупотреблять метаданными в расширениях

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

1. Проблемы производительности СУБД (разделение таблиц)

Когда мы заимствуем стандартный объект (например, справочник Номенклатура) и добавляем к нему новый реквизит в расширении, платформа не добавляет новую колонку в основную таблицу СУБД _ReferenceXX. Вместо этого СУБД создает отдельную физическую таблицу для расширения.

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

2. Риск безвозвратной потери данных

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

Именно поэтому в сообществе 1С пользуется популярностью компромиссный подход:

Технические ограничения расширений

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

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

← На главную