Вывод номера и даты трудового договора в карточку сотрудника в 1С:ЗУП

В карточке сотрудника 1С:ЗУП видны табельный номер, должность и даты приёма, а номера и даты трудового договора нет. Эти сведения лежат в кадровых документах и в регистре, но на форму справочника «Сотрудники» не выведены.

Вывод номера и даты трудового договора в карточку сотрудника делают расширением. Типовую конфигурацию менять не нужно, обновление ЗУП из-за этого поля не ломается.

На форме появляется строка Договор № и от. Поля только для просмотра. В них попадает последний записанный договор сотрудника: из приёма на работу, кадрового перевода или продления договора.

Где ЗУП хранит номер и дату договора

Номер и дата пишутся в регистр сведений Основные данные контракта, договора сотрудника:

  • НомерДоговораКонтракта
  • ДатаДоговораКонтракта

Измерение регистра — Сотрудник. Записи подчинены регистратору, поэтому в карточке берут последнюю по периоду. Так на экран попадает действующий договор, а не номер из самого первого приказа, если его потом меняли.

Расширение и форма карточки

  1. Создайте расширение. Назначение — адаптация. Задайте префикс, в примере это ТД.
  2. Заимствуйте справочник Сотрудники и его форму элемента.
  3. В событиях формы у ПриСозданииНаСервере и ПриОткрытии укажите вызов После и свои процедуры.

Главный реквизит этой формы называется Сотрудник, не Объект. Запрос по Объект.Ссылка не скомпилируется.

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

&НаСервере
Процедура ТД_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)

    ТД_ДобавитьПоляТрудовогоДоговора();

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

&НаСервере
Процедура ТД_ДобавитьПоляТрудовогоДоговора()

    Родитель = Элементы.КомандыФИО;

    Если Элементы.Найти("ТД_ТрудовойДоговор") <> Неопределено Тогда
        Возврат;
    КонецЕсли;

    ДобавляемыеРеквизиты = Новый Массив;
    ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(
        "ТД_НомерТрудовогоДоговора",
        Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(25, ДопустимаяДлина.Переменная)),
        ,
        "Номер трудового договора"));
    ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(
        "ТД_ДатаТрудовогоДоговора",
        Новый ОписаниеТипов("Дата", , , Новый КвалификаторыДаты(ЧастиДаты.Дата)),
        ,
        "Дата трудового договора"));
    ИзменитьРеквизиты(ДобавляемыеРеквизиты);

    Группа = Элементы.Добавить("ТД_ТрудовойДоговор", Тип("ГруппаФормы"), Родитель);
    Группа.Вид = ВидГруппыФормы.ОбычнаяГруппа;
    Группа.Группировка = ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяВсегда;
    Группа.ОтображатьЗаголовок = Ложь;
    Группа.Отображение = ОтображениеОбычнойГруппы.Нет;

    ПолеНомер = Элементы.Добавить("ТД_НомерТрудовогоДоговора", Тип("ПолеФормы"), Группа);
    ПолеНомер.Вид = ВидПоляФормы.ПолеВвода;
    ПолеНомер.ПутьКДанным = "ТД_НомерТрудовогоДоговора";
    ПолеНомер.Заголовок = "Договор №";
    ПолеНомер.ТолькоПросмотр = Истина;
    ПолеНомер.Ширина = 12;
    ПолеНомер.РастягиватьПоГоризонтали = Ложь;

    ПолеДата = Элементы.Добавить("ТД_ДатаТрудовогоДоговора", Тип("ПолеФормы"), Группа);
    ПолеДата.Вид = ВидПоляФормы.ПолеВвода;
    ПолеДата.ПутьКДанным = "ТД_ДатаТрудовогоДоговора";
    ПолеДата.Заголовок = "от";
    ПолеДата.ТолькоПросмотр = Истина;
    ПолеДата.Ширина = 8;
    ПолеДата.РастягиватьПоГоризонтали = Ложь;

    Элементы.Переместить(Группа, Родитель, Элементы.ИзменитьФИО);

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

Реквизиты созданы кодом, поэтому присваивать ТД_НомерТрудовогоДоговора = ... нельзя. Пишите ЭтотОбъект["ТД_НомерТрудовогоДоговора"].

Заполнение номера и даты при открытии карточки

Процедуру заполнения вызывают из ПриОткрытии, тоже с типом вызова После. Пока сотрудник не записан, ссылки нет и запрос не выполняют.

&НаСервере
Процедура ТД_ЗаполнитьНомерИДатуТрудовогоДоговора()

    ЭтотОбъект["ТД_НомерТрудовогоДоговора"] = "";
    ЭтотОбъект["ТД_ДатаТрудовогоДоговора"] = '00010101';

    Если Не ЗначениеЗаполнено(Сотрудник.Ссылка) Тогда
        Возврат;
    КонецЕсли;

    Если Не ПравоДоступа("Чтение", Метаданные.РегистрыСведений.ОсновныеДанныеКонтрактаДоговораСотрудника) Тогда
        Возврат;
    КонецЕсли;

    Запрос = Новый Запрос;
    Запрос.УстановитьПараметр("Сотрудник", Сотрудник.Ссылка);
    Запрос.Текст =
    "ВЫБРАТЬ ПЕРВЫЕ 1
    |   ДанныеДоговора.НомерДоговораКонтракта КАК НомерДоговораКонтракта,
    |   ДанныеДоговора.ДатаДоговораКонтракта КАК ДатаДоговораКонтракта
    |ИЗ
    |   РегистрСведений.ОсновныеДанныеКонтрактаДоговораСотрудника КАК ДанныеДоговора
    |ГДЕ
    |   ДанныеДоговора.Сотрудник = &Сотрудник
    |
    |УПОРЯДОЧИТЬ ПО
    |   ДанныеДоговора.Период УБЫВ";

    Выборка = Запрос.Выполнить().Выбрать();
    Если Выборка.Следующий() Тогда
        ЭтотОбъект["ТД_НомерТрудовогоДоговора"] = Выборка.НомерДоговораКонтракта;
        ЭтотОбъект["ТД_ДатаТрудовогоДоговора"] = Выборка.ДатаДоговораКонтракта;
    КонецЕсли;

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

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

Если строка не появилась

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

Пустые поля у нового, ещё не записанного сотрудника — нормальная ситуация. Договора в регистре ещё нет.

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *