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