Вывод номера и даты трудового договора в карточку сотрудника в 1С:ЗУП
В карточке сотрудника 1С:ЗУП видны табельный номер, должность и даты приёма, а номера и даты трудового договора нет. Эти сведения лежат в кадровых документах и в регистре, но на форму справочника «Сотрудники» не выведены.
Вывод номера и даты трудового договора в карточку сотрудника делают расширением. Типовую конфигурацию менять не нужно, обновление ЗУП из-за этого поля не ломается.
На форме появляется строка Договор № и от. Поля только для просмотра. В них попадает последний записанный договор сотрудника: из приёма на работу, кадрового перевода или продления договора.
Где ЗУП хранит номер и дату договора
Номер и дата пишутся в регистр сведений Основные данные контракта, договора сотрудника:
НомерДоговораКонтрактаДатаДоговораКонтракта
Измерение регистра — Сотрудник. Записи подчинены регистратору, поэтому в карточке берут последнюю по периоду. Так на экран попадает действующий договор, а не номер из самого первого приказа, если его потом меняли.
Расширение и форма карточки
- Создайте расширение. Назначение — адаптация. Задайте префикс, в примере это
ТД. - Заимствуйте справочник Сотрудники и его форму элемента.
- В событиях формы у
ПриСозданииНаСервереиПриОткрытииукажите вызов После и свои процедуры.
Главный реквизит этой формы называется Сотрудник, не Объект. Запрос по Объект.Ссылка не скомпилируется.
Поля создают в ПриСозданииНаСервере. Позже состав реквизитов формы менять нельзя. Ставят их в группу КомандыФИО, под табельным номером: эта группа видна сразу при открытии карточки.
&НаСервере
Процедура ТД_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
ТД_ДобавитьПоляТрудовогоДоговора();
КонецПроцедуры
&НаСервере
Процедура ТД_ДобавитьПоляТрудовогоДоговора()
Родитель = Элементы.КомандыФИО;
Если Элементы.Найти("ТД_ТрудовойДоговор") <> Неопределено Тогда
Возврат;
КонецЕсли;
ДобавляемыеРеквизиты = Новый Массив;
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(
"ТД_НомерТрудовогоДоговора",
Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(25, ДопустимаяДлина.Переменная)),
,
"Номер трудового договора"));
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(
"ТД_ДатаТрудовогоДоговора",
Новый ОписаниеТипов("Дата", , , Новый КвалификаторыДаты(ЧастиДаты.Дата)),
,
"Дата трудового договора"));
ИзменитьРеквизиты(ДобавляемыеРеквизиты);
Группа = Элементы.Добавить("ТД_ТрудовойДоговор", Тип("ГруппаФормы"), Родитель);
Группа.Вид = ВидГруппыФормы.ОбычнаяГруппа;
Группа.Группировка = ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяВсегда;
Группа.ОтображатьЗаголовок = Ложь;
Группа.Отображение = ОтображениеОбычнойГруппы.Нет;
ПолеНомер = Элементы.Добавить("ТД_НомерТрудовогоДоговора", Тип("ПолеФормы"), Группа);
ПолеНомер.Вид = ВидПоляФормы.ПолеВвода;
ПолеНомер.ПутьКДанным = "ТД_НомерТрудовогоДоговора";
ПолеНомер.Заголовок = "Договор №";
ПолеНомер.ТолькоПросмотр = Истина;
ПолеНомер.Ширина = 12;
ПолеНомер.РастягиватьПоГоризонтали = Ложь;
ПолеДата = Элементы.Добавить("ТД_ДатаТрудовогоДоговора", Тип("ПолеФормы"), Группа);
ПолеДата.Вид = ВидПоляФормы.ПолеВвода;
ПолеДата.ПутьКДанным = "ТД_ДатаТрудовогоДоговора";
ПолеДата.Заголовок = "от";
ПолеДата.ТолькоПросмотр = Истина;
ПолеДата.Ширина = 8;
ПолеДата.РастягиватьПоГоризонтали = Ложь;
Элементы.Переместить(Группа, Родитель, Элементы.ИзменитьФИО);
КонецПроцедуры
Реквизиты созданы кодом, поэтому присваивать ТД_НомерТрудовогоДоговора = ... нельзя. Пишите ЭтотОбъект["ТД_НомерТрудовогоДоговора"].
Заполнение номера и даты при открытии карточки
Процедуру заполнения вызывают из ПриОткрытии, тоже с типом вызова После. Пока сотрудник не записан, ссылки нет и запрос не выполняют.
&НаСервере
Процедура ТД_ЗаполнитьНомерИДатуТрудовогоДоговора()
ЭтотОбъект["ТД_НомерТрудовогоДоговора"] = "";
ЭтотОбъект["ТД_ДатаТрудовогоДоговора"] = '00010101';
Если Не ЗначениеЗаполнено(Сотрудник.Ссылка) Тогда
Возврат;
КонецЕсли;
Если Не ПравоДоступа("Чтение", Метаданные.РегистрыСведений.ОсновныеДанныеКонтрактаДоговораСотрудника) Тогда
Возврат;
КонецЕсли;
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Сотрудник", Сотрудник.Ссылка);
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| ДанныеДоговора.НомерДоговораКонтракта КАК НомерДоговораКонтракта,
| ДанныеДоговора.ДатаДоговораКонтракта КАК ДатаДоговораКонтракта
|ИЗ
| РегистрСведений.ОсновныеДанныеКонтрактаДоговораСотрудника КАК ДанныеДоговора
|ГДЕ
| ДанныеДоговора.Сотрудник = &Сотрудник
|
|УПОРЯДОЧИТЬ ПО
| ДанныеДоговора.Период УБЫВ";
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
ЭтотОбъект["ТД_НомерТрудовогоДоговора"] = Выборка.НомерДоговораКонтракта;
ЭтотОбъект["ТД_ДатаТрудовогоДоговора"] = Выборка.ДатаДоговораКонтракта;
КонецЕсли;
КонецПроцедуры
Обновите конфигурацию базы и откройте карточку уже принятого сотрудника. Если номер в приёме заполнен, а поле пустое, проверьте, что регистр пересчитан: запись появляется при проведении приёма, перевода или продления договора.
Если строка не появилась
Процедура без подписки на событие формы не выполняется, и ошибка компиляции при этом не возникает. Проверьте, что ПриСозданииНаСервере вызывает вашу процедуру с типом После.
Пустые поля у нового, ещё не записанного сотрудника — нормальная ситуация. Договора в регистре ещё нет.