Ошибка при вызове метода контекста получитьобщуюформу

получение формы из общих форм

Я
   qwerty072

23.04.10 — 13:32

создал форму свою в общих формах,а как обратиться к ней не могу понять из внешней обработки

   Живой Ископаемый

1 — 23.04.10 — 13:32

в типовых посмотри

   zbv

2 — 23.04.10 — 13:32

ПолучитьОбщуюФорму

   butterbean

3 — 23.04.10 — 13:32

ПолучитьОбщуюФорму()

   aworld

4 — 23.04.10 — 13:33

Глобальный контекст

ПолучитьОбщуюФорму (GetCommonForm)

Синтаксис:

ПолучитьОбщуюФорму(<Форма>, <Владелец>, <Ключ уникальности>)

   qwerty072

5 — 23.04.10 — 13:36

{Форма.Форма(3)}: Ошибка при вызове метода контекста (ПолучитьОбщуюФорму): Недопустимое значение параметра (параметр номер ‘1’)

   Форма = ПолучитьОбщуюФорму(«Оповещение»,ЭтаФорма,);

по причине:

Недопустимое значение параметра (параметр номер ‘1’)

  

qwerty072

6 — 23.04.10 — 13:39

опечатался в имени формы,вот и понять не мог что такое,элементарно ведь всё,тема закрыта

TurboConf — расширение возможностей Конфигуратора 1С

Ermak
01.04.2013 18:56 Прочитано: 9617

Кто нибудь создавал Форму выбора, например

title

поделитесь примером

Yandex
Возможно, вас также заинтересует

Реклама на портале

hircon
03.04.2013 11:16 Ответ № 1

В основной форме
Код 1C v 8.х

 	
ФормаВыбора = ПолучитьФорму("ФормаВыбора");
ФормаВыбора.РежимВыбора = Истина;
Строка = ФормаВыбора.ОткрытьМодально();

В форме выбора
Код 1C v 8.х

 
Функция ТабличноеПоле1Выбор(Элемент, ВыбраннаяСтрока, Колонка, СтандартнаяОбработка)
ЭтаФорма.ЗакрыватьПриВыборе = Истина;
ЭтаФорма.Закрыть(ВыбраннаяСтрока);
КонецФункции

Изменено 03.04.13 11:18:41

Ermak
03.04.2013 11:42 Ответ № 2

Вы меня не так поняли, я имел ввиду сделать форму. Запускаем обработку и открывается Форму выбора (0), и там мы выбираем форму обработки которая нам нужна

Bell
03.04.2013 11:56 Ответ № 3

Я у себя сделал так
Код 1C v 8.х

 Процедура СписокОтчетовНажатие(Элемент)

Отч = Метаданные.Отчеты;
СписокОтчетов = Новый СписокЗначений();

СписокОтчетов .Добавить(Отч.ВедомостьПоТМЦ, , Ложь);
СписокОтчетов.Добавить(Отч.Прайс, , Ложь);

Если СписокОтчетов.ОтметитьЭлементы("Укажите, какие отчеты открыть") Тогда
Для Каждого НазваниеОтчета из СписокОтчетов Цикл
Если НазваниеОтчета.Пометка Тогда
ФормаСписка = Отчеты[НазваниеОтчета.Значение.Имя].ПолучитьФорму();
ФормаСписка.Открыть();
КонецЕсли;
КонецЦикла;
КонецЕсли;

КонецПроцедуры

Ermak
03.04.2013 12:14 Ответ № 4

(3) Bell, Спасибо. Через СписокЗначений() не надо, нужно именно через Форму

Bell
03.04.2013 12:30 Ответ № 5

У тебя есть общая форма. Ты хочушь загрузить в ее свои отчеты так?

Ermak
03.04.2013 13:52 Ответ № 6

да, чтобы когда запускаю обработку, открывалась общая форма со списком моих отчетов

Bell
03.04.2013 18:19 Ответ № 7

1 Процедура при нажатии на кнопку Код 1C v 8.х

 Форма = ПолучитьОбщуюФОрму("Имя твоей формы");
Форма.Открыть();

2.В Имя твоей формы в процедуре ПередОткрытием
// Это все отчеты конфы и загружаешь их в цикле в ТЧ, ТЗ. СЗ что у тебя там за таб.поле
// или создаешь структуру с отчетами какие тебе нужны, а затем в таб.поле

Код 1C v 8.х

 Для каждого Отч из Метаданные.Отчеты  Цикл
Сообщить (Отч);
КонецЦикла;

Изменено 03.04.13 18:19:56

Ermak
03.04.2013 18:32 Ответ № 8

(7) Bell, При нажатии какой кнопки?
Мне нужны только те отчеты которые я создаю в этой же обработке где создана Общая форма

Bell
04.04.2013 17:26 Ответ № 9

Не могу понять
1. ОБработка как то должна запускаться. (Можте ты хочкшь что бы при запуске программы запустилось окно твоей обработки, а потом ты хочешь выбрать отчет или обоработку какая тебе нужна?).Наииши последователно что должно происходить.

Ermak
04.04.2013 17:38 Ответ № 10

Я включаю обработку, открывается общая форма, где список моих отчетов. Все мои отчеты находятся в тоже самой обработки. Я выбираю отчет и он открывается

DJ_Serega
04.04.2013 22:43 Ответ № 11

(10) Ermak, отчеты в обработке? а как? *12

Ermak
05.04.2013 08:41 Ответ № 12

Вот что я имел ввиду, это формы отчетов

рис. №1 title

Обратите внимание ФормаВыбораОтчета эта главная форма
———————————-
А вот когда запускаем обработку, открывается ФормаВыбораОтчета

рис. №2 title

И тут мы видел все отчеты которые находили в обработке (рис. №1)

DJ_Serega
05.04.2013 12:01 Ответ № 13

(12) Ermak, получается нужно вывести списко форм обработки )
Объект должен быть объектом конфигурации.
Ниже пример для документа Реализации:
Код 1C v 8.х

 
СписокФорм = Метаданные.Документы.РеализацияТоваровУслуг.Формы;
Для каждого ТекФорма Из СписокФорм Цикл
Сообщить("Имя формы: " + ТекФорма.Имя + ". Синоним формы: " + ТекФорма.Синоним + ".");
КонецЦикла;
Ermak
05.04.2013 13:39 Ответ № 14

Я не могу понять как мне сделать чтобы появились имена форм в Табличном поле

DJ_Serega
05.04.2013 13:54 Ответ № 15

(14) Ermak, Ну вместо «сообщить» «ТабличноеПоле.Добавить». Если это реквизит формы тогда «ЭлементыФормы.ТабличноеПоле.Значение.Добавить», а в после заполнения «ЭлементыФормы.ТабличноеПоле.СоздатьКолонки».
Кажись так.

А я бы делал это СпискомЗначений. И открывал бы по событию «выбор».

Ermak
05.04.2013 15:39 Ответ № 16

(15) DJ_Serega, А я бы делал это СпискомЗначений. И открывал бы по событию «выбор».
Покажите пример как это?

Ermak
05.04.2013 16:41 Ответ № 17

Выдает ошибку
Код 1C v 8.х

 ЭлементыФормы.ТаблицаОтчетов.Значение.Добавить(ТекФорма.Имя);   
E_Migachev
05.04.2013 17:41 Ответ № 18

(0) Ermak, посмотри это Универсальная форма для выбора пользователем значения из списка значений! Такое же можно сделать для Таблицы значений и для Дерева значений

Ermak
05.04.2013 19:08 Ответ № 19

(18) E_Migachev, спасибо посмотрю

Ermak
09.04.2013 13:38 Ответ № 20

Сделал так Код 1C v 8.х

 ОбщаяФорма = ПолучитьОбщуюформу("ФормаРаботыСоСпискомЗначений"); //На форме должно быть добавлено Табличное Поле "ТабличноеПоле"

Таб = Новый ТаблицаЗначений;
Таб.Колонки.Добавить("ФормаРаботыСоСпискомЗначений",Новый ОписаниеТипов("Строка"));

Для каждого Форма из ОбработкаОбъект.Метаданные().Формы Цикл
Таб.Добавить().ИмяФормы = Форма.Имя;
КонецЦикла;

ОбщаяФорма.ТабличноеПоле = Таб;
ОбщаяФорма.ЭлементыФормы.ТабличноеПоле.СоздатьКолонки();
ОбщаяФорма.Открыть();

Выдает ошибку

Ошибка при вызове метода контекста (ПолучитьОбщуюФорму): Недопустимое значение параметра (параметр номер ‘1’)
ОбщаяФорма = ПолучитьОбщуюформу(«ФормаРаботыСоСпискомЗначений»); //На форме должно быть добавлено Табличное Поле «ТабличноеПоле»
по причине:
Недопустимое значение параметра (параметр номер ‘1’)

Подскажите как надо.

Подсказка: Для быстрого перемещения к последнему ответу или к вопросу используйте или .

4 / 4 / 0

Регистрация: 16.01.2013

Сообщений: 1,228

1

1C 8.x

Создать форму выбора

05.04.2013, 13:42. Показов 5728. Ответов 18


Студворк — интернет-сервис помощи студентам

Подскажите как загрузить имена форм в табличное поле. Например в обработке создано 4 формы: Форма1, Форма2, Форма3 и Форма4 это общая форма, куда должны выгрузиться названия (Форма1, Форма2, Форма3) в ТП



0



Dethmontt

Модератор

Эксперт 1С

3724 / 2918 / 575

Регистрация: 10.03.2011

Сообщений: 11,491

Записей в блоге: 1

05.04.2013, 14:26

2

1C
1
2
3
Для каждого Форма из ОбработкаОбъект.Метаданные().Формы Цикл
   Сообщить(Форма.Имя);
КонецЦикла;



1



4 / 4 / 0

Регистрация: 16.01.2013

Сообщений: 1,228

05.04.2013, 15:37

 [ТС]

3

Dethmontt, Это сообщение выведет а как загрузить?



0



Dethmontt

Модератор

Эксперт 1С

3724 / 2918 / 575

Регистрация: 10.03.2011

Сообщений: 11,491

Записей в блоге: 1

05.04.2013, 21:08

4

Кого загрузить и куда?

Добавлено через 4 минуты
Для обычного приложения

1C
1
2
3
4
5
6
7
8
9
10
11
12
ОбщаяФорма = ПолучитьОбщуюформу("ИмяФормы"); //На форме должно быть добавлено Табличное Поле "ТабличноеПоле"
 
Таб = Новый ТаблицаЗначений;
Таб.Колонки.Добавить("ИмяФормы",Новый ОписаниеТипов("Строка"));
 
Для каждого Форма из ОбработкаОбъект.Метаданные().Формы Цикл
   Таб.Добавить().ИмяФормы = Форма.Имя;
КонецЦикла;
 
ОбщаяФорма.ТабличноеПоле = Таб;
ОбщаяФорма.ЭлементыФормы.ТабличноеПоле.СоздатьКолонки();
ОбщаяФорма.Открыть();

Добавлено через 5 минут
Это для обычного приложения

Добавлено через 24 секунды
Это для обычного приложения



1



4 / 4 / 0

Регистрация: 16.01.2013

Сообщений: 1,228

09.04.2013, 13:34

 [ТС]

5

Dethmontt, ошибку выдал

ыСоСпискомЗначений(4)}: Ошибка при вызове метода контекста (ПолучитьОбщуюФорму): Недопустимое значение параметра (параметр номер ‘1’)
ОбщаяФорма = ПолучитьОбщуюформу(«ФормаРаботыСоСпискомЗначений»); //На форме должно быть добавлено Табличное Поле «ТабличноеПоле»
по причине:
Недопустимое значение параметра (параметр номер ‘1’)



0



Модератор

Эксперт 1С

3724 / 2918 / 575

Регистрация: 10.03.2011

Сообщений: 11,491

Записей в блоге: 1

09.04.2013, 13:50

6

А форма то такая есть? ФормаРаботыСоСпискомЗначений

Добавлено через 9 секунд
Общая?



1



4 / 4 / 0

Регистрация: 16.01.2013

Сообщений: 1,228

09.04.2013, 15:09

 [ТС]

7

Dethmontt,
Конечно
Имя: ФормаРаботыСоСпискомЗначений
Синоним: Форма работы со списком значений



0



Модератор

Эксперт 1С

3724 / 2918 / 575

Регистрация: 10.03.2011

Сообщений: 11,491

Записей в блоге: 1

09.04.2013, 15:46

8

Цитата
Сообщение от Ermak27
Посмотреть сообщение

Dethmontt,
Конечно
Имя: ФормаРаботыСоСпискомЗначений
Синоним: Форма работы со списком значений

Форма общая?



1



4 / 4 / 0

Регистрация: 16.01.2013

Сообщений: 1,228

09.04.2013, 16:07

 [ТС]

9

Dethmontt, Может я что то не так делаю, Как сделать общую форму или как посмотреть что она общая или нет?



0



Dethmontt

Модератор

Эксперт 1С

3724 / 2918 / 575

Регистрация: 10.03.2011

Сообщений: 11,491

Записей в блоге: 1

09.04.2013, 16:17

10

Она должна быть в ветке КОНФИГУРАЦИЯ — ОБЩИЕ — ОБЩИЕФОРМЫ

Добавлено через 36 секунд
Если форма не общая, то просто

1C
1
Форма = ПолучитьФорму("<Путь до фомы>");



1



4 / 4 / 0

Регистрация: 16.01.2013

Сообщений: 1,228

09.04.2013, 16:34

 [ТС]

11

Dethmontt, Подождите, у меня форма создана во внешней обработки, это значит путь к Внешней обработки???



0



Dethmontt

Модератор

Эксперт 1С

3724 / 2918 / 575

Регистрация: 10.03.2011

Сообщений: 11,491

Записей в блоге: 1

09.04.2013, 22:10

12

1C
1
Форма = ПолучитьФорму("ИмяФормы");



1



Ermak27

4 / 4 / 0

Регистрация: 16.01.2013

Сообщений: 1,228

10.04.2013, 08:42

 [ТС]

13

Dethmontt, Я не понимаю вообще, уже по всякому прописывал код но почему то колонка пустая постоянно, вот сделал по вашему способу и опять пустая

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Процедура ПриОткрытии()
ОбщаяФорма = ПолучитьФорму("ФормаРаботыСоСпискомЗначений"); //На форме должно быть добавлено Табличное Поле "ТабличноеПоле"
 
Таб = Новый ТаблицаЗначений;
Таб.Колонки.Добавить("ФормаРаботыСоСпискомЗначений",Новый ОписаниеТипов("Строка"));
 
Для каждого Форма из ОбработкаОбъект.Метаданные().Формы Цикл
   Таб.Добавить().ФормаРаботыСоСпискомЗначений = Форма.Имя;
КонецЦикла;
 
ОбщаяФорма.СписокЗначений = Таб;
ОбщаяФорма.ЭлементыФормы.СписокЗначений.СоздатьКолонки();
ОбщаяФорма.Открыть();  
 
КонецПроцедуры



0



Dethmontt

Модератор

Эксперт 1С

3724 / 2918 / 575

Регистрация: 10.03.2011

Сообщений: 11,491

Записей в блоге: 1

10.04.2013, 09:45

14

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//..............
//Что такое ОбработкаОбъект? - (эту переменную я из головы взял!!! Пологая что вы поймете по смыслу что такое ОбработкаОбъект и в каком контексте вы будете это использовать!!!)
//Я специально не хотел писать все! Что бы вы сами поняли что пишите и не переписывали ТУПО
 
Процедура ПриОткрытии()
ОбщаяФорма = ПолучитьФорму("ФормаРаботыСоСпискомЗначений"); //На форме должно быть добавлено Табличное Поле "СписокЗначений"
 
Таб = Новый ТаблицаЗначений;
Таб.Колонки.Добавить("ФормаРаботыСоСпискомЗначений",Новый ОписаниеТипов("Строка"));
 
Для каждого Форма из ЭтотОбъект.Метаданные().Формы Цикл
   Таб.Добавить().ФормаРаботыСоСпискомЗначений = Форма.Имя;
КонецЦикла;
 
ОбщаяФорма.СписокЗначений = Таб;
ОбщаяФорма.ЭлементыФормы.СписокЗначений.СоздатьКолонки();
ОбщаяФорма.Открыть();   
 
КонецПроцедуры



1



4 / 4 / 0

Регистрация: 16.01.2013

Сообщений: 1,228

10.04.2013, 09:54

 [ТС]

15

Dethmontt, Все равно не выводит в ТП имя форм, я уже проверил Сообщить (Форма.Имя);
так все выводит а в ТП нет



0



Модератор

Эксперт 1С

3724 / 2918 / 575

Регистрация: 10.03.2011

Сообщений: 11,491

Записей в блоге: 1

10.04.2013, 10:00

16

СписокЗначений (на вкладке реквизиты формы) какой имеет ТИП ?

Д.б. ТаблицаЗначений



1



4 / 4 / 0

Регистрация: 16.01.2013

Сообщений: 1,228

10.04.2013, 11:07

 [ТС]

17

Спасибо получилось! У меня в обработки создано две формы одна ФормаРаботыСоСпискомЗначений, где появляется список форм и вторая форма ИзменениеДатыДокумента. У брать из списка имя формы ФормаРаботыСоСпискомЗначений он там не нужен.



0



Модератор

Эксперт 1С

3724 / 2918 / 575

Регистрация: 10.03.2011

Сообщений: 11,491

Записей в блоге: 1

10.04.2013, 11:14

18

Цитата
Сообщение от Ermak27
Посмотреть сообщение

У меня в обработки создано две формы одна ФормаРаботыСоСпискомЗначений, где появляется список форм и вторая форма ИзменениеДатыДокумента. У брать из списка имя формы ФормаРаботыСоСпискомЗначений он там не нужен.

Согласен!



0



4 / 4 / 0

Регистрация: 16.01.2013

Сообщений: 1,228

10.04.2013, 13:00

 [ТС]

19

и как убрать?



0



Из формы документа открваю форму для подбора товара по минимаьному остатку, формирую ТЗ, и хочу при закрытии формы подбора передать ТЗ в форму из которой был открыт подбор, а у меня получается только открытие новой формы документа и передача именно в нее. Ключ уникальности задан = 123 (к примеру) Что не так?

Все гораздо проще.        vvvv код исходной формы vvvv // второе поле — владелец, третье — код уникальности формы подбора        vvvv код формы подбора vvvv ЭтаФорма.ОповеститьОВыборе(ВыбраннаяТаблицаЗначений);        vvvv опять код исходной формы vvvv

Идея в том что у любой формы есть процедуры ОповеститьОВыборе и ОбработкаВыбора. Причем первая процедура формы X вызывает вторую у формы Y (которая является владельцем формы X), передавая ей в качестве параметров выбранное значение  и собственные характеристики. Так что для связки достаточно открыть форму подбора, указав ей в качестве владельца форму, которой этот подбор нужен и дальше можно баловаться.

Пишет в ответ: {Документ.ЗаказПоставщику.Форма.ФормаДокумента}: Ошибка при вызове метода контекста (ПолучитьОбщуюФорму): Недопустимое значение параметра (параметр номер «1») Форма=ПолучитьОбщуюФорму(«ФормаЗаполненияПоМинимальномуОстатку»,ЭтаФорма,ДокументОбъект.Дата); по причине: Недопустимое значение параметра (параметр номер «1»)

ПолучитьОбщуюФорму я привел для примера. Это в случае если форма с таким названием лежит в ветке «общие» (имхо самое правильное место для форм подбора). Если она у тебя хранится в ветке документа, тада применяй метод документа получитьформу Остальное без изменений

ВладелецФормы.ТаблицаДляПередачи = ТЗ;

Ветеран: имхо с точки зрения идеологии это не есть совсем правильно… заводить отдельный реквизит ради того чтобы принимать в него значения подбора…

можно завести переменную экспорт и ей присваивать значения

ВладелецФормы — это свойство формы …

Я знаю. Разница в происходящих процессах: 1) Через Обработку выбора Форма 1 открывает форму 2, потом просыпается по приходе сигнала от нее, принимает данные и обрабатывает их как только хочет. 2) Через реквизит владельца формы: Форма 1 открывает форму 2, форма 2 чего-то пишет форме 1 в реквизит и закрывается. Первый вариант ИМХО гибче и идейно правильней.

Тэги:

Комментарии доступны только авторизированным пользователям

В Windows существует механизм периодической принудительной смены паролей пользователями с возможностью установки минимально допустимой длины и требований по сложности. В статье рассказывается, как реализовать аналогичный механизм для пользователей базы 1С.

В Windows существует механизм периодической принудительной смены паролей пользователями с возможностью установки минимально допустимой длины и требований по сложности. В статье рассказывается, как реализовать аналогичный механизм для пользователй базы 1С.

В доменных политиках Windows  есть такая удобная штука, как принудительная периодическая смена пароля учетной записи пользователя. Давно хотелось сделать что-то подобное и для 1С-ки.

Реализация выполнена на конфигурации «Альфа-Авто» от «Рарус», но в принципе, с минимальными доработками, портируема и на другие конфигурации.

Всего необходимо внести четыре изменения:

Изменение первое: в раздел «Константы» добавляются две константы (см. пример 1):

1.ПериодическаяСменаПароля — булева типа, по этой константе будет включаться, отключаться периодическая смена пароля.

2. ПериодичностьСменыПароля — Число(3,0) — здесь указывается период в днях, через который потребуется смена пароля.

Эти константы необходимо добавить в экранную форму редактирования констант (см. пример 2). Для удобства администрирования я повесил на событие «ПериодичностьСменыПароляПриИзменении» простую процедуру:

Процедура ПериодическаяСменаПароляПриИзменении(Элемент)
   Если ПериодическаяСменаПароля Тогда
ТекстВопроса = "Установить ";
ЗначениеДляПодстановки = истина;
Иначе
ТекстВопроса = "Снять ";
ЗначениеДляПодстановки = ложь;
КонецЕсли;
 ТекстВопроса = ТекстВопроса+"у всех пользователей признак ""Периодическая смена пароля""?";  
 Если   Вопрос( ТекстВопроса,РежимДиалогаВопрос.ДаНет) = КодВозвратаДиалога.Да  Тогда
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ | Пользователи.Ссылка КАК Ссылка |ИЗ | Справочник.Пользователи КАК Пользователи";
РезультатЗапроса = Запрос.Выполнить().Выгрузить();
Размер = РезультатЗапроса.Количество();
Для каждого элПользователь Из РезультатЗапроса Цикл
обПользователь = элПользователь.Ссылка.ПолучитьОбъект();
обПользователь.ПериодическаяСменаПароля  = ЗначениеДляПодстановки;
обПользователь.Записать();
Состояние(Строка(РезультатЗапроса.Индекс(элПользователь))+"/"+Размер);
КонецЦикла;
КонецЕсли;
КонецПроцедуры

Данная процедура при изменении значения константы «ПериодическаяСменаПароля» предлагает , и при согласии пользователя, изменяет аналогичный реквизит для всех элементов справочника «Пользователи».

Второе изменение, которое необходимо внести, это дополнительные реквизиты справочника «Пользователи»(см. примеры 3,4):

1. Реквизит «ПериодическаяСменаПароля» — булева типа

2. Реквизит «ДатаПоследнейСменыПароля» — типа «Дата», состав «Дата»

 Реквизит «ПериодическаяСменаПароля» в справочнике «Пользователи» необходим для того, чтобы можно было отключать смену пароля у части пользователей. Как пример, служебные учетные записи, используемые для автоматического запуска обработок («Robot», «BackUp» и т.д.).

Третье изменение: в какой-либо из существующих или вновь созданный глобальный модуль добавляются  несколько процедур:

Процедура раПроверитьСрокПароля(Пользователь) Экспорт
Если раПарольПросрочен(Пользователь) Тогда
раСменитьПароль(Пользователь);
КонецЕсли;
КонецПроцедуры
Функция раПарольПросрочен(ТекПользователь) Экспорт Если Константы.ПериодическаяСменаПароля.Получить()  Тогда
Если ТекПользователь.ПериодическаяСменаПароля Тогда
ПериодичностьСменыПароля = Константы.ПериодичностьСменыПароля.Получить() * 24 * 60 * 60;
// из количества дней приводим к 1С-кому формату временной разницы     
    ДатаСменыПароля = НачалоДня(ТекПользователь.ДатаПоследнейСменыПароля + ПериодичностьСменыПароля);
Если ДатаСменыПароля <= НачалоДня(ТекущаяДата()) Тогда
Возврат истина;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Возврат ложь;

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

ТекстПароля2 = "";
Подсказка = "Повторите новый пароль";
Если Не ВвестиПароль(ТекстПароля2, Подсказка) Тогда
ЗавершитьРаботуСистемы(ложь);
Возврат;
КонецЕсли;
Если ТекстПароля1<>ТекстПароля2 Тогда
Предупреждение("Введенные пароли не совпадают!",10);
ИначеЕсли ТекущийПароль = ТекстПароля1 Тогда
Предупреждение("Новый пароль не должен совпадать со старым!",10);
Иначе
ТекПользователь.Пароль=ТекстПароля1;
Попытка
ТекПользователь.Записать();
ОбъектПользователь.ДатаПоследнейСменыПароля = ТекущаяДата();
ОбъектПользователь.Записать();
ПарольЗаменен = истина;
Исключение
ТекстОшибки = ОписаниеОшибки();
Место = Найти(ТекстОшибки,"Записать):");
Длина = СтрДлина(ТекстОшибки);
ТекстОшибки = Прав(ТекстОшибки,Длина - Место-10);
Если ТекстОшибки = "Заданный пароль короче установленной минимальной длины" Тогда
ТекстОшибки = ТекстОшибки +": "+ ПолучитьМинимальнуюДлинуПаролейПользователей()+" символов.";
КонецЕсли;
Если ТекстОшибки = "Заданный пароль не удовлетворяет требованиям сложности" Тогда
ТекстОшибки = ТекстОшибки +": "+ Символы.ПС +
+"-----------------------------------------------"+ Символы.ПС +
"Длина не менее "+ПолучитьМинимальнуюДлинуПаролейПользователей()+" символов."+Символы.ПС+
"Содержит не менее 3-х типов символов из перечисленных ниже:"+Символы.ПС+
" заглавные буквы"+Символы.ПС+
" строчные буквы"+Символы.ПС+
" цифры"+Символы.ПС+
" спец.символы"+Символы.ПС+
"Не совпадает с именем пользователя."+Символы.ПС+
"Не является последовательностью символов.";
КонецЕсли;
Предупреждение(ТекстОшибки,60);
// здесь штатными средствами платформы выдается сообщение, чем пароль не устраивает     
    КонецПопытки;
КонецЕсли;
КонецЦикла;
ПериодичностьСменыПароля = Константы.ПериодичностьСменыПароля.Получить() * 24 * 60 * 60;
ДатаСледующейСмены =  спрПользователь.ДатаПоследнейСменыПароля + ПериодичностьСменыПароля;
ТекстПредупреждения =  "Пароль пользователя изменен."+Символы.ПС+
"Благодарим за понимание."+Символы.ПС+
"Следующая смена пароля: "+Формат(ДатаСледующейСмены,"ДЛФ=DD");
Предупреждение(ТекстПредупреждения,10);
#КонецЕсли 
КонецПроцедуры
Функция ПарольДействует(ТекущийПароль)
СтрокаСоединения =  СтрокаСоединенияИнформационнойБазы()+" ";
Логин = "Usr="""+ИмяПользователя()+"""; ";
Пароль = "Pwd="+ТекущийПароль;
СтрокаСоединения = СтрокаСоединения + Логин + Пароль;
cntr = Новый COMObject("V82.COMConnector");
Попытка
connection = cntr.Connect(СтрокаСоединения);
ПарольДействует = истина;
Исключение
ОписаниеОшибки = ОписаниеОшибки();
Если Найти(ОписаниеОшибки,"Неправильное имя или пароль пользователя")>0 Тогда
ПарольДействует = ложь;
Иначе
ПарольДействует = истина;
КонецЕсли;
КонецПопытки;
connection = "";
cntr = "";
Возврат ПарольДействует;
КонецФункции

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

 И, наконец, четвертое изменение:

В процедуру «ПриНачалеРаботы» модуля приложения добавляется вызов процедуры «раПроверитьСрокПароля(ПараметрыСеанса.Пользователь)».

После внесения изменений в конфигурацию, при первом заходе в базу данных необходимо будет установить значение константы «ПериодическаяСменаПароля» в «истина». После этого будет выведено диалоговое окно, предлагающее изменить значение реквизита «ПериодическаяСменаПароля» для всех элементов справочника «Пользователи», что и будет сделано при положительном ответе. Далее, необходимо будет выставить значение константы «Периодичность смены пароля», например — 60. Это значит, что система будет запрашивать смену пароля каждые 60 дней.

Далее, если есть пользователи, у которых не должен периодически меняться пароль, необходимо снять у данных элементов справочника «Пользователи» соответствующую галочку реквизита «Периодическая смена пароля».

Собственно, и вся настройка.

Теперь, при первом последующем заходе пользователя в базу данных у него выйдет диалоговое окно, оповещающее о необходимости смены пароля (см. пример 5).

После этого пользователю будет предложено ввести старый пароль.

Тут позволю себе небольшое отступление:

Понятно, что вновь устанавливаемый пароль пользователя не должен совпадать со старым. Иначе, вся идея смены пароля сливается в никуда. Старый пароль пользователя необходим нам, чтобы сравнить его с новым. К сожалению, пароль пользователя хранится в базе в хэшированном виде и я не нашел способов выдернуть его в пригодном для сравнения с новым паролем виде. Поэтому, мы вынуждены требовать от пользователя ввести старый пароль в открытом виде и проверять, действительно ли введен актуальный пароль от базы.

Для этого мы создаем объект «V82.COMConnector», прописываем в его параметрах путь к базе, имя пользователя и введенный им пароль. После этого пробуем соединиться с базой данных . Если соединение прошло успешно — пароль верный. Если была возвращена ошибка «Неправильное имя или пароль пользователя», то значит, пользователь пытается нас обмануть. Еще возможна ошибка «Данному пользователю не разрешены внешние соединения», но она возникает уже после успешной авторизации. Нас и такой вариант устроит. Пароль ведь верный, а это все, что нам сейчас надо знать.

Далее пользователю предлагается ввести и подтвердить новый пароль (см . пример 6).

Если пароль не удовлетворяет требованиям по сложности, то пользователю будет выведено об этом сообщение (см. пример 7) и будет предложено ввести новый пароль еще раз.

Еще одно отступление:

Параметры сложности паролей пользователей настраиваются в режиме «Конфигуратор», в меню «Администрирование» — «Параметры информационной базы» (см. пример 8). Здесь можно выставить минимально допустимую длину пароля, а проверку сложности пароля пользователя. Пароль в таком случае будет проверяться по наличию как минимум, трех различных групп символов:  цифры, большие и маленькие буквы, а также различные раскладки клавиатуры.

Если пользователь не захочет вводить старый или новый пароли, то работы системы будет завершена.

Итак, пользователь успешно ввел новый пароль, отвечающий требованиям безопасности.  Теперь, в течение прописанного в константе «ПериодичностьСменыПароля» (например, 60 дней) система оставит пользователя в покое. А по истечении этого срока, вновь потребует сменить пароль.

К сожалению, ничего не мешает пользователю поменять пароль на новый, а затем в пользовательском режиме зайти в «Сервис» — «Параметры пользователя» и там поменять пароль опять на старый. Но для этого необходимо, чтобы пользователь знал об этой возможности, а о ней, как показывает практика знают очень мало пользователей. Для того, чтобы отсечь эту возможность, пришлось бы хранить пароли пользователей в базе в открытом виде, а это, по моему мнению, излишний в данном случае, риск.

И в заключение, несколько моментов организационного порядка:

  1. Безопасность информации в базе данных должна обеспечиваться комплексом мер, и периодическая смена паролей пользователей,  это только одна из них. Описание других мер обеспечения безопасности информации выходит за рамки данной статьи.
  2. Периодическую смену паролей пользователей в 1С логичнее всего вводить параллельно с введением периодической смены паролей пользователей доменных учетных записей. При этом желательно, выставить одинаковые требования по длине и сложности паролей . Периоды смены паролей лучше тоже выставить одинаковые, но разнести периодичность на пару дней (например, пароли на доменные учетные записи изменялись в понедельник, а на учетные записи 1С – в среду). Это позволит сделать смену паролей менее болезненной для пользователей.
  3. Введение данного новшества неминуемо столкнется  с пассивным, а может, и активным, противодействием пользователей. Наиболее действенным средством, основываясь на практике, служит приказ по организации примерно следующего содержания:  «Ответственность за действия, совершенные под  учетной записью пользователя, в том числе, и другими лицами, несет сам пользователь. Пользователю запрещается передавать пароли от своих учетных записей другим лицам. Пользователь, отходя от своего рабочего места, обязан заблокировать сессию, во избежание доступа других лиц к ней.  Пароли на учетные записи пользователей должны изменяться с периодичностью в 60 дней. За простой, вызванный утерянным паролем от учетной записи, несет ответственность  сам пользователь ».  С данным приказом следует ознакомить всех пользователей под роспись. Этим сразу снимается колоссальная доля психологической инерции и негатива пользователей.
  4. В любой, наверно, организации есть пользователи, любящие забывать пароли.  После введения данного новшества частота забывания ими пароля гарантировано вырастет в разы. Эффективным средством дисциплинирования таких пользователей служит фиксация фактов внеплановой смены пароля. Причем, вероятнее всего, даже не придется выкладывать данную статистику на стол руководителя. Зачастую пользователю хватает того факта, что тот факт, что он опять забыл пароль, фиксируется, например в «Тетради фиксации внеплановой смены пароля». Чаще всего, пользователь немедленно вспоминает свой пароль.  

P.S. Дополнительно хотелось бы прикрутить проверку на несовпадение паролей пользователя Windows  и пользователя базы 1С. К сожалению, мне не удалось найти способа сравнения данных паролей.

Понравилась статья? Поделить с друзьями:
  • Ошибка при вызове метода контекста прочитатьjson недопустимое имя свойства
  • Ошибка при вызове метода контекста получитьмакет нарушение прав доступа
  • Ошибка при вызове метода контекста прочитать конфликт блокировок
  • Ошибка при вызове метода контекста получитьcomобъект
  • Ошибка при вызове метода контекста получить файл