Имя: Пароль:
1C
1С v8
Создать 1С обработку по назначению прав
,
0 yuran9393
 
24.05.23
16:38
Добрый день! Не давно в 1С разработке, подскажите пожалуйста, есть задача по которой требуется создать внешнюю обработку по назначению прав пользователям, в конфигурации Бухгалтерия предприятия 8.3
Создал внешнюю обработку и в модуле объекта решил использовать процедуру "Процедура УстановитьПравоОткрытияВнешнихОтчетовИОбработок(ОткрытиеРазрешено) Экспорт".
Есть несколько вопросов:
1)Как правильно вызвать экспортную процедуру во внешней обработке, чтобы можно было запускать ее скриптом и она отрабатывала?
2)Верную ли процедуру использую?
3)Что нужно изменить в коде ниже? Данный код прописал во внешнюю обработку, но не отрабатывает.
Заранее большое спасибо.


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

      ПользовательИзменен = Ложь;
      ЕстьРольИнтерактивногоОткрытия = ПользовательИБ.Роли.Содержит(РольИнтерактивноеОткрытие);
      Если ОткрытиеРазрешено Тогда
         Если Не ЕстьРольИнтерактивногоОткрытия Тогда
            ПользовательИБ.Роли.Добавить(РольИнтерактивноеОткрытие);
            ПользовательИзменен = Истина;
         КонецЕсли;
      Иначе
         Если ЕстьРольИнтерактивногоОткрытия Тогда
            ПользовательИБ.Роли.Удалить(РольИнтерактивноеОткрытие);
            ПользовательИзменен = Истина;
         КонецЕсли;
      КонецЕсли;                          
  
      ЕстьРольАдминистраторСистемы = ПользовательИБ.Роли.Содержит(РольАдминистраторСистемы);
      Если ОткрытиеРазрешено Тогда
         Если Не ЕстьРольАдминистраторСистемы Тогда
            ПользовательИБ.Роли.Добавить(РольАдминистраторСистемы);
            ПользовательИзменен = Истина;
         КонецЕсли;
      Иначе
         Если ЕстьРольАдминистраторСистемы Тогда
            ПользовательИБ.Роли.Удалить(РольАдминистраторСистемы);
            ПользовательИзменен = Истина;
         КонецЕсли;
      КонецЕсли;
      Если ПользовательИзменен Тогда
         ПользовательИБ.Записать();
      КонецЕсли;
      
      ОписаниеНастроек = Новый ОписаниеНастроек;
      ОписаниеНастроек.Представление = НСтр("ru = 'Предупреждение безопасности'");
      ОбщегоНазначения.ХранилищеОбщихНастроекСохранить(
         "ПредупреждениеБезопасности",
         "ПользовательОзнакомлен",
         Истина,
         ОписаниеНастроек,
         ПользовательИБ.Имя);
  
      КонецПроцедуры
1 Волшебник
 
24.05.23
16:38
а где вызов процедуры?
2 yuran9393
 
24.05.23
16:40
в конце добавить Пользователи.УстановитьПравоОткрытияВнешнихОтчетовИОбработок(ОткрытиеРазрешено); ?
3 Волшебник
 
24.05.23
16:42
(2) Что такое "Пользователи"?
4 yuran9393
 
24.05.23
16:48
в конфе есть "Общие модули", там есть модуль под названием "Пользователи". В котором прописана экспортная процедура "Процедура УстановитьПравоОткрытияВнешнихОтчетовИОбработок(ОткрытиеРазрешено) Экспорт
" которую я вызываю в обработке.
5 Волшебник
 
24.05.23
16:58
(4) Тогда всё правильно. Проверьте только ещё флаги "Сервер" и "Вызов сервера".
6 yuran9393
 
24.05.23
17:23
"флаги "Сервер" и "Вызов сервера" а где их проверить?
и подскажи пожалуйста как можно прописать пользователя как параметр? чтобы всегда не менять в    ПользовательИБ = Справочники.Пользователи.НайтиПоНаименованию("Тестовый пользователь");
7 Волшебник
 
24.05.23
17:32
(6) в свойствах общего модуля
8 yuran9393
 
24.05.23
17:35
В свойствах общего модуля проставлен флаг "Сервер" , "Внешнее соединение", "Клиент".
В "Вызов сервера" флаг не установлен и не доступен для редактирования.
9 Волшебник
 
24.05.23
19:13
(8) Ваша процедура делает слишком много лишнего по сравнению с тем, как она называется. Сократите её до пары строчек.
10 yuran9393
 
24.05.23
22:46
Понял, спасибо большое за помощь
11 yuran9393
 
25.05.23
12:47
Подскажите пожалуйста в настоящее время в модуле объекта внешней обработки прописал след код, но он не отрабатывает при открытии обработки.

Процедура УстановитьПравоОткрытияВнешнихОтчетовИОбработок2(ОткрытиеРазрешено) Экспорт
    
    Если ОбщегоНазначения.РазделениеВключено() Тогда
        Возврат;
    КонецЕсли;
    
    ПараметрыАдминистрирования = СтандартныеПодсистемыСервер.ПараметрыАдминистрирования();
    ПараметрыАдминистрирования.Вставить("ПринятоРешениеПоОткрытиюВнешнихОтчетовИОбработок", Истина);
    СтандартныеПодсистемыСервер.УстановитьПараметрыАдминистрирования(ПараметрыАдминистрирования);
    
    Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда
        МодульУправлениеДоступомСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебный");
        МодульУправлениеДоступомСлужебный.УстановитьПравоОткрытияВнешнихОтчетовИОбработок2(ОткрытиеРазрешено);
        Возврат;
    КонецЕсли;
    
    РольАдминистраторСистемы = Метаданные.Роли.АдминистраторСистемы;
    РольИнтерактивноеОткрытие = Метаданные.Роли.ИнтерактивноеОткрытиеВнешнихОтчетовИОбработок;            
    ПользовательИБ = Справочники.Пользователи.НайтиПоНаименованию("ТестовыйПользователь");
        ПользовательИзменен = Ложь;
        ЕстьРольИнтерактивногоОткрытия = ПользовательИБ.Роли.Содержит(РольИнтерактивноеОткрытие);
        Если ОткрытиеРазрешено Тогда
            Если Не ЕстьРольИнтерактивногоОткрытия Тогда
                ПользовательИБ.Роли.Добавить(РольИнтерактивноеОткрытие);
                ПользовательИзменен = Истина;
            КонецЕсли;
        Иначе
            Если ЕстьРольИнтерактивногоОткрытия Тогда
                ПользовательИБ.Роли.Удалить(РольИнтерактивноеОткрытие);
                ПользовательИзменен = Истина;
            КонецЕсли;
        КонецЕсли;
        Если ПользовательИзменен Тогда
            ПользовательИБ.Записать();
        КонецЕсли;                              
  
        ЕстьРольАдминистраторСистемы = ПользовательИБ.Роли.Содержит(РольАдминистраторСистемы);
        Если ОткрытиеРазрешено Тогда
            Если Не ЕстьРольАдминистраторСистемы Тогда
                ПользовательИБ.Роли.Добавить(РольАдминистраторСистемы);
                ПользовательИзменен = Истина;
            КонецЕсли;
        Иначе
            Если ЕстьРольАдминистраторСистемы Тогда
                ПользовательИБ.Роли.Удалить(РольАдминистраторСистемы);
                ПользовательИзменен = Истина;
            КонецЕсли;
        КонецЕсли;
        Если ПользовательИзменен Тогда
            ПользовательИБ.Записать();
        КонецЕсли;
        ОписаниеНастроек = Новый ОписаниеНастроек;
        ОписаниеНастроек.Представление = НСтр("ru = 'Предупреждение безопасности'");
        ОбщегоНазначения.ХранилищеОбщихНастроекСохранить(
            "ПредупреждениеБезопасности",
            "ПользовательОзнакомлен",
            Истина,
            ОписаниеНастроек,
            ПользовательИБ.Имя);
        КонецПроцедуры
УстановитьПравоОткрытияВнешнихОтчетовИОбработок2(Истина);
12 Волшебник
 
25.05.23
12:49
(11) Какой текст ошибки?
13 yuran9393
 
25.05.23
12:55
Ошибки нет, но права не назначаются указанному пользователю.
ПользовательИБ = Справочники.Пользователи.НайтиПоНаименованию("ТестовыйПользователь") пользователя с таким наименованием находит корректно
во внешнюю обработку форму не добавлял, все прописал в модуль объекта, так как требуется чтобы при запуске скриптом обработки, она сразу отрабатывала и выдавал права
14 Волшебник
 
25.05.23
12:56
(13) Уберите лишние строчки из процедуры и оставьте только те, которые назначают право открытия внешних отчётов и обработок.
15 Мультук
 
гуру
25.05.23
13:11
Создал новую обработку

Добавил в модуль строки:
//============================

Процедура Тест() Экспорт
    Сообщить("Это тест");    
КонецПроцедуры


Тест();

//============================

Создал пустую форму в этой обработке. Назначил её формой в "Форма обработки". Это важно!

Файл->Открыть открываю эту обработку
Закрываю,
Вижу строку в сообщениях "Это тест"

P.S.
УТ 11.5 Управляемые формы.
16 yuran9393
 
25.05.23
13:33
как описано выше проверил обработку сообщение "Это тест" вывело корректно,
при аналогичном запуске моей обработки "Файл->Открыть открываю эту обработку"  выходит сообщение:

К сожалению произошла не предвиденная ошибка.
Попробуйте повторить операцию.
Если ошибка повторится попробуйте перезапустить приложение  или обратиться к администратору приложения.

Ошибка стала выходить после "Создал пустую форму в этой обработке. Назначил её формой в "Форма обработки". Это важно!"
17 Мультук
 
гуру
25.05.23
13:40
(16)

>>Ошибка стала выходить после "Создал пустую форму в этой обработке. Назначил её формой в "Форма обработки". Это важно!"
Потому что ваша процедура начала всё же запускаться.

В 1С есть отладчик -- вы зря им не пользуетесь.


P.S.
Может всё же лучше сначала курсы и книги по программированию ?

Простите, но сейчас на ум приходят анекдот про Шекспира, печатную машинку и теорию вероятности


P.P.S.

МодульУправлениеДоступомСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебный");
МодульУправлениеДоступомСлужебный.УстановитьПравоОткрытияВнешнихОтчетовИОбработок2(ОткрытиеРазрешено);

Объясните нам и себе что вы тут делаете и зачем.