При разработке расширений для конфигураций на платформе 1С:Предприятие 8.3 программисты часто сталкиваются с дилеммой: нужно добавить новую форму (например, вспомогательный инструмент или окно настроек), но не хочется заставлять администратора системы заходить в конфигуратор или профили групп доступа, чтобы назначать пользователям новую роль из расширения. Это особенно актуально в распределенных базах или крупных компаниях, где любой апдейт прав — это сложная бюрократическая процедура.
В рамках данного материала мы проанализируем ситуацию, разберем несколько способов решения этой задачи — от «хитрых» костылей до штатных механизмов платформы — и выясним, какой из них лучше использовать в реальной практике.
В системе прав доступа 1С Общие формы являются самостоятельными объектами метаданных. Чтобы пользователь мог открыть такую форму, у него в наборе прав должно быть явно разрешено действие Просмотр для этой конкретной формы. Если вы добавляете общую форму в расширение, она автоматически становится недоступной для всех, кроме обладателей «Полных прав», пока вы не создадите роль в расширении и не включите в нее эту форму. Рассмотрим, как этого избежать.
Это решение часто называют «лайфхаком» или «костылем», но оно крайне эффективно для быстрых правок. Суть заключается в том, что проверка прав на формы объектов (справочников, документов) работает иначе, чем на общие формы. Для открытия формы справочника пользователю достаточно иметь право Просмотр на сам справочник.
Рассмотрим по шагам реализацию этого метода:
Номенклатура, Валюты или Пользователи.Теперь мы можем программно вызвать эту форму из любого места кода. Платформа проверит права на справочник Валюты, увидит, что они есть, и позволит открыть любую его форму, включая нашу новую. Пример вызова такой формы будет выглядеть следующим образом:
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("РежимВыбора", Истина);
ОткрытьФорму("Справочник.Валюты.Форма.НашаНоваяФормаНастроек", ПараметрыФормы);
Важный нюанс: Старайтесь выбирать максимально «стабильные» объекты. Если привязать форму к справочнику, который в будущем может быть удален или сильно изменен в типовой конфигурации, это создаст проблемы при обновлении. Идеально подходят базовые справочники, используемые во всех подсистемах.
Если мы хотим оставаться в рамках «красивой» архитектуры и не «мусорить» в метаданных справочников, проанализируем штатную возможность платформы, появившуюся в последних версиях 8.3. В свойствах самого Расширения существует свойство Использовать основные роли для всех пользователей.
Разберем алгоритм работы с этим механизмом:
БазовыеПраваРасширения).Просмотр на все наши новые объекты: общие формы, обработки и отчеты расширения.Истина.После подключения такого расширения платформа автоматически добавит права этой роли каждому пользователю, который авторизуется в базе. Нам не нужно менять профили групп доступа или создавать новые группы — форма станет доступной магическим образом сразу после установки расширения.
Иногда вместо создания новой формы целесообразнее изменить существующую. Проанализируем ситуацию: если нам нужно добавить лишь несколько кнопок или полей, мы можем заимствовать типовую форму и в процедуре ПриСозданииНаСервере программно изменить ее интерфейс до неузнаваемости.
Пример программного добавления элементов в расширении:
&НаСервере
Процедура Расш1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
// Добавляем новую группу на форму
НоваяГруппа = Элементы.Добавить("ГруппаДополнительныхНастроек", Тип("ГруппаФормы"), Элементы.ГруппаКоманднаяПанель);
НоваяГруппа.Вид = ВидГруппыФормы.ОбычнаяГруппа;
НоваяГруппа.Заголовок = "Дополнительно";
// Добавляем команду и кнопку
НоваяКоманда = Команды.Добавить("ВыполнитьДействие");
НоваяКоманда.Действие = "Подключаемый_ВыполнитьДействие";
НоваяКнопка = Элементы.Добавить("КнопкаДействия", Тип("КнопкаФормы"), НоваяГруппа);
НоваяКнопка.ИмяКоманды = "ВыполнитьДействие";
КонецПроцедуры
Этот метод не требует вообще никаких манипуляций с ролями, так как контекст прав определяется самой формой, к которой пользователь уже имеет доступ.
В процессе обсуждения «гуру-тестов» на форумах часто всплывают вопросы не только архитектуры метаданных, но и качества кода. Например, при обработке данных в новых формах часто используются циклы. Разберем, как правильно организовать порционную обработку данных, чтобы не допустить зацикливания, о чем спорили участники обсуждения.
Вместо опасного Пока Истина Цикл, который может «подвесить» сеанс при ошибке, рассмотрим более безопасный вариант с ограниченным количеством попыток или условием выхода:
Успешно = Ложь;
Для СчетчикПопыток = 1 По 5 Цикл
Попытка
Результат = Запрос.Выполнить();
Успешно = Истина;
Прервать; // Выходим, если все хорошо
Исключение
// Логируем ошибку или ждем перед повтором
ЗаписьЖурналаРегистрации("Ошибка запроса", УровеньЖурналаРегистрации.Предупреждение);
КонецПопытки;
КонецЦикла;
Если Не Успешно Тогда
ВызватьИсключение "Не удалось выполнить операцию после 5 попыток.";
КонецЕсли;
Выбор метода зависит от ваших целей и условий эксплуатации системы:
Помните, что безопасность — это не только наличие прав, но и корректность кода внутри ваших форм. Используя данные приемы, вы сможете значительно упростить процесс внедрения ваших разработок через расширения.