Имя: Пароль:
1C
1С v8
Реализация создания на основании в расширении
0 SORTULV_1C
 
16.03.26
00:09
Доброго времени суток, господа!
Подскажите, хочу в расширении взять типовой функционал создания на основании документа, сделать на его основании функционал.

Документ ОтчетКомитенту, нужно создать на основании расход из кассы/со счета 50% суммы, пните в направлении, куда смотреть.
Создание на основании не записывает документ, нужно сделать так же.
По идее же просто передать структуру с параметрами, а на стороне документа при открытии использовать параметры уже, разве нет?
1 2S
 
16.03.26
06:04
2 DrZombi
 
гуру
16.03.26
06:56
(0) Боюсь вас ждёт разочарования в расширениях. Не всё они позволяют :)
3 DrZombi
 
гуру
16.03.26
07:01
(1) В статье есть добавление роли в расширении.
В БСП есть маленькой казус, оно плохо дружит с ролями из расширения :)
4 2S
 
16.03.26
07:07
(3) Добавить права на команду в типовую роль "БазовыеПраваБП". Если я правильно понял посыл )
5 denk32
 
16.03.26
07:32
6 DrZombi
 
гуру
16.03.26
08:22
(4) Да. Это сработает в данном варианте.
А вот когда объект из Расширения. И надо дать права только "избранным", то тут будет казус :)
7 ZloyBrawler
 
16.03.26
09:51
(3) БСП прекрасно дружит с расширениями и ролями в нем.
У нас 92 роли добавлено и не меньше типовых изменено.
В БСП есть только пара неудобств. Первое, создавать роль с именем ххх_ПолныеПрава не стоит, а то тока админам и будет доступна роль, а назвать можно ххх_ПраваПочтиПолные (с некого релиза приходится так делать).
Другое неудобство, это то, что админу нельзя дать права накидывая еще ролей. Ну это ограничение мы прекрасно сломали этим же расширением. (И это с некого релиза приходится делать)
8 unenu
 
16.03.26
11:10
(7)
Другое неудобство, это то, что админу нельзя дать права накидывая еще ролей.


Разве? А так?

Общий модуль:
УправлениеДоступомСлужебный

Процедура ОбновитьРолиПользователей
Добавить код:

ДополнительныеРолиАдминистратора.Вставить("ххх_ПолныеПрава", Истина);
9 ZloyBrawler
 
16.03.26
21:34
(8) Этот путь вынуждает допилы каждый раз делать и эти роли как понимаю будут всегда, а нужно на уровне юзера все же убирать добавлять интерактивно, поэтому приходится ломать
10 Бертыш
 
16.03.26
21:39
Раз пошла такая пьянка приведу свой кейс из практики. Заказчик у меня есть один привередливый и кейс был не про ввод на основание а про вывод на печать, но принцип схожий. Им было в тз прописанно между какими пунктами вывода на печать должна вставиться добавляемая команда и я всю плешь себе проел пока не сообразил как корректно вмешаться в механизм БСП формирующий меню и уже в этом механизме поменять последовательность элементов меню. Команду то саму добавить тьфу. Добавил и система подцепит, а вот добавить команду чтобы была определённая последовательность команд затача не вполне тривиальная
11 Бертыш
 
16.03.26
21:40
Может кому сгодится
12 ZloyBrawler
 
16.03.26
22:07
наш костыль
ноги не сломайте!
я ничего не показывал никому

модуль УправлениеДоступомСлужебный

&ИзменениеИКонтроль("ОбновитьРолиПользователей")
Процедура Затычки_ОбновитьРолиПользователей(Знач ОписаниеПользователей, Знач ПарольПользователяСервиса, ЕстьИзменения)
    
    чЁта
        
#Удаление
        Если Администраторы[ТекущийПользователь] <> Неопределено Тогда
            ТекущиеНовыеРоли = НовыеРоли;
            НовыеРоли = ТекущиеНовыеРоли.Скопировать(Новый Массив);
            Для Каждого КлючИЗначение Из ОбязательныеРолиАдминистратора Цикл
                НовыеРоли.Добавить().РольСсылка = КлючИЗначение.Значение;
            КонецЦикла;
            Для Каждого КлючИЗначение Из ДополнительныеРолиАдминистратора Цикл
                Если ТекущиеНовыеРоли.Найти(КлючИЗначение.Значение, "РольСсылка") = Неопределено Тогда
                    Продолжить;
                КонецЕсли;
                НовыеРоли.Добавить().РольСсылка = КлючИЗначение.Значение;
            КонецЦикла;
        КонецЕсли;
#КонецУдаления
#Вставка
        // с какого-та фига 1С решила, что у админов должны быть только админские роли и все,
        // а нам та нужно чтобы были у него еще и специфические роли, например программные что-то разрешающие или запрещающие
        // поэтому чисто убедимся чтобы среди отмеченных ролей были все обязательные роли админа
        Если Администраторы[ТекущийПользователь] <> Неопределено Тогда
            Для Каждого КлючИЗначение Из ОбязательныеРолиАдминистратора Цикл
                Если НовыеРоли.Найти(КлючИЗначение.Значение, "РольСсылка") <> Неопределено Тогда
                    Продолжить;
                КонецЕсли;
                НовыеРоли.Добавить().РольСсылка = КлючИЗначение.Значение;
            КонецЦикла;
        КонецЕсли;
#КонецВставки
        
        чЁта
    
КонецПроцедуры

>специфические роли, например программные
имеется ввиду такие роли, которые не дают никаких прав на объекты, а только в коде используется проверка на их наличие или отсутствие, типа если нет такой роли, то запрещать провести документ, если в нем такого-та рода косяки...
13 banco
 
16.03.26
23:04
(10) У команды печати есть поле Порядок
14 DrZombi
 
гуру
17.03.26
08:12
(12) Ха , а мы так делали :)

Общий модуль "УправлениеДоступомСлужебный"

//Для Ролей из расширения
ОбновитьНаборыЗаписей

&Вместо("ОбновитьНаборыЗаписей")
Процедура СОГ_ОбновитьНаборыЗаписей(Знач Данные, ЕстьИзменения) Экспорт
    
    
    ВсеПараметры = Новый Структура;
    ВсеПараметры.Вставить("МенеджерРегистра");
    ВсеПараметры.Вставить("НовыеЗаписи");
    ВсеПараметры.Вставить("ПоляСравнения");
    ВсеПараметры.Вставить("ИмяПервогоИзмерения");
    ВсеПараметры.Вставить("ЗначенияПервогоИзмерения");
    ВсеПараметры.Вставить("ИмяВторогоИзмерения");
    ВсеПараметры.Вставить("ЗначенияВторогоИзмерения");
    ВсеПараметры.Вставить("ИмяТретьегоИзмерения");
    ВсеПараметры.Вставить("ЗначенияТретьегоИзмерения");
    ВсеПараметры.Вставить("НовыеЗаписиСодержатТолькоРазличия", Ложь);
    ВсеПараметры.Вставить("ФиксированныйОтбор");
    ВсеПараметры.Вставить("ТолькоПроверка", Ложь);
    ВсеПараметры.Вставить("ДополнительныеСвойства");
    ВсеПараметры.Вставить("ОбновлениеИБ",
            ОбновлениеИнформационнойБазы.ВыполняетсяОбновлениеИнформационнойБазы()
        Или ОбновлениеИнформационнойБазы.ЭтоВызовИзОбработчикаОбновления());
    
    ЗаполнитьПараметры(Данные, ВсеПараметры, "МенеджерРегистра, НовыеЗаписи");
    
    // Предварительная обработка параметров.
    
    Если НЕ ГруппаПараметровИзмеренияОбработана(Данные.ИмяПервогоИзмерения, Данные.ЗначенияПервогоИзмерения) Тогда
        ЕстьИзменения = Истина;
        Возврат;
    КонецЕсли;
    Если НЕ ГруппаПараметровИзмеренияОбработана(Данные.ИмяВторогоИзмерения, Данные.ЗначенияВторогоИзмерения) Тогда
        ЕстьИзменения = Истина;
        Возврат;
    КонецЕсли;
    Если НЕ ГруппаПараметровИзмеренияОбработана(Данные.ИмяТретьегоИзмерения, Данные.ЗначенияТретьегоИзмерения) Тогда
        ЕстьИзменения = Истина;
        Возврат;
    КонецЕсли;
    
    УпорядочитьГруппыПараметровИзмерений(Данные);
    
    // Проверка и обновление данных.
    Данные.Вставить("НаборЗаписей",       Данные.МенеджерРегистра.СоздатьНаборЗаписей());
    Данные.Вставить("МетаданныеРегистра", Метаданные.НайтиПоТипу(ТипЗнч(Данные.НаборЗаписей)));
    Данные.Вставить("ПолноеИмяРегистра",  Данные.МетаданныеРегистра.ПолноеИмя());
    
    Если Данные.НовыеЗаписиСодержатТолькоРазличия Тогда
        Данные.Вставить("НаборДляОднойЗаписи", Данные.МенеджерРегистра.СоздатьНаборЗаписей());
    КонецЕсли;
    
    Если Данные.ФиксированныйОтбор <> Неопределено Тогда
        Для каждого КлючИЗначение Из Данные.ФиксированныйОтбор Цикл
            УстановитьОтбор(Данные.НаборЗаписей.Отбор[КлючИЗначение.Ключ], КлючИЗначение.Значение);
        КонецЦикла;
    КонецЕсли;
    
    Если Данные.НовыеЗаписиСодержатТолькоРазличия Тогда
        
        Если Данные.ИмяПервогоИзмерения = Неопределено Тогда
            ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
                НСтр("ru = 'Некорректные параметры в процедуре %1.'"),
                "ОбновитьНаборыЗаписей");
            ВызватьИсключение ТекстОшибки;
        Иначе
            Если Данные.ИмяВторогоИзмерения = Неопределено Тогда
                ЗаписьНесколькимиНаборами = Ложь;
            Иначе
                ЗаписьНесколькимиНаборами = ЗаписьНесколькимиНаборами(Данные,
                    Новый Структура, Данные.ИмяПервогоИзмерения, Данные.ЗначенияПервогоИзмерения);
            КонецЕсли;
            
            Если ЗаписьНесколькимиНаборами Тогда
                СписокПолей = Данные.ИмяПервогоИзмерения + ", " + Данные.ИмяВторогоИзмерения;
                Данные.НовыеЗаписи.Индексы.Добавить(СписокПолей);
                
                КоличествоПоЗначениямПервогоИзмерения = Данные.КоличествоПоЗначениям;
                
                Для каждого ПервоеЗначение Из Данные.ЗначенияПервогоИзмерения Цикл
                    Отбор = Новый Структура(Данные.ИмяПервогоИзмерения, ПервоеЗначение);
                    //УстановитьОтбор(Данные.НаборЗаписей.Отбор[Данные.ИмяПервогоИзмерения], ПервоеЗначение);
                    
                    //+
                    //   Помещено в попытку, т.к. у ролей в расширении нет прав на существования... по мнению БСП от 1С :)
                    Попытка
                        УстановитьОтбор(Данные.НаборЗаписей.Отбор[Данные.ИмяПервогоИзмерения], ПервоеЗначение);
                    Исключение
                        ОписОшибки = ОписаниеОшибки();
                        ТекстСообщения = "Нарушения порядка назначения ролей из РАСШИРЕНИЯ в Профилях. Роль из РАСШИРЕНИЯ должна быть только в одном профиле! "+
                        " Не умеет 1С работать нормально с расширениями. Часть прав не установлено пользователям! "+
                        " Описание: %1";
                        ТекстСообщения = СтрШаблон(ТекстСообщения, ОписОшибки);
                        ЗаписьЖурналаРегистрации("Ошибка установки прав доступа", УровеньЖурналаРегистрации.Ошибка, ,, ТекстСообщения, РежимТранзакцииЗаписиЖурналаРегистрации.Независимая);
                        ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения);
                        Продолжить;
                    КонецПопытки;
                    //-
                    
                    Если Данные.ИмяТретьегоИзмерения = Неопределено Тогда
                        ЗаписьНесколькимиНаборами = Ложь;
                    Иначе
                        // @skip-check query-in-loop - Порционная обработка данных
                        ЗаписьНесколькимиНаборами = ЗаписьНесколькимиНаборами(Данные,
                            Отбор, Данные.ИмяВторогоИзмерения, Данные.ЗначенияВторогоИзмерения);
                    КонецЕсли;
                    
                    Если ЗаписьНесколькимиНаборами Тогда
                        Для каждого ВтороеЗначение Из Данные.ЗначенияВторогоИзмерения Цикл
                            Отбор.Вставить(Данные.ИмяВторогоИзмерения, ВтороеЗначение);
                            УстановитьОтбор(Данные.НаборЗаписей.Отбор[Данные.ИмяВторогоИзмерения], ВтороеЗначение);
                            
                            // Обновление по трем измерениям.
                            ОбновитьНовыеЗаписиНабораПоРазличнымНовымЗаписям(Данные, Отбор, ЕстьИзменения);
                        КонецЦикла;
                        Данные.НаборЗаписей.Отбор[Данные.ИмяВторогоИзмерения].Использование = Ложь;
                    Иначе
                        // Обновление по двум измерениям.
                        Данные.Вставить("КоличествоПоЗначениям", КоличествоПоЗначениямПервогоИзмерения);
                        ОбновитьНовыеЗаписиНабораПоРазличнымНовымЗаписям(Данные, Отбор, ЕстьИзменения);
                    КонецЕсли;
                КонецЦикла;
            Иначе
                // Обновление по одному измерению.
                ПрочитатьКоличествоДляЧтения(Данные);
                ОбновитьНовыеЗаписиНабораПоРазличнымНовымЗаписям(Данные, Новый Структура, ЕстьИзменения);
            КонецЕсли;
        КонецЕсли;
    Иначе
        Если Данные.ИмяПервогоИзмерения = Неопределено Тогда
            // Обновление всех записей.
            
            ТекущиеДанные = Новый Структура("НаборЗаписей, НовыеЗаписи, ПоляСравнения,
                |ТолькоПроверка, ДополнительныеСвойства, ОбновлениеИБ");
            ЗаполнитьЗначенияСвойств(ТекущиеДанные, Данные);
            ОбновитьНаборЗаписей(ТекущиеДанные, ЕстьИзменения);
            
        ИначеЕсли Данные.ИмяВторогоИзмерения = Неопределено Тогда
            // Обновление по одному измерению.
            Отбор = Новый Структура(Данные.ИмяПервогоИзмерения);
            Для каждого Значение Из Данные.ЗначенияПервогоИзмерения Цикл
                
                УстановитьОтбор(Данные.НаборЗаписей.Отбор[Данные.ИмяПервогоИзмерения], Значение);
                Отбор[Данные.ИмяПервогоИзмерения] = Значение;
                
                Если Данные.ЗначенияПервогоИзмерения.Количество() <> 1 Тогда
                    НовыеЗаписиНабора = Данные.НовыеЗаписи;
                Иначе
                    НовыеЗаписиНабора = Данные.НовыеЗаписи.Скопировать(Отбор);
                КонецЕсли;
                
                ТекущиеДанные = Новый Структура("НаборЗаписей, ПоляСравнения,
                    |ТолькоПроверка, ДополнительныеСвойства, ОбновлениеИБ");
                ЗаполнитьЗначенияСвойств(ТекущиеДанные, Данные);
                ТекущиеДанные.Вставить("НовыеЗаписи", НовыеЗаписиНабора);
                
                ОбновитьНаборЗаписей(ТекущиеДанные, ЕстьИзменения);
            КонецЦикла;
            
        ИначеЕсли Данные.ИмяТретьегоИзмерения = Неопределено Тогда
            // Обновление по двум измерениям.
            СписокПолей = Данные.ИмяПервогоИзмерения + ", " + Данные.ИмяВторогоИзмерения;
            Данные.НовыеЗаписи.Индексы.Добавить(СписокПолей);
            Отбор = Новый Структура(СписокПолей);
            
            Для каждого ПервоеЗначение Из Данные.ЗначенияПервогоИзмерения Цикл
                УстановитьОтбор(Данные.НаборЗаписей.Отбор[Данные.ИмяПервогоИзмерения], ПервоеЗначение);
                Отбор[Данные.ИмяПервогоИзмерения] = ПервоеЗначение;
                
                ОбновитьНовыеЗаписиНабораПоВсемНовымЗаписям(
                    Данные,
                    Отбор,
                    СписокПолей,
                    Данные.ИмяВторогоИзмерения,
                    Данные.ЗначенияВторогоИзмерения,
                    ЕстьИзменения);
            КонецЦикла;
        Иначе
            // Обновление по трем измерениям.
            СписокПолей = Данные.ИмяПервогоИзмерения + ", " + Данные.ИмяВторогоИзмерения + ", " + Данные.ИмяТретьегоИзмерения;
            Данные.НовыеЗаписи.Индексы.Добавить(СписокПолей);
            Отбор = Новый Структура(СписокПолей);
            
            Для каждого ПервоеЗначение Из Данные.ЗначенияПервогоИзмерения Цикл
                УстановитьОтбор(Данные.НаборЗаписей.Отбор[Данные.ИмяПервогоИзмерения], ПервоеЗначение);
                Отбор[Данные.ИмяПервогоИзмерения] = ПервоеЗначение;
                
                Для каждого ВтороеЗначение Из Данные.ЗначенияВторогоИзмерения Цикл
                    УстановитьОтбор(Данные.НаборЗаписей.Отбор[Данные.ИмяВторогоИзмерения], ВтороеЗначение);
                    Отбор[Данные.ИмяВторогоИзмерения] = ВтороеЗначение;
                    
                    ОбновитьНовыеЗаписиНабораПоВсемНовымЗаписям(
                        Данные,
                        Отбор,
                        СписокПолей,
                        Данные.ИмяВторогоИзмерения,
                        Данные.ЗначенияВторогоИзмерения,
                        ЕстьИзменения);
                КонецЦикла;
            КонецЦикла;
        КонецЕсли;
    КонецЕсли;
    
КонецПроцедуры



//Для Администраторов, чтобы у них тоже были Роли...
ОбновитьРолиПользователей

&Вместо("ОбновитьРолиПользователей")
Процедура СОГ_ОбновитьРолиПользователей(Знач ОписаниеПользователей = Неопределено,
                                    Знач ПарольПользователяСервиса = Неопределено,
                                    ЕстьИзменения = Ложь) Экспорт
    
    Если НЕ ПользователиСлужебный.ЗапретРедактированияРолей() Тогда
        // Роли устанавливаются механизмами подсистем Пользователи и ВнешниеПользователи.
        Возврат;
    КонецЕсли;
    
    Если ОписаниеПользователей = Неопределено Тогда
        МассивПользователей = Неопределено;
        Пользователи.НайтиНеоднозначныхПользователейИБ(Неопределено);
        
    ИначеЕсли ТипЗнч(ОписаниеПользователей) = Тип("Массив") Тогда
        МассивПользователей = ОписаниеПользователей;
        Если МассивПользователей.Количество() = 0 Тогда
            Возврат;
        ИначеЕсли МассивПользователей.Количество() = 1 Тогда
            Пользователи.НайтиНеоднозначныхПользователейИБ(МассивПользователей[0]);
        Иначе
            Пользователи.НайтиНеоднозначныхПользователейИБ(Неопределено);
        КонецЕсли;
        
    ИначеЕсли ТипЗнч(ОписаниеПользователей) = Тип("Тип") Тогда
        МассивПользователей = ОписаниеПользователей;
        Пользователи.НайтиНеоднозначныхПользователейИБ(Неопределено);
    Иначе
        МассивПользователей = Новый Массив;
        МассивПользователей.Добавить(ОписаниеПользователей);
        Пользователи.НайтиНеоднозначныхПользователейИБ(ОписаниеПользователей);
    КонецЕсли;
    
    УстановитьПривилегированныйРежим(Истина);
    
    ТекущиеСвойстваПользователей = ТекущиеСвойстваПользователей(МассивПользователей);
    
    // Параметры проверки в цикле.
    ВсеРоли                             = ПользователиСлужебный.ВсеРоли().Соответствие;
    ИдентификаторыПользователейИБ       = ТекущиеСвойстваПользователей.ИдентификаторыПользователейИБ;
    НовыеРолиПользователей              = ТекущиеСвойстваПользователей.РолиПользователей;
    ИдентификаторыРолей                 = ТекущиеСвойстваПользователей.ИдентификаторыРолей;
    ИменаРолей                          = ТекущиеСвойстваПользователей.ИменаРолей;
    ОбязательныеРолиАдминистратора      = ТекущиеСвойстваПользователей.ОбязательныеРолиАдминистратора;
    ДополнительныеРолиАдминистратора    = ТекущиеСвойстваПользователей.ДополнительныеРолиАдминистратора;
    Администраторы                      = ТекущиеСвойстваПользователей.Администраторы;
    РазделениеВключено                  = ОбщегоНазначения.РазделениеВключено();
    НеобходимоОбновлениеИБ              = ОбновлениеИнформационнойБазы.НеобходимоОбновлениеИнформационнойБазы();
    ИдентификаторТекущегоПользователяИБ = ПользователиИнформационнойБазы.ТекущийПользователь().УникальныйИдентификатор;
    
    // Будущий итог после цикла.
    НовыеАдминистраторыИБ     = Новый Соответствие;
    ОбновляемыеПользователиИБ = Новый Соответствие;
    НекорректныеРоли          = НовыеНекорректныеРоли(НовыеРолиПользователей);
    
    Для Каждого ОписаниеПользователя Из ИдентификаторыПользователейИБ Цикл
        
        ТекущийПользователь         = ОписаниеПользователя.Пользователь;
        ИдентификаторПользователяИБ = ОписаниеПользователя.ИдентификаторПользователяИБ;
        НовыйАдминистраторИБ        = Ложь;
        
        // Поиск пользователя ИБ.
        Если ТипЗнч(ИдентификаторПользователяИБ) = Тип("УникальныйИдентификатор") Тогда
            ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(
                ИдентификаторПользователяИБ);
        Иначе
            ПользовательИБ = Неопределено;
        КонецЕсли;
        
        Если ПользовательИБ = Неопределено
         Или Не ЗначениеЗаполнено(ПользовательИБ.Имя) Тогда
            Продолжить;
        КонецЕсли;
        
        Если НеобходимоОбновлениеИБ
           И ИдентификаторПользователяИБ = ИдентификаторТекущегоПользователяИБ Тогда
            Продолжить;
        КонецЕсли;
        
        Отказ = Ложь;
        ИнтеграцияПодсистемБСП.ПриОбновленииРолейПользователяИБ(ИдентификаторПользователяИБ, Отказ);
        Если Отказ Тогда
            Продолжить;
        КонецЕсли;
        
        Отбор = Новый Структура("Пользователь", ТекущийПользователь);
        НовыеРоли = НовыеРолиПользователей.Скопировать(
            НовыеРолиПользователей.НайтиСтроки(Отбор), "Роль, РольСсылка");
        
        НовыеРоли.Индексы.Добавить("РольСсылка");
        
        Если Администраторы[ТекущийПользователь] <> Неопределено Тогда
            ТекущиеНовыеРоли = НовыеРоли;
            //НовыеРоли = ТекущиеНовыеРоли.Скопировать(Новый Массив); //+ (закоментировал, что бы права не удалялись - Только для Администраторов!!!)
            Для Каждого КлючИЗначение Из ОбязательныеРолиАдминистратора Цикл
                //+
                //    Проверим, возможно уже права есть, и их ненадо повторять...
                Если ТекущиеНовыеРоли.Найти(КлючИЗначение.Значение, "РольСсылка") <> Неопределено Тогда Продолжить; КонецЕсли;
                //-
                НовыеРоли.Добавить().РольСсылка = КлючИЗначение.Значение;
            КонецЦикла;
            Для Каждого КлючИЗначение Из ДополнительныеРолиАдминистратора Цикл
                Если ТекущиеНовыеРоли.Найти(КлючИЗначение.Значение, "РольСсылка") = Неопределено Тогда
                    Продолжить;
                КонецЕсли;
                //+
                //    Проверим, возможно уже права есть, и их ненадо повторять...
                Если ТекущиеНовыеРоли.Найти(КлючИЗначение.Значение, "РольСсылка") <> Неопределено Тогда Продолжить; КонецЕсли;
                //-
                НовыеРоли.Добавить().РольСсылка = КлючИЗначение.Значение;
            КонецЦикла;
        КонецЕсли;
        
        НедоступныеРоли = ПользователиСлужебный.НедоступныеРолиПоТипуПользователя(
            ТипЗнч(ТекущийПользователь) = Тип("СправочникСсылка.ВнешниеПользователи"));
        
        // Проверка старых ролей.
        РолиДляДобавления = Новый Соответствие;
        РолиДляУдаления   = Новый Соответствие;
        
        Для Каждого Роль Из ПользовательИБ.Роли Цикл
            ИмяРоли = Роль.Имя;
            РольСсылка = ИдентификаторыРолей.Получить(ИмяРоли);
            Если РольСсылка = Неопределено Тогда
                КлючРоли = Справочники.ИдентификаторыОбъектовМетаданных.КлючОбъектаМетаданныхРоль(Роль);
                РольСсылка = ИдентификаторыРолей.Получить(КлючРоли);
            КонецЕсли;
            Строка = НовыеРоли.Найти(РольСсылка, "РольСсылка");
            Если Строка = Неопределено Тогда
                РолиДляУдаления.Вставить(ИмяРоли, Роль);
            Иначе
                Если РазделениеВключено И НедоступныеРоли.Получить(ИмяРоли) <> Неопределено Тогда
                    Строка.Роль = ИмяРоли;
                    ДобавитьНекорректнуюРоль(НекорректныеРоли, Строка, ТекущийПользователь, Ложь);
                    РолиДляУдаления.Вставить(ИмяРоли, Роль);
                КонецЕсли;
                НовыеРоли.Удалить(Строка);
            КонецЕсли;
        КонецЦикла;
        
        // Проверка новых ролей.
        Для Каждого Строка Из НовыеРоли Цикл
            Строка.Роль = ИменаРолей.Получить(Строка.РольСсылка);
            
            Если ВсеРоли.Получить(Строка.Роль) = Неопределено Тогда
                ДобавитьНекорректнуюРоль(НекорректныеРоли, Строка, ТекущийПользователь, Истина);
                Продолжить;
            КонецЕсли;
            
            Если НедоступныеРоли.Получить(Строка.Роль) <> Неопределено Тогда
                ДобавитьНекорректнуюРоль(НекорректныеРоли, Строка, ТекущийПользователь, Ложь);
                Продолжить;
            КонецЕсли;
            
            РолиДляДобавления.Вставить(Строка.Роль, Истина);
            
            Если Строка.Роль = "АдминистраторСистемы" Тогда
                НовыйАдминистраторИБ = Истина;
            КонецЕсли;
        КонецЦикла;
        
        // Завершение обработки текущего пользователя.
        Если РолиДляДобавления.Количество() = 0
           И РолиДляУдаления.Количество()   = 0 Тогда
            Продолжить;
        КонецЕсли;
        
        ИзмененияРолей = Новый Структура;
        ИзмененияРолей.Вставить("ПользовательСсылка", ТекущийПользователь);
        ИзмененияРолей.Вставить("ПользовательИБ",     ПользовательИБ);
        ИзмененияРолей.Вставить("РолиДляДобавления",  РолиДляДобавления);
        ИзмененияРолей.Вставить("РолиДляУдаления",    РолиДляУдаления);
        
        Если НовыйАдминистраторИБ Тогда
            НовыеАдминистраторыИБ.Вставить(ТекущийПользователь, ИзмененияРолей);
        Иначе
            ОбновляемыеПользователиИБ.Вставить(ТекущийПользователь, ИзмененияРолей);
        КонецЕсли;
        
        ЕстьИзменения = Истина;
    КонецЦикла;
    
    ЗарегистрироватьНекорректныеРоли(НекорректныеРоли);
    
    // Добавление новых администраторов.
    Если НовыеАдминистраторыИБ.Количество() > 0 Тогда
        ОбновитьРолиПользователейИБ(НовыеАдминистраторыИБ, ПарольПользователяСервиса);
    КонецЕсли;
    
    // Удаление старых администраторов и обновление остальных пользователей.
    Если ОбновляемыеПользователиИБ.Количество() > 0 Тогда
        ОбновитьРолиПользователейИБ(ОбновляемыеПользователиИБ, ПарольПользователяСервиса);
    КонецЕсли;
    
    ОтключитьУВсехРасширенийФлажокИспользоватьОсновныеРолиДляВсехПользователей();
    
КонецПроцедуры

15 DrZombi
 
гуру
17.03.26
08:15
(7) Сомнительно... Мы сумели постичь, то как нельзя использовать Роли из Расширения :)
Пришлось Костыль (Исключение) прописывать. Иначе роль у пользователя не меняется. Просто происходит ошибка, и как бы всё хорошо, а роль у пользователя не обработалась :)
AdBlock убивает бесплатный контент. 1Сергей