Имя: Пароль:
1C
1С v8
Программно установить флажок "Потребовать установку (смену) пароля при входе"
,
0 Егор123
 
09.01.17
14:10
Доброго времени суток! Поставили задачу написать обработку программной установки данного флага у выбранных пользователей. За основу взял обработку уведомлений (там тоже регистр сведений, но ссылаются они не справочники, а на перечисления).

Не получается обратиться к реквезиту ПотребоватьСменуПароляПриВходе, который находится на ФормаЭлемента справочника Пользователи. Начинающий программист - камне много попрошу не кидать и написать по делу что я делаю не так или возможно сталкивался кто-то с подобным.


    Пользователль = Справочники.Пользователи.ПолучитьФорму("ФормаЭлемента").ЭлементыФормы.ПотребоватьСменуПароляПриВходе;
    
    //ВидСобытия             = Перечисления.СобытияУведомлений.СозданиеЗаписиКалендаря;
    //СпособУведомлений     = Перечисления.СпособыУведомления.ПоПочте;
    
    Для Каждого Строка Из ТаблицаПользователей Цикл
        Пользователь = Строка.Пользователь;
        Если Не ЗначениеЗаполнено(Пользователь) Тогда
            Продолжить;
        КонецЕсли;
        
        ПользователиСлужебныйКлиентСервер.УстановитьНаличиеПароля(Пользователи
            , ""
        //    , СпособУведомлений            
            
            , Пользователль
            , Строка.Выбран);
    КонецЦикла;
1 Cool_Profi
 
09.01.17
14:13
А зачем ты пытаешься изменить реквизит формы, если тебе надо менять реквизит объекта?
2 Егор123
 
09.01.17
14:23
(1), в списке реквизитов объекта нет нужного мне. Вот код с уведомлениями (который я закоментил) - он ссылался на объект Перечесления, в котором были необходимые Значения - ПоПочте и  СозданиеЗаписиКалендаря. В справочнике Пользователи я таких данных не нашёл. И в моём случае не понимаю как достать эти данные (ПотребоватьСменуПароляПриВходе)...
3 Fish
 
09.01.17
14:27
(2) Ну так посмотри в коде, где эти данные хранятся в базе.
4 Егор123
 
10.01.17
12:50
Сейчас попытался написать внешнюю обработку, чтоб у всех пользователей при нажатии на кнопку галочка "ПотребоватЬСменуПароляПриВходе" - стала true. Подскажите - что я делаю не так? Пишет:
{ВнешняяОбработка.ВнешняяОбработка2.Форма.Форма.Форма(149)}: Слишком много фактических параметров
                НаборЗаписейКоды.Добавить(УдаляемаяЗапись);



            НаборЗаписейКоды = РегистрыСведений.СведенияОПользователях.СоздатьНаборЗаписей();
            НаборЗаписейКоды.Прочитать();
            
            
            МассивУдаляемых3 = Новый Массив();
            
            Для каждого Запись Из НаборЗаписейКоды Цикл
                    Если Запись.ПотребоватьСменуПароляПриВходе = Ложь Тогда
                        МассивУдаляемых3.Добавить(Запись);
                    КонецЕсли;
                
            КонецЦикла;
            
            Для каждого УдаляемаяЗапись Из МассивУдаляемых3 Цикл
                        НаборЗаписейКоды.Добавить(УдаляемаяЗапись);
            КонецЦикла;
            
            НаборЗаписейКоды.Записать();
5 Fish
 
10.01.17
12:54
(4) А что в строке 149?
6 Егор123
 
10.01.17
12:55
(5)
   Для каждого УдаляемаяЗапись Из МассивУдаляемых3 Цикл
                        НаборЗаписейКоды.Добавить(УдаляемаяЗапись);
            КонецЦикла;
7 zvial
 
10.01.17
12:57
Так это ж набор записей, у метода Добавить нет параметров
8 zvial
 
10.01.17
12:59
Надо как то так:

НовЗапись = НаборЗаписейКоды.Добавить();
НовЗапись.Реквизит = ЗначениеРеквизита;

Но, вообще не понятен код - зачем добавлять в РС уже имеющиеся данные из массива удаляемых? Может, их удалять над было?
9 Егор123
 
10.01.17
13:03
(8) В начале я делаю отбор тех данных (пользователей), у которых ПотребоватьСменуПароля = Ложь. А потом я хочу их записать в регистр со значением Истина. Как это в целом будет выглядеть?
10 zvial
 
10.01.17
13:08
Возможно, так:

НаборЗаписейКоды = РегистрыСведений.СведенияОПользователях.СоздатьНаборЗаписей();
НаборЗаписейКоды.Прочитать();

времТЗ = НаборЗаписейКоды.Выгрузить();
времТЗ.ЗаполнитьЗначения(Истина, "ПотребоватьСменуПароляПриВходе ");

НаборЗаписейКоды.Загрузить();

НаборЗаписейКоды.Записать();
11 zvial
 
10.01.17
13:09
Либо просто в цикле по набору записей для всех записей установить значение ПотребоватьСменуПароляПриВходе = Истина
12 Егор123
 
10.01.17
13:09
(10) тоже пишет, что недостаточно фактических параметров
13 Егор123
 
10.01.17
13:11
(11) да, вот так сделал. спасибо)
14 zvial
 
10.01.17
13:11
Ну так, блин, посмотрите в СП требуемые параметры методов

НаборЗаписейКоды.Загрузить(времТЗ);
15 zvial
 
10.01.17
13:12
Хорошо
16 Егор123
 
10.01.17
13:16
(14) я не ещё не столь шарю)
мало ли кому пригодится
            НаборЗаписейПользователей = РегистрыСведений.СведенияОПользователях.СоздатьНаборЗаписей();
            НаборЗаписейПользователей.Прочитать();
                                          
            Для каждого Запись Из НаборЗаписейПользователей Цикл
                        Запись.ПотребоватьСменуПароляПриВходе = Истина;
            КонецЦикла;
            
            НаборЗаписейПользователей.Записать();
17 Егор123
 
10.01.17
16:14
(15) А как вывести сообщением список тех пользователей, у которых уже была эта галочка?
18 trdm
 
10.01.17
16:46
(0) > ПотребоватьСменуПароляПриВходе
Надо еще проверку даты времени установки старого пароля знать и запоминать и проверку на заполненность пароля.
И что-бы не чаще чем в пол года пароль менять, (если не пустой). А то Unscrew eggs....
19 Егор123
 
11.01.17
09:23
Что делаю не так подскажите? Пишет, что не соответствие типов (параметр 2).. хочу вывести сообщением тех пользователей, у которых значение Ложь...
        Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    СведенияОПользователях.ПотребоватьСменуПароляПриВходе
    |ИЗ
    |    РегистрСведений.СведенияОПользователях КАК СведенияОПользователях
    |ГДЕ
    |    (СведенияОПользователях.ПотребоватьСменуПароляПриВходе = ЛОЖЬ)";
    Результат = Запрос.Выполнить();
    
    Если Результат.Пустой() тогда
        Возврат;
    КонецЕсли;
    Сообщить("Результат запроса", Результат);
20 Cool_Profi
 
11.01.17
09:31
Сообщить("Результат запроса", Результат);

И увидишь ты в лучшем случае строку "Результат запроса"

Перебирать-то его кто будет? Алексей Николаевич? Или Сам ВВ?
21 Егор123
 
11.01.17
09:36
(20), боюсь ВВ меня пошлёт) а как перебрать это всё дело? Я вроде в запросе уже указал что мне нужно выбрать и откуда, а потом пытаюсь получить соответствующие запросу данные.
22 Fish
 
11.01.17
09:37
(21) Открой наконец СП и почитай.
23 Cool_Profi
 
11.01.17
09:38
(21) Открой справочку и посмотри, что тебе возвращает Запрос.Выполнить(). И что с этим можно потом делать.
24 Fish
 
11.01.17
09:39
(23) Продай ему СП :)
25 Cool_Profi
 
11.01.17
09:40
(24) Ээээ.... А я тут каким боком? ;-)
26 Егор123
 
11.01.17
09:40
(22) (24) да открыл я СП, всё равно не могу понять как это сделать...
27 Cool_Profi
 
11.01.17
09:42
(26) Тогда теперь открой книжку Радченко и найди там главу про запросы.
28 Fish
 
11.01.17
09:42
(26) Тогда для начала надо почитать какую-нибудь литературу по 1С, посмотреть видеоуроки. Если же и это не поможет - тогда 1С - это просто не твоё.
29 Cool_Profi
 
11.01.17
09:43
(26) а ещё можно нажать Ф1 в конфигураторе - содержание - встроенный язык - работа с запросами  - выполнение и работа с запросами во встроенном языке.
30 Егор123
 
11.01.17
10:05
(28) так я для этого на форуме и зарегался чтобы спрашивать то,что непонятно .. я не понимаю как обратиться к данным, как их вывести на экран.  (27) книгу открыл. начал пробовать так, как там - не выходит. Мне нужно, чтоб показали как делать на похожем запросе - тогда я въеду в тему..
31 Cool_Profi
 
11.01.17
10:10
(30) сделай как в (29) там есть пример
32 Егор123
 
11.01.17
10:21
(31) Спасибо. Нашёл, смог, познал!)
33 Егор123
 
11.01.17
13:05
А можно сделать так, чтобы в запросе читались не все пользователи? (т.е., например, исключить одно подразделение).
34 Fish
 
11.01.17
13:09
(33) Можно. Условие надо в запросе написать.
35 Егор123
 
11.01.17
13:41
(34) А как в запросе обратиться к строке? Если кавычки - ругается. Если убрать, пишет что такого поля необнаружено.
|    (СведенияОПользователяхДокументооборот.Подразделение <> "Бухгалтерия"
36 Cool_Profi
 
11.01.17
13:42
|    (СведенияОПользователяхДокументооборот.Подразделение <> ""Бухгалтерия""
37 Cool_Profi
 
11.01.17
13:42
Да и вообще - подразделение - это ссылка на справочник, а не строка
38 Fish
 
11.01.17
13:49
(35) Тебе надо почитать про параметры в запросе.
39 Егор123
 
11.01.17
13:55
(37) ну да, не помогло. а как тогда обратиться к конкретному элементу справочника?
40 Fish
 
11.01.17
13:56
(39) Он предопределённый?
41 Егор123
 
11.01.17
14:01
(40) нет. Это подразделение же.
42 Fish
 
11.01.17
14:03
(41) Тогда через параметр. В запросе пишешь:
СведенияОПользователяхДокументооборот.Подразделение <> &Бухгалтерия

А после запроса что-то типа:
Запрос.УстановитьПараметр("Бухгалтерия", БухгалтерияСсылка), где переменная БухгалтерияСсылка должна содержать нужную тебе ссылку.
43 Егор123
 
11.01.17
14:04
(42) я сейчас так и сделал, ошибку пишет..
    МассивОРПП = Новый Массив();
    МассивОРПП.Добавить("Бухгалтерия");
    Запрос = Новый Запрос;
    Запрос.УстановитьПараметр("Бухгалтерия",МассивОРПП);
    Запрос.Текст =
    "ВЫБРАТЬ
    |    СведенияОПользователях.ПотребоватьСменуПароляПриВходе,
    |    СведенияОПользователях.Пользователь,
    |    СведенияОПользователяхДокументооборот.Подразделение,
    |    СведенияОПользователяхДокументооборот.Пользователь
    |ИЗ
    |    РегистрСведений.СведенияОПользователях КАК СведенияОПользователях     
    |                ПОЛНОЕ СОЕДИНЕНИЕ
    |    РегистрСведений.СведенияОПользователяхДокументооборот КАК СведенияОПользователяхДокументооборот            
    |                ПО
    |         СведенияОПользователях.Пользователь = СведенияОПользователяхДокументооборот.Пользователь
    |
    |ГДЕ
    |    (СведенияОПользователяхДокументооборот.Подразделение <> (&МассивОРПП)    
    |    ИЛИ СведенияОПользователях.ПотребоватьСменуПароляПриВходе = Ложь)";

    // Выполним запрос и запишем результат
44 Егор123
 
11.01.17
14:08
(43) {ВнешняяОбработка.ПотребоватьСменуПароляУВсехПользователей.Форма.Форма.Форма(26)}: Ошибка при вызове метода контекста (Выполнить)
    РезультатЗапроса = Запрос.Выполнить();
по причине:
{(14, 59)}: Не задано значение параметра "МассивОРПП"
(СведенияОПользователяхДокументооборот.Подразделение <> (<<?>>&МассивОРПП)
45 Cool_Profi
 
11.01.17
14:09
(44) @ Не задано значение параметра "МассивОРПП" @

Вот ведь Боря... Старался... Писал программу на русском языке...

И всё равно находятся люди, которые не понимают...
46 Егор123
 
11.01.17
14:29
Может скажите что не так.. я не понимаю почему пишет ошибку, помогите исправить.
    ЗаписьОРПП = РегистрыСведений.СведенияОПользователяхДокументооборот.СоздатьМенеджерЗаписи();
    ЗаписьОРПП.Прочитать();
    ЗаписьОРПП.Подразделение = "ОРПП";
    ЗаписьОРПП.Записать();
    Запрос = Новый Запрос;
    Запрос.УстановитьПараметр("ЗаписьОРПП",ЗаписьОРПП);
    Запрос.Текст =
    "ВЫБРАТЬ
    |    СведенияОПользователях.ПотребоватьСменуПароляПриВходе,
    |    СведенияОПользователях.Пользователь,
    |    СведенияОПользователяхДокументооборот.Подразделение,
    |    СведенияОПользователяхДокументооборот.Пользователь
    |ИЗ
    |    РегистрСведений.СведенияОПользователях КАК СведенияОПользователях     
    |                ПОЛНОЕ СОЕДИНЕНИЕ
    |    РегистрСведений.СведенияОПользователяхДокументооборот КАК СведенияОПользователяхДокументооборот            
    |                ПО
    |         СведенияОПользователях.Пользователь = СведенияОПользователяхДокументооборот.Пользователь
    |
    |ГДЕ
    |    (СведенияОПользователяхДокументооборот.Подразделение <> &ЗаписьОРПП    
    |    ИЛИ СведенияОПользователях.ПотребоватьСменуПароляПриВходе = Ложь)";

    // Выполним запрос и запишем результат в переменную РезультатЗапроса.
    РезультатЗапроса = Запрос.Выполнить();
47 Cool_Profi
 
11.01.17
14:30
Раз
ЗаписьОРПП.Подразделение = "ОРПП";

два
ЗаписьОРПП = РегистрыСведений.СведенияОПользователяхДокументооборот.СоздатьМенеджерЗаписи();
Запрос.УстановитьПараметр("ЗаписьОРПП",ЗаписьОРПП);
48 Егор123
 
11.01.17
14:56
(47) а нужно то как?
49 Fish
 
11.01.17
14:58
(48) Для начала нужно понять, что из себя представляет ссылка на элемент справочника, и как её получить.
50 Егор123
 
11.01.17
15:03
(49) ну В РегистрыСведений.СведенияОПользователяхДокументооборот есть ресурс Подразделения он ссылается на справочник СтруктураПредприятия
51 Егор123
 
11.01.17
15:23
(49) и что с этой информацией делать?)
52 Fish
 
11.01.17
16:02
(50) Ресурс регистра с типом СправочникСсылка.СтруктураПредприятия и ссылка на элемент справочника, хоть и имеющая тот же тип - это две разные вещи. Когда поймёшь это (прочитав хотя бы азы), тогда сразу поймёшь, что с этим делать.
53 Егор123
 
11.01.17
16:04
(52) Я понимаю, что разные. но не понимаю как получить ссылку на элемент. как узнать где он хранится. можете просто сказать как надо?
54 Fish
 
11.01.17
16:31
(53) Можно открыть СП и посмотреть примеры. Или воспользоваться поиском. Это, кстати, и в правилах написано:
"Скорее всего Вы не первый, кто столкнулся с этой проблемой. Попробуйте найти ответ на форуме (в правом нижнем углу есть окно поиска) или в многочисленных статьях и FAQ по 1С, ссылки на которые вы найдете на сайте http://www.mista.ru. В любом случае полученные знания не будут лишними."
http://www.forum.mista.ru/rules.php#rec

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