Как использовать свою форму в расширении 1С, не создавая новую роль

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

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

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

Причина возникновения проблемы

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

Способ 1. «Подселение» формы в существующий объект

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

Рассмотрим по шагам реализацию этого метода:

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

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


ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("РежимВыбора", Истина);
ОткрытьФорму("Справочник.Валюты.Форма.НашаНоваяФормаНастроек", ПараметрыФормы);

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

Способ 2. Использование основных ролей расширения

Если мы хотим оставаться в рамках «красивой» архитектуры и не «мусорить» в метаданных справочников, проанализируем штатную возможность платформы, появившуюся в последних версиях 8.3. В свойствах самого Расширения существует свойство Использовать основные роли для всех пользователей.

Разберем алгоритм работы с этим механизмом:

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

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

Способ 3. Программная модификация существующей формы

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

Пример программного добавления элементов в расширении:


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

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

Важное дополнение: О правильном коде в формах

В процессе обсуждения «гуру-тестов» на форумах часто всплывают вопросы не только архитектуры метаданных, но и качества кода. Например, при обработке данных в новых формах часто используются циклы. Разберем, как правильно организовать порционную обработку данных, чтобы не допустить зацикливания, о чем спорили участники обсуждения.

Вместо опасного Пока Истина Цикл, который может «подвесить» сеанс при ошибке, рассмотрим более безопасный вариант с ограниченным количеством попыток или условием выхода:


Успешно = Ложь;
Для СчетчикПопыток = 1 По 5 Цикл
    Попытка
        Результат = Запрос.Выполнить();
        Успешно = Истина;
        Прервать; // Выходим, если все хорошо
    Исключение
        // Логируем ошибку или ждем перед повтором
        ЗаписьЖурналаРегистрации("Ошибка запроса", УровеньЖурналаРегистрации.Предупреждение);
    КонецПопытки;
КонецЦикла;

Если Не Успешно Тогда
    ВызватьИсключение "Не удалось выполнить операцию после 5 попыток.";
КонецЕсли;

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

Выбор метода зависит от ваших целей и условий эксплуатации системы:

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

← На главную