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