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