Почему в карточке сотрудника в 1С:ЗУП не отображаются даты начала и окончания отсутствий из списочных документов и как это исправить?

Программист 1С v8.3 (Управляемые формы)
← На главную

При работе в программе «1С:Зарплата и управление персоналом» редакции 3.1 пользователи часто сталкиваются с неочевидным поведением интерфейса. Рассмотрим типичную ситуацию: кадровый специалист вносит в систему сведения об отсутствии сотрудников. Если документ оформляется индивидуально на каждого человека (через классический документ Отсутствие (болезнь, прогул, неявка)), то в карточке сотрудника в разделе «Отсутствия» даты начала и окончания периода отображаются корректно.

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

В чем причина такого поведения программы?

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

  1. Разница в структуре хранения реквизитов. В индивидуальном документе Отсутствие даты начала и окончания периода являются реквизитами шапки (это системные поля ДатаНачала и ДатаОкончания). Они уникальны для всего документа. В списочном же документе Отсутствие на список сотрудников общих дат в шапке нет, так как у каждого сотрудника в списке может быть свой собственный период неявки. Соответственно, эти даты хранятся внутри табличной части документа (колонки ДатаНачала и ДатаОкончания табличной части Сотрудники).
  2. Ограничения динамического списка. Переходя в карточку сотрудника (Кадры — Сотрудники — Ссылка «Отсутствия»), мы видим форму, построенную на базе динамического списка. Этот список настроен на чтение данных из журналов документов или самих документов напрямую. Запрос динамического списка обращается к реквизитам шапки документов-регистраторов. Так как у списочного документа реквизиты дат в шапке отсутствуют, динамический список возвращает пустое значение (Null) для колонок старта и финиша отсутствия, хотя сам документ в списке отображается благодаря связи по сотруднику.

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

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

Вариант 1. Использование типового отчета «Отсутствия сотрудников»

Если перед вами стоит задача быстро получить актуальную информацию по периодам отсутствия сотрудников без внесения изменений в программный код, наиболее правильным решением будет использование специализированных кадровых отчетов. Дело в том, что отчеты в 1С:ЗУП считывают информацию не из шапок документов, а напрямую из регистров сведений, где данные всегда актуальны и детализированы.

Выполним следующие шаги:

  1. Перейдем в раздел Кадры и выберем пункт Кадровые отчеты.
  2. Найдем и откроем отчет Отсутствия сотрудников.
  3. В шапке отчета установим необходимый период и укажем конкретного сотрудника в поле отбора.
  4. Нажмем кнопку Сформировать.

Этот отчет обращается напрямую к регистру РегистрСведений.ДанныеСостоянийСотрудников. Он выведет точные даты начала и окончания отсутствия по каждому сотруднику, независимо от того, каким именно документом (одиночным или списочным) это отсутствие было зарегистрировано в системе. Этот способ является наиболее быстрым, безопасным и не требует привлечения программистов.

Вариант 2. Модификация динамического списка через расширение конфигурации

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

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

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

Ниже представлен пример текста запроса для динамического списка формы «Отсутствия» в карточке сотрудника:


ВЫБРАТЬ
	ДокументСсылка.Ссылка КАК Ссылка,
	ДокументСсылка.ВерсияДанных КАК ВерсияДанных,
	ДокументСсылка.ПометкаУдаления КАК ПометкаУдаления,
	ДокументСсылка.Номер КАК Номер,
	ДокументСсылка.Дата КАК Дата,
	ДокументСсылка.Проведен КАК Проведен,
	
	// Используем выбор: если есть индивидуальные даты в регистре состояний, берем их, 
	// иначе обращаемся к стандартным реквизитам шапки одиночного документа
	ВЫБОР
		КОГДА ДанныеСостояний.Начало ЕСТЬ НЕ NULL 
			ТОГДА ДанныеСостояний.Начало
		ИНАЧЕ ДокументСсылка.ДатаНачала
	КОНЕЦ КАК ДатаНачала,
	
	ВЫБОР
		КОГДА ДанныеСостояний.Окончание ЕСТЬ НЕ NULL 
			ТОГДА ДанныеСостояний.Окончание
		ИНАЧЕ ДокументСсылка.ДатаОкончания
	КОНЕЦ КАК ДатаОкончания,
	
	ДокументСсылка.ПричинаОтсутствия КАК ПричинаОтсутствия,
	ДокументСсылка.Сотрудник КАК Сотрудник
ИЗ
	ЖурналДокументов.УчетОтсутствий КАК ДокументСсылка
	
	// Подключаем левое соединение с регистром сведений по сотруднику и документу-основанию
	ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДанныеСостоянийСотрудников КАК ДанныеСостояний
		ПО ДокументСсылка.Ссылка = ДанныеСостояний.ДокументОснование
		И ДанныеСостояний.Сотрудник = &ОтборСотрудник

Разберем по шагам, что мы сделали в этом запросе:

  1. В качестве основного источника данных мы оставили журнал документов ЖурналДокументов.УчетОтсутствий.
  2. Добавили левое соединение (ЛЕВОЕ СОЕДИНЕНИЕ) с регистром РегистрСведений.ДанныеСостоянийСотрудников по двум ключевым полям: ссылка на документ (поле ДокументОснование) и конкретный сотрудник (поле Сотрудник, значение которого передается в параметры динамического списка при открытии формы из карточки сотрудника).
  3. В секции ВЫБОР...КОГДА...ТОГДА мы прописали логику получения дат. Если запись в регистре состояний найдена (для списочного документа), то система берет точные даты из полей Начало и Окончание регистра. Если записи нет (например, документ еще не проведен или это другой тип документа), система обращается к стандартным реквизитам шапки ДатаНачала и ДатаОкончания.

Для реализации этого в расширении вам потребуется выполнить следующие действия:

  1. Создать новое расширение конфигурации (или использовать существующее).
  2. Добавить в расширение форму списка отсутствий, которая вызывается из карточки сотрудника.
  3. В свойствах динамического списка формы включить флаг «Произвольный запрос» и заменить стандартный текст запроса на модифицированный.
  4. В модуле формы в обработчике события ПриСозданииНаСервере убедиться, что параметр &ОтборСотрудник корректно передается в настройки компоновки данных динамического списка.

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

← На главную