Имя: Пароль:
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) Вместо изменения модуля справочника создана подписка на событие ПриЗаписи. В обработчике события использован метод "КопированиеНастроекПользователей" из стандартной обработки "НастройкиПользователей".

Всё отрабатывает как требовалось. Спасибо за ответы!
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан