Имя: Пароль:
1C
1С v8
Автоматическое программное копирование настроек пользователя от эталонного
,
0 erudemz
 
05.05.22
20:29
1С 8.3, конфигурация УХ. Заказчик хочет чтобы при создании нового пользователя ему автоматически копировались все персональные настройки (отчетов, включая произвольный и универсальный отчеты; форм и т.п.).
Ссылка на эталонного пользователя хранится в константе.

Что я пробовал:
1) В конфигурации есть стандартная обработка "НастройкиПользователей", которая идеально подходит для этих целей. В форме элемента справочника Пользователи, в событии ПослеЗаписиНаСервере, вызывал функцию КопированиеНастроекПользователей:

ЭталонныйПользователь = Константы.ЭталонныйПользовательДляКопированияНастроек.Получить();
    
Приемники = Новый Массив;
Приемники.Добавить(ТекущийОбъект);
        
КопируемыеНастройки = Новый Массив;
КопируемыеНастройки.Добавить("НастройкиОтчетов");
КопируемыеНастройки.Добавить("НастройкиВнешнегоВида");
КопируемыеНастройки.Добавить("ПерсональныеНастройки");
КопируемыеНастройки.Добавить("Избранное");
КопируемыеНастройки.Добавить("НастройкиПечати");
КопируемыеНастройки.Добавить("ПрочиеПользовательскиеНастройки");

Обработки.НастройкиПользователей.КопированиеНастроекПользователей(ЭталонныйПользователь, Приемники, КопируемыеНастройки);

Но выдаёт ошибку:

{(7, 37)}: Неверные параметры
ПсевдонимЗаданнойТаблицы.Ссылка В (<<?>>&СсылкиСправочникПользователи)
{ОбщийМодуль.ОбщегоНазначения.Модуль(577)}:Выборка = Запрос.Выполнить().Выбрать();
{ОбщийМодуль.ОбщегоНазначения.Модуль(288)}:ЗначенияРеквизитовОбъекта = ЗначенияРеквизитовОбъектов(ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(Ссылка), Реквизиты, ВыбратьРазрешенные, КодЯзыка)[Ссылка];
{ОбщийМодуль.ОбщегоНазначения.Модуль(401)}:Результат = ЗначенияРеквизитовОбъекта(Ссылка, ИмяРеквизита, ВыбратьРазрешенные, КодЯзыка);
{Обработка.НастройкиПользователей.МодульМенеджера(1512)}:ИдентификаторПользователяИБ = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ПользовательСсылка, "ИдентификаторПользователяИБ");
{Обработка.НастройкиПользователей.МодульМенеджера(588)}:ПолучателиНастроек.Добавить(ИмяПользователяИБ(Элемент));
{Справочник.Пользователи.Форма.ФормаЭлемента.Форма(620)}:Обработки.НастройкиПользователей.КопированиеНастроекПользователей(ЭталонныйПользователь, Приемники, КопируемыеНастройки);

Перепроверял все через отладчик, передается ровно то же, что и при обычной работе этой обработки.

2) Вызывал стандартную функцию БСП из общего модуля ПользователиСлужебный:

СкопироватьНастройкиПользователя(ЭталонныйПользователь, ТекущийОбъект);

Результат - функция отрабатывает без ошибок, но никакие настройки не копируются.

Как еще можно реализовать этот механизм? Что я делаю не так?
2 erudemz
 
05.05.22
20:39
(1) Ключевой момент - программно. Заказчик хочет чтобы "оно само", а не лишние три клика мышкой
3 H A D G E H O G s
 
05.05.22
20:43
ЭталонныйПользователь = Константы.ЭталонныйПользовательДляКопированияНастроек.Получить();
    
Приемники = Новый Массив;
Приемники.Добавить(ТекущийОбъект);


заменить на

ЭталонныйПользователь = Константы.ЭталонныйПользовательДляКопированияНастроек.Получить();
    
Приемники = Новый Массив;
Приемники.Добавить(ТекущийОбъект.Ссылка);
4 erudemz
 
05.05.22
20:55
(3) Не сработало, к сожалению.

"Неверный первый параметр Ссылка в функции ОбщегоНазначения.ЗначенияРеквизитовОбъекта: - Значение должно быть ссылкой или именем предопределённого элемента"
5 H A D G E H O G s
 
05.05.22
21:09
(4) У меня нормально отработало
6 Garykom
 
гуру
05.05.22
21:15
(0) А уверен что в этой конфе настройки пользователя не хранятся в куче разных мест?
7 Garykom
 
гуру
05.05.22
21:16
(2) >Ключевой момент - программно. Заказчик хочет чтобы "оно само", а не лишние три клика мышкой

Решить проблему путем найма программиста за оплату конечно уже пробовали да?
8 Garykom
 
гуру
05.05.22
21:19
>Константы.ЭталонныйПользовательДляКопированияНастроек
- это реальный пи-пи-пи.

Науй на каждый чих лезти в метаданные когда есть механизм допреквизитов и допсведений?
9 H A D G E H O G s
 
05.05.22
21:21
Автор, не обращай внимания, это Егор.
10 Garykom
 
гуру
05.05.22
21:22
(9) ты тоже сразу снимаешь с поддержки и начинаешь кучу констант и прочих метаданных безраздумно лепить?
11 H A D G E H O G s
 
05.05.22
21:28
(10) Я все делаю ~~для Китая~~ в расширениях.
12 erudemz
 
05.05.22
22:02
(6) Да, уверен. Обработка, которая выполняет копирование, прекрасно все копирует, её методы я и пытаюсь использовать. Ну и в корне конфы никаких настроек хранилищ не указано.
(7) Наняли стажера, т.е. меня :)
(8) Идея человека на должности "Системный архитектор"
(9) Интересная характеристика х)
13 Garykom
 
гуру
05.05.22
23:22
(12) вероятно криво используешь "Обработки.НастройкиПользователей.КопированиеНастроекПользователей"

Глянь например https://helpf.pro/faq82/view/1749.html
Хотя оно и древнее

Надо разобраться как правильно вызывать в твоей конфе, она может быть допилена
14 Garykom
 
гуру
05.05.22
23:23
(0) >Перепроверял все через отладчик, передается ровно то же, что и при обычной работе этой обработки.

Не верю как и в (3)
Ибо сам ТекущийОбъект в (0) передавать пытался вместо ТекущийОбъект.Ссылка
15 Garykom
 
гуру
05.05.22
23:25
Если в ПослеЗаписиНаСервере то попробуй просто Объект.Ссылка вместо ТекущийОбъект
16 hhhh
 
06.05.22
06:37
а где это вообще делается? до записи или после записи?
17 erudemz
 
03.06.22
10:21
После консультации с другим системным архитектором было подтверждено, что вносить изменения в модуль типового объекта и использовать константу это плохая идея.

В итоге:
1) Вместо константы для установки пользователя-источника использован кастомный механизм предопределённых признаков (через справочник и регистр сведений)
2) Вместо изменения модуля справочника создана подписка на событие ПриЗаписи. В обработчике события использован метод "КопированиеНастроекПользователей" из стандартной обработки "НастройкиПользователей".

Всё отрабатывает как требовалось. Спасибо за ответы!