1с событие при изменении дополнительного реквизита

Ранее мы добавили свой дополнительный реквизит «СНИЛС» для внутреннего документа и сделали закладку с дополнительными реквизитами первой на форме.

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

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

Номер СНИЛС представляет собой строку следующего формата «XXX-XXX-XXX XX», где Х это цифра от 0 до 9. Последняя группа символов XX представляет собой контрольное число. К сожалению типовой механизм не позволяет задать маску ввода для дополнительных реквизитов. Поэтому внесем изменения в программный код. Создание полей на форме для дополнительных реквизитов происходит динамически при создании формы на сервере, либо при изменении некоторых реквизитов в уже открытой форме. Первичный вызов процедуры создания дополнительных реквизитов выглядит так:

&НаСервере

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

...

УправлениеСвойствами.ПриСозданииНаСервере(ЭтаФорма, ДополнительныеПараметры);

...

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

Само создание полей формы происходит в процедуре

УправлениеСвойствами.ЗаполнитьДополнительныеРеквизитыВФорме()

Откроем общий модуль УправлениеСвойствами и найдем там эту процедуру. Внесем туда изменения — добавим в конце вызов своей процедуры:

Процедура ЗаполнитьДополнительныеРеквизитыВФорме(Форма, Объект = Неопределено, ПоляНадписей = Ложь, СкрытьУдаленные = Неопределено) Экспорт

...

маг_РаботаСДокументами.ЗаполнитьДополнительныеРеквизитыВФорме(Форма, ОписаниеОбъекта, ПоляНадписей) ;

...

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

Теперь в общий модуль маг_РаботаСДокументами добавим  саму реализацию этой процедуры:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

Процедура ЗаполнитьДополнительныеРеквизитыВФорме(Форма, Объект, ПоляНадписей) Экспорт

Если ТипЗнч(Объект.Ссылка) <> Тип(«СправочникСсылка.ВнутренниеДокументы») Тогда

Возврат;

КонецЕсли;

ВидДокументаСтрокой = «»+Форма.Объект.ВидДокумента;

Если ВидДокументаСтрокой = «Заявка на прием» тогда

//Получим уникальное имя для реквизита СНИЛС

ИмяДопРеквизита = маг_ПовторноеИспользование.УникальноеИмяДопРеквизита(Объект.ВидДокумента, «СНИЛС»);

Рек = Форма.Элементы.Найти(ИмяДопРеквизита);

Если Рек <> Неопределено тогда

Рек.Маска = «999-999-999 99»;

Рек.УстановитьДействие(«ПриИзменении», «маг_СНИЛСПриИзменении»);

КонецЕсли;

КонецЕсли;

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

Здесь мы сначала получаем уникально имя для нашего реквизита. По нему мы сможем обращаться как к самому реквизиту формы, так и к полю формы. Для получения уникального имени используем следующую функцию, поместим ее в общий модуль маг_ПовторноеИспользование:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

Функция УникальноеИмяДопРеквизита(ВидДокумента, ИмяРеквизита)  Экспорт

УстановитьПривилегированныйРежим(Истина);

Набор = ВидДокумента.НаборСвойств;

Результат  = «»;

Запрос = Новый Запрос;

Запрос.Текст =

«ВЫБРАТЬ ПЕРВЫЕ 1

| ВЫБОР

| КОГДА Наборы.ПометкаУдаления

| ТОГДА &ПустойНабор

| ИНАЧЕ Наборы.Ссылка

| КОНЕЦ КАК Набор,

| Наборы.Свойство

|ИЗ

| Справочник.НаборыДополнительныхРеквизитовИСведений.ДополнительныеРеквизиты КАК Наборы

|ГДЕ

| Наборы.Ссылка = &Ссылка

| И Наборы.Свойство.Заголовок = &Наименование»;

Запрос.УстановитьПараметр(«Наименование», ИмяРеквизита);

Запрос.УстановитьПараметр(«Ссылка», Набор);

Запрос.УстановитьПараметр(«ПустойНабор», Справочники.НаборыДополнительныхРеквизитовИСведений.ПустаяСсылка());

РезультатЗапроса = Запрос.Выполнить();

Выб = РезультатЗапроса.Выбрать();

Если Выб.Следующий() тогда

ИмяУникальнаяЧасть =

СтрЗаменить(ВРег(Строка(Выб.Набор.УникальныйИдентификатор())), «-«, «x»)

+ «_»

+ СтрЗаменить(ВРег(Строка(Выб.Свойство.УникальныйИдентификатор())), «-«, «x»);

Результат = «ДополнительныйРеквизитЗначение_» + ИмяУникальнаяЧасть;

КонецЕсли;

Возврат Результат;

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

После того как по уникальному имени получили ссылку на поле формы, устанавливаем для него маску ввода, а так же назначаем обработчик ПриИзменении для проверки корректности ввода СНИЛСа (об этом ниже). После внесения этих дополнений, значение СНИЛСа на форме должно вводиться по маске как показано на картинке ниже:

Ввод СНИЛС по маске

Маска для поля СНИЛС

Подключаем обработчик события для дополнительного реквизита

Для проверки корректности ввода СНИЛС используем типовую функцию из 1С:ЗУП. Поместим данную функцию в наш общий модуль маг_РаботаСДокументами. Ниже сама функция:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

Функция СтраховойНомерПФРСоответствуетТребованиям(СтраховойНомер) Экспорт

Результат = Истина;

СтрокаЦифр=СтрЗаменить(Лев(СтраховойНомер,11),«-«,«»);

Если ПустаяСтрока(СтрокаЦифр) Тогда

Возврат Ложь;

КонецЕсли;

Попытка

П1 = Число(СтрокаЦифр);

КонтрольноеЧисло=Число(Прав(СтраховойНомер,2));

Исключение

Возврат Ложь;

КонецПопытки;

Если Число(Лев(СтрокаЦифр,9)) > 1001998 Тогда

Всего=0;

Для Сч = 1 По 9 Цикл

Всего=Всего+Число(Сред(СтрокаЦифр,10Сч,1))*Сч

КонецЦикла;

Остаток=Всего%101;

Остаток=?(Остаток=100,0,Остаток);

Если Остаток<>КонтрольноеЧисло Тогда

Результат = Ложь;

КонецЕсли;

Иначе

Результат = Ложь;

КонецЕсли;

Возврат Результат;

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

Помните, мы программно назначили обработчик на поле дополнительного реквизита. Теперь добавим саму процедуру для обработчика ПриИзменении в модуль формы элемента справочника «ВнтуренниеДокументы»:

&НаКлиенте

Процедура маг_СНИЛСПриИзменении(Элемент)

Если НЕ маг_РаботаСДокументами.СтраховойНомерПФРСоответствуетТребованиям(Элемент.ТекстРедактирования) тогда

ПоказатьПредупреждение(,«СНИЛС указан неверно!!!»);

КонецЕсли;

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

Теперь, если пользователь ошибется при вводе СНИЛСа, то система предупредит его и выдаст сообщение о некорректном значении:

Предупреждение о некорректном СНИЛСе

Предупреждение

Итоги

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

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

Допустим, для документа «Поступление услуг и прочих активов» у нас создан дополнительный реквизит «Не выгружать при синхронизации» с типом «Булево».  Задача: использовать событие элемента формы «При изменении».

Дополнительные реквизиты – штука тонкая. Они могут присутствовать на форме объекта, а могут и не присутствовать. Например, в конфигурации «Управление торговлей 11.2», когда мы открываем форму документа «Поступление услуг и прочих активов», дополнительные реквизиты там отсутствуют. Это можно видеть в отладчике. И только когда мы переходим на вкладку «Дополнительно», происходит отложенная инициализация формы и после этого дополнительные реквизиты появляются в форме.

В связи с таким поведением формы, нам придётся назначать обработчик для события элемента формы дополнительного реквизита программно. Сделаем это с помощью метода УстановитьДействие().

Как мы уже отметили, в УТ 11.2 в документе «Поступление услуг и прочих активов» дополнительные реквизиты появляются на форме при переходе на вкладку «Дополнительно». Переход обрабатывается в следующей процедуре, которая расположена в модуле формы документа:

&НаКлиенте
Процедура ГруппаСтраницыПриСменеСтраницы(Элемент, ТекущаяСтраница)

	// Текст процедуры

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

В этой процедуре дополнительные реквизиты уже должны появиться на форме. Воспользуемся отладчиком. Поставим точку останова в конце процедуры и запустим отладку. Создадим условия для захода в точку останова. Далее в «Табло» найдём элемент формы необходимого нам дополнительного реквизита. Примерный его вид и расположение:

ЭтаФорма.Элементы.ДополнительныйРеквизитЗначение_AFD1AFD8xC18C

Метод УстановитьДействие() выполняется в контексте «На сервере», поэтому мы не можем использовать его в процедуре ГруппаСтраницыПриСменеСтраницы(), так как её контекст – «На клиенте». Значит, в конце процедуры мы дописываем вызов своей, серверной, процедуры, которая, собственно, и будет устанавливать обработчик для события «ПриИзменении» элемента формы.

&НаКлиенте
Процедура ГруппаСтраницыПриСменеСтраницы(Элемент, ТекущаяСтраница)

	// Текст процедуры
	
	УстановитьДействиеДляДопРеквизита();
	
КонецПроцедуры

В модуле формы создаём серверную процедуру:

&НаСервере
Процедура УстановитьДействиеДляДопРеквизита()
		
	ЭтаФорма.Элементы.ДополнительныйРеквизитЗначение_AFD1AFD8xC18C.УстановитьДействие("ПриИзменении", "МойОбработчик");
	
КонецПроцедуры

В этой процедуре мы задали, что событие элемента формы «ПриИзменении» будет обрабатываться в процедуре с названием «МойОбработчик». Нам осталось только создать эту процедуру. Нужно учесть, что контекст её выполнения должен быть «На клиенте».

&НаКлиенте
Процедура МойОбработчик()
	
	// Текст процедуры
	
КонецПроцедуры

Вот вроде бы и всё.

  Маркет42 - Место для твоих разработок  

Событие «При изменении» для реквизита программно добавленного на форму.

Я
   Юзер123

15.09.20 — 15:32

Доброго времени.

В Справочник Договора Клиентов добавил реквизит.   На форму справочника добавляю его программно через общий модуль «МодификацияКонфигурацииПереопределяемый»

Как вызвать обработчик события при изменении для этого реквизита?

  

Партнерская программа EFSOL Oblako

   Юзер123

1 — 15.09.20 — 15:44

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

   RomanYS

2 — 15.09.20 — 15:50

Элементы.Твойреквизит.УстановитьДействие(«ПриИзменении», «ИмяПроцедуы»);

Только процедура должна быть в самой форме вроде

   Юзер123

3 — 15.09.20 — 15:55

(2)  Сама процедура «ПриИзменении» или Процедура  добавления элемента.

   Юзер123

4 — 15.09.20 — 15:57

Да все ок.  

РАботает.

  

RomanYS

5 — 15.09.20 — 15:58

(3) процедура-обработчик. Добавить элемент и установить действие можно и в ОМ

Пара полезных процедур для работы с дополнительными реквизитами на форме. Далее в статье: 1. Как называются дополнительные реквизиты на форме и в какой момент они появляются на форме? 2. Как проверить до записи корректность заполнения пользователем дополнительного реквизита? 3. Как заполнить значение дополнительного реквизита по другому событию и обновить данные на форме? 4. Как расположить дополнительный реквизит в указанном месте на форме?

Вот пара задач на размышление:

  1. Как называются дополнительные реквизиты на форме и в какой момент они появляются на форме?
  2. Как проверить корректность заполнения пользователем дополнительного реквизита, если значение некорректно – уведомить и отказать в записи объекта? Напоминаю, что до записи объекта в ТЧ Дополнительные реквизиты – данных еще нет, а на форме – уже есть.
  3. Как заполнить значение дополнительного реквизита при записи (или по другому событию) и обновить данные на форме?
  4. Как расположить дополнительный реквизит в указанном месте на форме?

Далее привожу решение этих задач — поковыряться с отладчиком пришлось изрядно…

Итак, вот решение:

  1. Для начала смотрим с отладчиком, появились ли Допреквизиты на форме после ПриСозданииНаСервере? Нет. А после ПриОткрытии? Тоже нет. А вот после активизации закладки «Дополнительно»  — появились со страшными именами как на скриншоте. Это было создано типовой процедурой  УправлениеСвойствами.ЗаполнитьДополнительныеРеквизитыВФорме(ЭтотОбъект), которая создала реквизиты на форме
ОписаниеСвойства.ИмяУникальнаяЧасть = 			СтрЗаменить(ВРег(Строка(ОписаниеСвойства.Набор.УникальныйИдентификатор())), "-", "x") + "_" + СтрЗаменить(ВРег(Строка(ОписаниеСвойства.Свойство.УникальныйИдентификатор())), "-", "x");				ОписаниеСвойства.ИмяРеквизитаЗначение =			"ДополнительныйРеквизитЗначение_" + ОписаниеСвойства.ИмяУникальнаяЧасть;

 После чего Система располагает реквизиты на форме

Добавление /изменение реквизитов на форме возможно благодаря следующей интересной конструкции.

Реквизит = Новый РеквизитФормы(ОписаниеСвойства.ИмяСсылочногоРеквизитаЗначение, ФорматированнаяСтрока, , ОписаниеСвойства.Наименование, Истина);
            ДобавляемыеРеквизиты.Добавить(Реквизит);

  Форма.ИзменитьРеквизиты(ДобавляемыеРеквизиты);

Но это нам сейчас все не нужно, так, для любопытства.
 

А вот чтобы работать с реквизитами нужно научиться получать их имена на форме по имени дополнительного реквизита. На радость разработчикам при работе с допреквизитами на форме Система создает служебный реквизит «Свойства_ОписаниеДополнительныхРеквизитов» который содержит на форме коллекцию данных, где есть все необходимы нам данные, можно найти и по имени, и найти соответствующее свойство ПланаВидаХарактеристик

Далее дело техники. По имени дополнительного реквизита получаем Поле дополнительного реквизита, и делаем с ним что хотим

Функция ПолучитьПолеДополнительногоРеквизитаНаФорме(Форма, ИмяРеквизита) Экспорт 
	
	Список = Форма.Свойства_ОписаниеДополнительныхРеквизитов;
	
	Свойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Имя", ИмяРеквизита);
	
	Если ЗначениеЗаполнено(Свойство) Тогда
	    НайденныеСтроки = Список.НайтиСтроки(Новый Структура("Свойство", Свойство));
		Если НайденныеСтроки.Количество() > 0 Тогда
			Возврат НайденныеСтроки[0];		
		КонецЕсли; 		
	КонецЕсли;
	
КонецФункции
  1. Используя функцию из п1 — нужно проверить значение поля дополнительного реквизита на форме     
Функция ПолучитьЗначениеДополнительногоРеквизитаНаФорме(Форма, ИмяРеквизита) Экспорт
	Перем ЗначениеРеквизита;
	
	ПолеДополнительногоРеквизитаНаФорме = ПолучитьПолеДополнительногоРеквизитаНаФорме(Форма, ИмяРеквизита);
	
	Если не ПолеДополнительногоРеквизитаНаФорме = Неопределено Тогда
		Возврат Форма[ПолеДополнительногоРеквизитаНаФорме.ИмяРеквизитаЗначение];
	КонецЕсли;
	
КонецФункции

 3. Используя функцию из п1 — нужно установить значение поля дополнительного реквизита на форме

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

4. Используя функцию из п1 – нужно выполнить волшебную процедуру «Переместить» для коллекции Элементов формы                      

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

В итоге, можно управлять дополнительными реквизитами на форме – почти так же комфортно, как и собственными. И ничего менять в конфигурации – не пришлось – все управление находится в расширении

Вывод: таким образом, не меняя конфигурацию, и используя механизмы дополнительных реквизитов и расширений всех типовых конфигураций, мы управляем расположением реквизитов и программно контролируем их заполнение и содержание.

Проверено на КА 2.4.2.132, но вполне универсально для всех БСП неустановленной версии 

Heltarion

2 / 2 / 0

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

Сообщений: 57

1

Как вызвать процедуру ПриИзмененнии, для изменяемого реквизита?

03.08.2012, 12:45. Показов 9592. Ответов 6

Метки нет (Все метки)


Добрый день!
Столкнулся с задачей:
Необходимо из экселя заполнять реквизиты документа. Документ создается, реквизиты заполняются, но не получается вызвать обработчик события при изменении одного из реквизитов. Может кто подскажет или поделится примерами как это делается?
Вот код, который я использую:

1C
1
2
3
4
5
6
7
8
ДокументПКО = Документы.ПриходныйКассовыйОрдер.СоздатьДокумент();
ДокументПКО.ВидОперации = Перечисления.ВидыОперацийПКО.ПрочийПриход;
ДокументПКО.Дата = стр.ДатаПоступления;
ДокументПКО.СчетКасса = ПланыСчетов.Хозрасчетный.КассаОрганизации;
ДокументПКО.СчетУчетаРасчетовСКонтрагентом =  ПланыСчетов.Хозрасчетный.ВыручкаНеЕНВД; 
ДокументПКО.Комментарий = "ЗАГРУЗКА ИЗ ПО"; 
ДокументПКО.СуммаДокумента = стр.Сумма;
ДокументПКО.ЗАписать();

Пытался заполнять через форму, но обработчик события «ПриИзмененнииСуммыДокумента» не сработал



0



2923 / 844 / 324

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

Сообщений: 2,633

03.08.2012, 13:16

2

кликаете 2 раза по реквизиту на форме, откроется окно свойств в нем внизу есть предопределенные процедуры так сказать вот какая вам нужна справа от нее кликаете по значку лупы и вуаля вас перебросит в модуль формы в нужную вам процедуру

Добавлено через 1 минуту
или вам нужно программно вызвать????

Добавлено через 36 секунд
если программно то вам если я не ошибаюсь нужно сначала получить форму а уже у нее вызывать процедуру

Добавлено через 9 минут
ну и естественно она должна быть экспортной



0



2 / 2 / 0

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

Сообщений: 57

04.08.2012, 09:59

 [ТС]

3

В том-то и беда, что программно надо вызвать из внешней обработки. И эта функция не является экспортной.

Я нашел один пример как это делается, но ничего в нем не понял. Суть данного метода следующая:
Создается форма пустышка, где интерактивно выбирается/вводится реквизит, потом программно форме пустышке назначают владельца (в моем случае это: ПриходныйКассовыйОрдер). Далее форме ПриходныйКассовыйОрдера с помощью функции «ОповеститьОВыборе» сообщают, что выбор конкретного реквизита сделан, после чего запускается стандартная процедура обработки события для данного ПоляВвода, предусмотренная 1С. Что-то в этом роде, беда в том, что я не понял как это сделать.



0



900 / 877 / 8

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

Сообщений: 2,680

04.08.2012, 14:07

4

Скопируйте процедуру из формы в свою обработку и вызывайте её. Зачем мудрить то?



0



2954 / 1766 / 82

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

Сообщений: 8,280

04.08.2012, 18:20

5

Вариант: В форме обработки ПриОткрытии() запускается нужная функция, Отказ=Истина. (или Закрыть())

Добавлено через 27 секунд
Само собой из дока обработка.открытьформу



0



2 / 2 / 0

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

Сообщений: 57

21.08.2012, 10:32

 [ТС]

6

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

Скопируйте процедуру из формы в свою обработку и вызывайте её. Зачем мудрить то?

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



0



2954 / 1766 / 82

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

Сообщений: 8,280

21.08.2012, 18:48

7

Я ж пейсал: запустите функцию самой обработкой, тогда хоть атрибуты обработки будут доступны. А если вызываются глобальники других конфигураций — тогда извиняйте: иного выхода, как перетащить всё в свою нет



0



IT_Exp

Эксперт

87844 / 49110 / 22898

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

Сообщений: 92,604

21.08.2012, 18:48

7

Событие при изменении любого элемента формы типа «Поле ввода» , «Таблица формы» (управляемое приложение) ?

Автор oooo800, 28 авг 2020, 14:22

0 Пользователей и 1 гость просматривают эту тему.

Самописная конфигурация, платформа 8.3.16, управляемые формы.
Есть форма элемента справочника, с кучей реквизитов типа Поле ввода и одним Таблица формы.
До записи формы, после изменения любого из элементов формы, форма становится модифицированной — появляется значок «*» и свойство формы Модифицированность устанавливается в Истина.
Нужно сразу после этого вывести в эту же форму сообщение, например, что элемент теперь редактируется.
Но события ПриИзменении формы нет.
.
Как это лучше всего сделать, для Толстого/Тонкого и Веб клиента ?


а что, самой звездочки, которая и говорит что элемент редактируется — не достаточно?
ее,что, плохо видно?

если помогло нажмите: Спасибо!


Некоторые пользователи, особенно в совсем зрелом возрасте ее не видят (она не привлекает их внимание) и появилась такая задача.

Ее реализовал, но, пока считаю, не очень оптимальным путем, хотя пока знаю его как единственный:
«обход» всех нужных элементов формы в «ПриСозданииНаСервере» в цикле и установка действия «ПриИзменении» этих элементов на одну для всех этих элементов процедуру &НаКлиенте,что-то вроде «ПриИзменениииКучиРеквизитов» .
Работает.
Но хотелось бы что-то по элегантнее……


попробуйте в событии
ПриОткрытииФормы

подключить обработчик ожидания, с периодом 2-3 сек.
в процедуре обработчика проверяете Модифицированность и выводите в заголовок приписку
ЗаголовокФормы +» (Редактирование)»

в этом случае, не надо, все события, всех элементов формы перехватывать

если помогло нажмите: Спасибо!


Да не хотелось бы со временем, а по событию — после факта наступления изменения.

Вдруг пользователь откроет форму, она будет открыта несколько минут, а потом передумает что-то делать в ней и закроет её неизменной.
А в это время каждые 2-3 секунды будет опрос…

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

Если у вас есть возможность достучаться до 1С, может отправить им «хотелку» с таким событием — тем более, факт изменения формы «отлавливается» в люобом случае.


ЦитироватьА в это время каждые 2-3 секунды будет опрос…

и чё? таких опросов с 1С-ке тысячи, кучу системных опросов вы просто не видите, а они есть!

и если оптимально напишите, это будет занимать пару микросекунд,
зато у вас одна процедурка, в одном месте формы

если помогло нажмите: Спасибо!


Цитата: LexaK от 28 авг 2020, 17:20

ЦитироватьА в это время каждые 2-3 секунды будет опрос…

и чё? таких опросов с 1С-ке тысячи, кучу системных опросов вы просто не видите, а они есть!

и если оптимально напишите, это будет занимать пару микросекунд,
зато у вас одна процедурка, в одном месте формы

И ни чё. :D
Первоначально за это и думал, не поверите.
Но не хочется добавлять в эту кучу еще и свою кучку.
Как и не хочется первоначально «грузить» событиями кучу элементов.
Просто предположил, что есть «секретный метод»  — аля «секретное» событие, которое не известно мне, но известно Гуру.
Оказывается, всего 2 вариант:
— опрос каждые …. секунд/минут/часов;
— установка события на ВСЕ реквизиты, меняющие форму.


Цитата: oooo800 от 28 авг 2020, 14:22…Нужно сразу после этого вывести в эту же форму сообщение, например, что элемент теперь редактируется.
Но события ПриИзменении формы нет.

Есть метод ПоказатьПредупреждение().
Есть метод ПоказатьОповещениеПользователю().

Использую учебную платформу 1С:Предприятие 8.3


Цитата: IL2016 от 31 авг 2020, 21:49

Цитата: oooo800 от 28 авг 2020, 14:22…Нужно сразу после этого вывести в эту же форму сообщение, например, что элемент теперь редактируется.
Но события ПриИзменении формы нет.

Есть метод ПоказатьПредупреждение().
Есть метод ПоказатьОповещениеПользователю().

Великолепно.
А в каком событии их «запускать» ?
Во в чем главный вопрос.
Про эти методы знаю.
Было бы что-то «ПриИзмененииФорма(…..)»
Так оттуда можно использовать эти и другие методы.


oooo800, вы с самого начала неправильно подошли к решению этой задачи
по большому счету, работа пользователя в базе, сводится к двум режимам
1.либо он (пользователь) что-то смотрит в базе
2.либо вводит/изменяет данные

для вашего случая подходит следующий «правильны/взрослый» вариант.
1.добавьте в реквизиты формы реквизит ЭтоРедактирование — Тип:Булево
2.настройте открытие формы элемента ВашегоСправочника только на просмотр 
в событии ПриОткрытии(), Этаформа.ТолшькоПросмотр = Не ЭтоРедактирование;
при обычном открытии формы реквизит ЭтоРедактирование будет равен Ложь.
3.в Форме СПИСКА вашего справочника сделайте кнопку: Редактировать
при нажатии на эту кнопку, создаете форму Элемента и в параметрах передаете ЭтоРедактирование = Истина
В самой форме, в событии ПриОткрытии
Если ЭтоРедактирование Тогда
    а.Пытаетесь заблокировать данный элемент справочника, вдруг его уже кто-то редактирует, получите предупреждение кто редактирует, форму не открываете
    б.Если блокировка установилась, вот здесь в заголовок и пишите большими буквами РЕДАКТИРОВАНИЕ ЭЛЕМЕНТА ….

суть такая, как бы пользователь не кликал по элементу справочника, ему открывается форма только на просмотр,
если же пользователю необходимо внести зменения, то ему надо выделить в списке нужный элемент и нажать вашу кнопку Редактирвать
в принциае эту кнопку можно разметить и на самой форме элемента,
Пользователь открыл форму (на просмотр) что-то там увидел, что срочно изменить нужно, нажимает на кнопку Редатировать и при этом отрабатывает алгоритм выше (с блокировкой и с доступом на редактирование).

если помогло нажмите: Спасибо!


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

Допустим, для документа «Поступление услуг и прочих активов» у нас создан дополнительный реквизит «Не выгружать при синхронизации» с типом «Булево». Задача: использовать событие элемента формы «При изменении».

Дополнительные реквизиты – штука тонкая. Они могут присутствовать на форме объекта, а могут и не присутствовать. Например, в конфигурации «Управление торговлей 11.2», когда мы открываем форму документа «Поступление услуг и прочих активов», дополнительные реквизиты там отсутствуют. Это можно видеть в отладчике. И только когда мы переходим на вкладку «Дополнительно», происходит отложенная инициализация формы и после этого дополнительные реквизиты появляются в форме.

В связи с таким поведением формы, нам придётся назначать обработчик для события элемента формы дополнительного реквизита программно. Сделаем это с помощью метода УстановитьДействие () .

Как мы уже отметили, в УТ 11.2 в документе «Поступление услуг и прочих активов» дополнительные реквизиты появляются на форме при переходе на вкладку «Дополнительно». Переход обрабатывается в следующей процедуре, которая расположена в модуле формы документа:

В этой процедуре дополнительные реквизиты уже должны появиться на форме. Воспользуемся отладчиком. Поставим точку останова в конце процедуры и запустим отладку. Создадим условия для захода в точку останова. Далее в «Табло» найдём элемент формы необходимого нам дополнительного реквизита. Примерный его вид и расположение:

Метод УстановитьДействие () выполняется в контексте «На сервере», поэтому мы не можем использовать его в процедуре ГруппаСтраницыПриСменеСтраницы () , так как её контекст – «На клиенте». Значит, в конце процедуры мы дописываем вызов своей, серверной, процедуры, которая, собственно, и будет устанавливать обработчик для события «ПриИзменении» элемента формы.

В модуле формы создаём серверную процедуру:

В этой процедуре мы задали, что событие элемента формы «ПриИзменении» будет обрабатываться в процедуре с названием «МойОбработчик». Нам осталось только создать эту процедуру. Нужно учесть, что контекст её выполнения должен быть «На клиенте».

Если реквизит объекта «вытащен» на форму, то реквизит формы можно получить через объект ЭлементыФормы , который содержит коллекцию элементов формы, сканируя ее в цикле:

Этот цикл позволяет просмотреть имена а так же типы всех реквизитов формы, в том числе такие реквизиты как надписи, командные панели и тд.

Реквизиты формы могут быть различных типов. Поставив фильтр в виде типа реквизита мы можем просмотреть реквизиты определенного типа.

Если реквизит формы имеет тип «ТабличноеПоле», то можно такой элемент просканировать во вложенном цикле и узнать имена колонок таблицы:

Как получить значение отдельного реквизита формы?

Чаще требуется получать не массив реквизитов формы, а значение отдельных конкретных реквизитов формы. Например реквизиты «Шапки» или «Подвала» формы документа.

Реквизиты шапки могут иметь различные типы: Дата, СправочникСсылка, ЧекБокс, элемент раскрывающегося списка и др.

Доступ к табличной части формы через объект

Доступ к табличной части формы (например: Товары) можно получить через объект:

Здесь ДокОбъект.Товары — это табличная часть «Товары» объекта. Далее в цикле табличная часть построчно сканируется!
В каждой итерации цикла можно получить доступ к любому полю строки указав через точку имя этого поля:

Доступ к табличной части формы через ЭлементыФормы

Табличная часть объекта и табличная часть формы объекта — это не одно и то же!

Для того, чтобы код работал правильно, надо чтобы колонка формы табчасти объекта в свойстве данные ссылалась на реквизит табличной части объекта. Этим определяется тип колонки таб части формы.

То есть должна быть установлена связь между реквизитом табчасти объекта и реквизитом табчасти формы. Форм у объекта метаданных может быть много мы знаем. Табличную часть формы объекта можно получить через объект ЭлементыФормы :

Объект ЭлементыФормы используется для доступа к элементам управления, расположенным на форме, в частности к таб части документа.

Результат для документа Авансовый отчет:

Это табличное поле!! Товары
Количество строк: 4
Женские ботфорты коричневые
Ботинки женские демисезонные
Ботинки женские натуральная кожа
Женские босоножки

Если надо получить значение всех колонок всех строк, то организуем дважды вложенный цикл:
Во внешнем цикле сканируются строки, во внутреннем — колонки:

Результат для документа Авансовый отчет:

Это табличное поле!! ВыданныеАвансы
=======================
НомерСтроки 1
ДокументАванса Расходный кассовый ордер ТК000000004 от 15.02.2007 19:24:03
СуммаДокументаАванса 300
ВалютаДокументаАванса USD
Выдано 300
Сумма 174

Такое двойное сканирование удобно использовать для быстрой проверки того, что все колонки таб части формы имеют связь с реквизитами таб части объекта. Если такой связи у какой-либо колонки нет, система сгенерирует ошибку.

Пользователь не должен видеть этот реквизит

Предположим, что заказчик поставил перед разработчиком задачу разграничения доступа на некоторый реквизит документа. В нашем примере это будет реквизит «Комментарий» в документе «Тестовый документ». У задачи множество вариантов реализации. В статье рассмотрим вариант с использованием механизма разграничения прав на реквизиты с использованием ролей. Данная возможность появилась в платформе 1С:Предприятие 8.2.

Настраиваем роль

Итак, приступим. В тестовой конфигурации создадим наш «Тестовый документ» с несколькими реквизитами и три роли (см. следующий скриншот).

Обратите внимание на роли «ДоступКомментарий» и «БезДоступаККомментарию». Обе роли имеют доступ к документу «Тестовый документ». Различие между ним лишь в настройке права доступа к реквизиту «Комментарий». На следующем скриншоте представлено различие между ними.

Для дальнейшего тестирования создадим двух пользователей. Имена назначим в соответствии с присвоенными ролями: «Доступ к комментарию» и «Без доступа к комментарию». Теперь мы можем перейте к тестированию в режиме 1С:Предприятия.

Тестируем

Запустим программу в режиме 1С:Предприятие под пользователем «Без доступа к комментарию». Откроем документ и увидим результат наших действий:

Как мы видим, реквизит «Комментарий» не отображается как в форме документа, так и в форме списка. Теперь запустим программу от имени пользователя «Доступ к комментарию». Тогда мы получим следующий результат:

Теперь реквизит «Комментарий» доступен во всех открытых формах. В принципе, механизм работает.

Данная настройка действует на все формы, открываемые в режиме предприятия. Но у механизма разграничения прав по реквизитам есть некоторые нюансы работы, о которых стоит упомянуть.

Подводный камень

Настраивать права для отдельных реквизитов очень удобно, но на самом деле этот механизм трудно отнести к настрокам прав доступа. И вот почему:

1) Если мы попытаемся выполнить запрос к реквизиту, доступ к которому ограничен, мы все равно получим его значение без каких-либо ошибок/предупреждений платформы.

2) При формировании SQL-запросов к базе данных в клиент-серверном варианте работы, платформа не учитывает настройки доступа на уровне реквизитов.

На следующем скриншоте представлен текст SQL-запроса, формируемый платформой при открытии документа при обоих вариантах настройки доступа к полю «Комментарий».

Как мы видим, в запросе присутствует выборка поля «_Fld17», в которм присутствует значение комментария.

3) Механизм разграничения прав на уровне реквизитов работает только для управляемых форм.

Если открыть обычную форму в управляемом или обычном приложении, то настройка прав в ролях на реквизиты объектов не будет действовать.

Как мы видим из примера выше, обычная форма, открытая в управляемом режиме, не учитывает права доступа на отдельные реквизиты.

Подведем итог

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

Наиболее правильными механизмами для разраничения прав доступа на объекты конфигурации — это настрока прав на отдельные объекты в ролях и механизм RLS .

Понравилась статья? Поделить с друзьями:
  • 1с управляемые формы в обработке к реквизиту формы
  • 1с управляемые формы как получить реквизит с формы
  • 200 часов исправительных работ это сколько по дням
  • 2000 уфнс россии по чеченской республике реквизиты
  • 21 век интернет магазин в новополоцке время работы