Имя: Пароль:
1C
 
Правильная подстановка значений в форму?
0 pro3ri
 
21.04.15
12:37
Добрый день!
Поправьте меня плз, делаю забивку значения в форму?


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    Если Не ЗначениеЗаполнено(Объект.Менеджер) Тогда
    
        Объект.Менеджер= Справочники.Пользователи.НайтиПоНаименованию(ПользователиИнформационнойБазы.ТекущийПользователь().Имя);
    
    КонецЕсли;    
    
КонецПроцедуры

все ок?
1 pro3ri
 
21.04.15
12:39
чтоб вручную не вносили
2 singlych
 
21.04.15
12:44
Наименование пользователя отличается от имени пользователя ИБ. Что будешь делать?
3 pro3ri
 
21.04.15
12:49
(2) модуль управл прилож:

Процедура ПередНачаломРаботыСистемы(Отказ)
    
    ТекПользователь = РаботаСПользователями.СинхронизацияПользователя();
итд...


////////////////////////

Функция СинхронизацияПользователя() Экспорт
    
    ТекПользователь = ПользователиИнформационнойБазы.ТекущийПользователь();
    ИД = ТекПользователь.УникальныйИдентификатор;
    
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    Пользователи.Ссылка,
        |    Пользователи.УникальныйИдентификатор
        |ИЗ
        |    Справочник.Пользователи КАК Пользователи
        |ГДЕ
        |    Пользователи.УникальныйИдентификатор = &ИД
        |    И НЕ Пользователи.ПометкаУдаления";
    
    Запрос.УстановитьПараметр("ИД", ИД);
    
    РезультатЗапроса = Запрос.Выполнить();
    
    Если РезультатЗапроса.Пустой() Тогда
    
        Пользователь = Справочники.Пользователи.СоздатьЭлемент();
        Пользователь.Наименование = ТекПользователь.Имя;
        Пользователь.УникальныйИдентификатор = ИД;
        Пользователь.Записать();
        Возврат Пользователь.Ссылка;
    Иначе
        
        ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
        Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        
            Возврат ВыборкаДетальныеЗаписи.Ссылка;    
        
        КонецЦикла;
    КонецЕсли;

КонецФункции


как то так; надеюсь понятно...
4 fisher
 
21.04.15
13:01
А "Объект" - это что? Первоначальное заполнение прикладных объектов принято делать в ОбработкаЗаполнения()
5 singlych
 
21.04.15
13:09
(3) а если покопать, наверняка найдется какой-нибудь параметр сеанса ТекущийПользователь ;)
6 pro3ri
 
21.04.15
13:11
7 pro3ri
 
21.04.15
13:15
(4) мод объекта:

Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
    
    Менеджер = Справочники.Пользователи.НайтиПоНаименованию(ПользователиИнформационнойБазы.ТекущийПользователь().Имя);        
    
КонецПроцедуры
8 pro3ri
 
21.04.15
13:15
так тоже работает!
9 fisher
 
21.04.15
13:19
Прелесть в том, что когда нужно будет программно заполнять без открытия формы, ты просто вызовешь метод Заполнить().
Ну а пользователя обычно ищут один раз. При инициализации сеанса. Пишут найденного пользователя в параметр сеанса и потом к нему обращаются.
10 singlych
 
21.04.15
13:22
Ну и наименование - последнее, по чему стоит искать. А то придет один ИвановИИ, уволится, а потом придет другой ИвановИИ.

Тем более, что в (3) он уже ищется по ИД.
11 pro3ri
 
21.04.15
13:26
(9) мод упр прил:
Перем ТекПользователь Экспорт;
ТекПользователь = РаботаСПользователями.СинхронизацияПользователя();

//

мод док:
Менеджер = ТекПользователь;


как-то так...
12 fisher
 
21.04.15
13:27
(11) Нет. Правильно через параметры сеанса.
13 pro3ri
 
21.04.15
13:43
(12) ок благодарю
14 fisher
 
21.04.15
13:52
Почему параметр сеанса? Потому что он доступен на сервере и потому что он инициализируется и во внешнем соединении тоже.

А вот на клиент его правильно закэшировать чуть сложнее.
По-хорошему для этого надо использовать функцию клиентского общего модуля с повторным использованием возвращаемых значений, в котором параметр сеанса получается через общий модуль с вызовом сервера. В этом случае при первом получении текущего пользователя будет серверный вызов (к параметру сеанса), в последующем серверных вызовов уже не будет.
Для прозрачности использования делается общий модуль, который компилируется везде. Чтобы однообразно получать пользователя независимо от места вызова. А внутри директивами компиляции определяется место вызова - если тонкий клиент, то дергается клиентский кэш, а иначе - напрямую из параметра сеанса берется.
15 sapphire
 
21.04.15
13:58
(3) Пользователя в параметры сеанса поместите.