Добавляем обработчик события для дополнительного реквизита 1С
Ранее мы добавили свой дополнительный реквизит «СНИЛС» для внутреннего документа и сделали закладку с дополнительными реквизитами первой на форме.
Пришло время улучшить юзабилити нашего реквизита. Как известно СНИЛС имеет определённый формат ввода. Кроме того, он содержит контрольное число в виде двух последних цифр для проверки корректности его ввода. Учитывая это, будет хорошим тоном по отношению к пользователям, если мы поможем ему корректно указать СНИЛС для сотрудника, а в случае ошибки предупредить его об этом.
Делаем маску ввода для дополнительного реквизита
Номер СНИЛС представляет собой строку следующего формата «XXX-XXX-XXX XX», где Х это цифра от 0 до 9. Последняя группа символов XX представляет собой контрольное число. К сожалению типовой механизм не позволяет задать маску ввода для дополнительных реквизитов. Поэтому внесем изменения в программный код. Создание полей на форме для дополнительных реквизитов происходит динамически при создании формы на сервере, либо при изменении некоторых реквизитов в уже открытой форме. Первичный вызов процедуры создания дополнительных реквизитов выглядит так:
1 2 3 4 5 6 |
&НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) ... УправлениеСвойствами.ПриСозданииНаСервере(ЭтаФорма, ДополнительныеПараметры); ... КонецПроцедуры |
Само создание полей формы происходит в процедуре
1 |
УправлениеСвойствами.ЗаполнитьДополнительныеРеквизитыВФорме() |
Откроем общий модуль УправлениеСвойствами и найдем там эту процедуру. Внесем туда изменения — добавим в конце вызов своей процедуры:
1 2 3 4 5 |
Процедура ЗаполнитьДополнительныеРеквизитыВФорме(Форма, Объект = Неопределено, ПоляНадписей = Ложь, СкрытьУдаленные = Неопределено) Экспорт ... маг_РаботаСДокументами.ЗаполнитьДополнительныеРеквизитыВФорме(Форма, ОписаниеОбъекта, ПоляНадписей) ; ... КонецПроцедуры |
Теперь в общий модуль маг_РаботаСДокументами добавим саму реализацию этой процедуры:
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,Остаток); Если Остаток<>КонтрольноеЧисло Тогда Результат = Ложь; КонецЕсли; Иначе Результат = Ложь; КонецЕсли; Возврат Результат; КонецФункции |
Помните, мы программно назначили обработчик на поле дополнительного реквизита. Теперь добавим саму процедуру для обработчика ПриИзменении в модуль формы элемента справочника «ВнтуренниеДокументы»:
1 2 3 4 5 6 7 8 |
&НаКлиенте Процедура маг_СНИЛСПриИзменении(Элемент) Если НЕ маг_РаботаСДокументами.СтраховойНомерПФРСоответствуетТребованиям(Элемент.ТекстРедактирования) тогда ПоказатьПредупреждение(,"СНИЛС указан неверно!!!"); КонецЕсли; КонецПроцедуры |
Теперь, если пользователь ошибется при вводе СНИЛСа, то система предупредит его и выдаст сообщение о некорректном значении:
Итоги
После небольших изменений в программе, поведение нашего дополнительного реквизита стало более дружелюбным к пользователю. Теперь при заполнении поля СНИЛСа легче визуально контролировать его правильность за счет маски ввода. Кроме того, даже если если пользователь ошибется при вводе, программа предупредит его об этом.
Еще можно посмотреть
Похожие записи
- Ошибка в типовой интеграция 1С:ЗУП с 1С:Документооборот
- Пропажа индексов дескрипторов в 1С:Документообороте
- Хранилище вариантов отчета 1С для внешнего отчета
- Делаем свою автоподстановку в 1С Документообороте
- Вывод дополнительных реквизитов в несколько колонок
- Зачем нужны Дополнительные реквизиты 1С
- Расположение дополнительных реквизитов на форме