При разработке в конфигурации 1С:Зарплата и управление персоналом 3.1 (ЗУП) начинающие специалисты часто сталкиваются с трудностями при поиске личных данных. В отличие от старых версий или более простых конфигураций, здесь данные сильно деnormalized (распределены по разным таблицам) и имеют свою специфику хранения. Разберем подробно, где искать информацию и как достать ее так, чтобы ваш код считался профессиональным, а не «говнокодом».
Прежде всего, проанализируем архитектуру системы и не забудем про согласие на обработку персональных данных. В ЗУП 3.1 реализовано четкое разделение:
Физическому лицу.Физического лица, даже если на входе у нас ссылка на Сотрудника.
Рассмотрим конкретные места хранения наиболее востребованной информации:
1. ИНН и СНИЛС
Эти данные хранятся непосредственно в реквизитах справочника ФизическиеЛица. К ним можно обратиться напрямую через точку от ссылки, но в запросе это будут поля ИНН и СтраховойНомерПФР.
2. Контактная информация (Адреса и телефоны)
Здесь всё немного сложнее. Информация хранится в табличной части КонтактнаяИнформация справочника ФизическиеЛица.
Важный нюанс: поля адреса (город, улица, дом) не хранятся в отдельных колонках. Они упакованы в одну строку ЗначенияПолей в формате JSON или XML.
Для работы с ними напрямую в запросе придется использовать фильтры по полю Вид (ссылка на справочник ВидыКонтактнойИнформации).
3. Документы, удостоверяющие личность
Для этих целей предназначен регистр сведений ДокументыФизическихЛиц. В некоторых компаниях даже внедряют ограничение проведения документа «Приём на работу» при их отсутствии (для оформления приема на работу пригодится автоматическое формирование трудового договора в 1С:ЗУП).
Посмотрим на структуру этого регистра: он периодический, что позволяет хранить историю смены паспортов. Будьте осторожны при программной записи, чтобы не возникла ситуация, когда затираются паспортные данные в ЗУПе.
Типичная ошибка: использовать СрезПоследних без фильтра по виду документа. Если у сотрудника введен и паспорт, и загранпаспорт, простой срез может вернуть вам данные последнего введенного документа, который не обязательно является основным удостоверением личности.
4. Прочие персональные сведения
Проанализируем другие важные регистры:
ГражданствоФизическихЛиц.СведенияОбИнвалидностиФизическихЛиц.ВоинскийУчет.ОбразованиеФизическихЛиц.СоставСемьиФизическихЛиц.Как отмечалось в обсуждении, прямые запросы к регистрам в ЗУП 3.1 часто называют признаком плохого тона. Почему? Потому что структура регистров может меняться от релиза к релизу, а стандартные функции 1С (из состава БСП и Кадрового учета) остаются стабильными. К тому же, они учитывают права доступа (RLS) и логику выбора «главного» документа.
Это самый универсальный и «правильный» способ. Рассмотрим, как он работает. Вы передаете массив сотрудников, список нужных полей и дату, на которую актуальны данные. Функция сама собирает данные из десятка таблиц.
Пример кода для получения данных:
СписокПолей = "ФизЛицо, ФизЛицо.ИНН, ФизЛицо.ДатаРождения, ДокументНомер, ДокументСерия, АдресРегистрации";
ТаблицаДанных = КадровыйУчет.КадровыеДанныеСотрудников(Истина, МассивСотрудников, СписокПолей, ТекущаяДата());
Для Каждого СтрокаДанных Из ТаблицаДанных Цикл
Сообщить("Сотрудник: " + СтрокаДанных.ФизЛицо + ", ИНН: " + СтрокаДанных.ФизЛицоИНН);
КонецЦикла;
Преимущество этого метода в том, что вам не нужно знать, где лежит АдресРегистрации или как вычисляется основной паспорт. Система всё сделает за вас.
Если вам нужны именно данные документов, воспользуемся методом, проверенным годами (с 2014 года, как упоминалось на форуме):
ВидДокумента = Справочники.ВидыДокументовФизическихЛиц.ПаспортРФ;
ТаблицаДокументов = КадровыйУчет.ДокументыФизическихЛиц(ФизическоеЛицо, Истина, ВидДокумента);
Этот метод вернет только действующие на текущий момент документы указанного вида — это полезно, когда используется печать кадровых документов по шаблонам в 1С:ЗУП.
Выясним причину, по которой программисты иногда избегают функций модуля КадровыйУчет: кажется, что они медленные или их нельзя вставить в свой запрос. На самом деле, 1С предусмотрела метод КадровыйУчет.СоздатьВТКадровыеДанныеСотрудников.
Разберем по шагам, как это работает в сложном отчете:
ВТКадровыеДанныеСотрудников).Рассмотрим ситуацию, предложенную в сообщении №20: РегистрыСведений.ДокументыФизическихЛиц.СрезПоследних(...).
Несмотря на кажущуюся простоту, этот метод опасен.
Проанализируем почему:
СрезПоследних вернет только одну запись.КадровыйУчет.КадровыеДанныеСотрудников — это страховка вашей разработки. Параметры этого метода не менялись более 9 лет, что делает ваш код «неубиваемым» при обновлениях конфигурации.
Если вам всё же необходимо достать адрес без использования модуля КадровыйУчет (например, в специфической внешней обработке), помните про БСП. Для разбора того самого сложного поля ЗначенияПолей используйте функции:
УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъекта(ФизическоеЛицо)
Это вернет структуру или таблицу, с которой удобно работать, не мучаясь с парсингом строки вручную.
Подводя итог нашему разбору, выделим основные правила работы с личными данными в ЗУП 3.1:
КадровыйУчет.АдресРегистрации, АдресПроживания, ФизЛицо.ИНН в параметрах функции КадровыеДанныеСотрудников избавят вас от написания сотен строк кода.Таким образом, даже если вы считаете себя «программистом за 20 тысяч», использование профессиональных методов 1С сделает ваш код чище, надежнее и проще в поддержке, превращая его из «говнокода» в качественный продукт.