Где в 1С:ЗУП 3.1 хранятся личные данные сотрудников и как их правильно извлечь программно?

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

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

Разделение понятий «Сотрудник» и «Физическое лицо»

Прежде всего, проанализируем архитектуру системы и не забудем про согласие на обработку персональных данных. В ЗУП 3.1 реализовано четкое разделение:

  1. Справочник «Сотрудники» — это объект, отвечающий за трудовые отношения. Один и тот же человек может быть принят несколько раз или работать по совместительству. У него будет несколько элементов в этом справочнике (на их основании строится, например, график отпусков сотрудников) — для изменения условий этих отношений используется создание дополнительных соглашений к трудовым договорам в 1С:ЗУП.
  2. Справочник «Физические лица» — это «карточка человека». Все персональные данные (паспорт, ИНН, адрес) привязаны именно к Физическому лицу.
Поэтому, если нам нужно получить личные данные, мы всегда должны обращаться к данным Физического лица, даже если на входе у нас ссылка на Сотрудника.

Где лежат основные данные: справочники и регистры

Рассмотрим конкретные места хранения наиболее востребованной информации:

1. ИНН и СНИЛС
Эти данные хранятся непосредственно в реквизитах справочника ФизическиеЛица. К ним можно обратиться напрямую через точку от ссылки, но в запросе это будут поля ИНН и СтраховойНомерПФР.

2. Контактная информация (Адреса и телефоны)
Здесь всё немного сложнее. Информация хранится в табличной части КонтактнаяИнформация справочника ФизическиеЛица. Важный нюанс: поля адреса (город, улица, дом) не хранятся в отдельных колонках. Они упакованы в одну строку ЗначенияПолей в формате JSON или XML. Для работы с ними напрямую в запросе придется использовать фильтры по полю Вид (ссылка на справочник ВидыКонтактнойИнформации).

3. Документы, удостоверяющие личность
Для этих целей предназначен регистр сведений ДокументыФизическихЛиц. В некоторых компаниях даже внедряют ограничение проведения документа «Приём на работу» при их отсутствии (для оформления приема на работу пригодится автоматическое формирование трудового договора в 1С:ЗУП). Посмотрим на структуру этого регистра: он периодический, что позволяет хранить историю смены паспортов. Будьте осторожны при программной записи, чтобы не возникла ситуация, когда затираются паспортные данные в ЗУПе. Типичная ошибка: использовать СрезПоследних без фильтра по виду документа. Если у сотрудника введен и паспорт, и загранпаспорт, простой срез может вернуть вам данные последнего введенного документа, который не обязательно является основным удостоверением личности.

4. Прочие персональные сведения
Проанализируем другие важные регистры:

Профессиональный подход: использование программного интерфейса (API)

Как отмечалось в обсуждении, прямые запросы к регистрам в ЗУП 3.1 часто называют признаком плохого тона. Почему? Потому что структура регистров может меняться от релиза к релизу, а стандартные функции 1С (из состава БСП и Кадрового учета) остаются стабильными. К тому же, они учитывают права доступа (RLS) и логику выбора «главного» документа.

Метод 1: Функция КадровыйУчет.КадровыеДанныеСотрудников

Это самый универсальный и «правильный» способ. Рассмотрим, как он работает. Вы передаете массив сотрудников, список нужных полей и дату, на которую актуальны данные. Функция сама собирает данные из десятка таблиц.

Пример кода для получения данных:


СписокПолей = "ФизЛицо, ФизЛицо.ИНН, ФизЛицо.ДатаРождения, ДокументНомер, ДокументСерия, АдресРегистрации";
ТаблицаДанных = КадровыйУчет.КадровыеДанныеСотрудников(Истина, МассивСотрудников, СписокПолей, ТекущаяДата());

Для Каждого СтрокаДанных Из ТаблицаДанных Цикл
    Сообщить("Сотрудник: " + СтрокаДанных.ФизЛицо + ", ИНН: " + СтрокаДанных.ФизЛицоИНН);
КонецЦикла;

Преимущество этого метода в том, что вам не нужно знать, где лежит АдресРегистрации или как вычисляется основной паспорт. Система всё сделает за вас.

Метод 2: Получение документов через специализированную функцию

Если вам нужны именно данные документов, воспользуемся методом, проверенным годами (с 2014 года, как упоминалось на форуме):


ВидДокумента = Справочники.ВидыДокументовФизическихЛиц.ПаспортРФ;
ТаблицаДокументов = КадровыйУчет.ДокументыФизическихЛиц(ФизическоеЛицо, Истина, ВидДокумента);

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

Метод 3: Использование временных таблиц в сложных запросах

Выясним причину, по которой программисты иногда избегают функций модуля КадровыйУчет: кажется, что они медленные или их нельзя вставить в свой запрос. На самом деле, 1С предусмотрела метод КадровыйУчет.СоздатьВТКадровыеДанныеСотрудников.

Разберем по шагам, как это работает в сложном отчете:

  1. Вы создаете менеджер временных таблиц.
  2. Вызываете функцию, которая наполняет этот менеджер таблицей с кадровыми данными.
  3. В своем основном запросе вы просто соединяетесь с этой временной таблицей (обычно она называется ВТКадровыеДанныеСотрудников).
Это позволяет избежать выполнения запросов в цикле и гарантирует высокую производительность.

Разбор ситуации с «прямым» обращением к регистрам

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

Использование КадровыйУчет.КадровыеДанныеСотрудников — это страховка вашей разработки. Параметры этого метода не менялись более 9 лет, что делает ваш код «неубиваемым» при обновлениях конфигурации.

Нюансы контактной информации

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

УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъекта(ФизическоеЛицо)

Это вернет структуру или таблицу, с которой удобно работать, не мучаясь с парсингом строки вручную.

Итоги и рекомендации

Подводя итог нашему разбору, выделим основные правила работы с личными данными в ЗУП 3.1:

  1. Всегда помните о связи Сотрудник -> ФизЛицо. Личные данные всегда на ФизЛице.
  2. Забудьте про СрезПоследних к регистру документов, если не хотите получить «справку об освобождении» вместо паспорта. Пользуйтесь модулем КадровыйУчет.
  3. Используйте программный интерфейс. Поля АдресРегистрации, АдресПроживания, ФизЛицо.ИНН в параметрах функции КадровыеДанныеСотрудников избавят вас от написания сотен строк кода.
  4. Соблюдайте безопасность. Стандартные методы учитывают RLS. Прямые запросы могут поднять данные, к которым у пользователя не должно быть доступа, что чревато проблемами с безопасностью ПДн.

Таким образом, даже если вы считаете себя «программистом за 20 тысяч», использование профессиональных методов 1С сделает ваш код чище, надежнее и проще в поддержке, превращая его из «говнокода» в качественный продукт.

← На главную