Как перезаполнить регистр «Строковые сведения физических лиц» в 1С:ЗУП 3.1

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

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

Выясним причину: почему данные не попадают в отчеты

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

Основные причины «пустоты» регистра:

  1. Перенос данных: При переходе с версии ЗУП 2.5 на 3.1 данные справочников переносятся, но механизмы формирования строк кэша могут не сработать для всех записей сразу.
  2. Групповое изменение реквизитов: Использование стандартной обработки «Групповое изменение реквизитов» часто меняет данные непосредственно в справочнике, не инициируя события, которые должны обновить строковые сведения.
  3. Ошибки обмена: При синхронизации данных из других систем записи в регистр кэша могут не создаваться автоматически.

Как отмечают участники обсуждения, простое перепроведение документов или перезапись карточки сотрудника обычно не помогают, так как обновление регистра завязано на специфические процедуры в модулях менеджера. Рассмотрим способы автоматизации этого процесса.

Разберем стандартные методы обновления данных

Для решения задачи нам не нужно изобретать новые алгоритмы формирования строк. В конфигурации уже заложены необходимые функции. Самый правильный путь — обратиться к методам модуля менеджера самого регистра сведений СтроковыеСведенияФизическихЛиц.

Рассмотрим код, который позволяет обновить сведения по конкретному физическому лицу:


// Пример обновления данных по одному физлицу
РегистрыСведений.СтроковыеСведенияФизическихЛиц.ОбновитьСтроковыеСведенияФизическогоЛица(СсылкаНаФизЛицо);

Если нам необходимо обновить данные массово для всех сотрудников, мы можем воспользоваться внешней обработкой или «Консолью кода». Разберем пример цикла по справочнику ФизическиеЛица:


Выборка = Справочники.ФизическиеЛица.Выбрать();
Пока Выборка.Следующий() Цикл
    // Вызываем стандартный метод обновления регистра
    РегистрыСведений.СтроковыеСведенияФизическихЛиц.ОбновитьСтроковыеСведенияФизическогоЛица(Выборка.Ссылка);
КонецЦикла;

В этом случае система сама проанализирует данные об образовании, составе семьи и ученых степенях, после чего сформирует актуальные строки и запишет их в регистр.

Рассмотрим использование общего модуля КадровыйУчет

Существует еще более универсальный метод, который используется самой системой при интерактивном изменении данных. Он находится в общем модуле КадровыйУчет. Этот метод удобен тем, что он централизованно управляет обновлением всех вспомогательных данных физического лица.

Проанализируем пример вызова процедуры:

КадровыйУчет.ОбновитьСтроковыеСведенияФизическихЛиц(СсылкаНаФизическоеЛицо);

Если требуется обновить только конкретную информацию (например, только состав семьи для воинского учета), можно передать в процедуру массив имен разделов. Это позволит сэкономить время при работе с огромными базами данных:


РазделыДляОбновления = Новый Массив;
РазделыДляОбновления.Добавить("СоставСемьи");
// Обновляем только указанные сведения
КадровыйУчет.ОбновитьСтроковыеСведенияФизическихЛиц(СсылкаНаФизЛицо, РазделыДляОбновления);

Проанализируем ситуацию с фильтрацией данных для военкомата

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

Посмотрим на пример логики, которую можно использовать, если вы решите написать собственную обработку заполнения (на основе типового кода):


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	РодственникиФизическихЛиц.СтепеньРодства.Наименование КАК Родство,
    |	РодственникиФизическихЛиц.Наименование КАК ФИО,
    |	РодственникиФизическихЛиц.ДатаРождения КАК ДатаРождения
    |ИЗ
    |	Справочник.РодственникиФизическихЛиц КАК РодственникиФизическихЛиц
    |ГДЕ
    |	РодственникиФизическихЛиц.Владелец = &ФизическоеЛицо
    |	И РодственникиФизическихЛиц.ПометкаУдаления = ЛОЖЬ";

Запрос.УстановитьПараметр("ФизическоеЛицо", ФизЛицо);
Результат = Запрос.Выполнить().Выбрать();

СтрокаРезультат = "";
Пока Результат.Следующий() Цикл
    // Здесь можно добавить свою фильтрацию, например по возрасту
    СтрокаРезультат = СтрокаРезультат + Результат.Родство + ": " + Результат.ФИО + " " + Формат(Результат.ДатаРождения, "ДЛФ=D") + "; ";
КонецЦикла;

Однако мы рекомендуем использовать типовой метод ОбновитьСтроковыеСведенияФизическогоЛица, так как он гарантирует совместимость с будущими обновлениями конфигурации и корректное заполнение всех кадровых отчетов.

Алгоритм действий для исправления данных

Чтобы окончательно решить проблему с пустым регистром, выполним следующие шаги:

  1. Создадим резервную копию базы данных. Любые массовые изменения данных в 1С требуют предварительного бэкапа.
  2. Воспользуемся внешней обработкой «Групповой запуск кода» или создадим простую обработку с одной кнопкой.
  3. В обработчик нажатия кнопки вставим код цикла по всем физическим лицам, вызывающий ОбновитьСтроковыеСведенияФизическогоЛица.
  4. Если база большая (более 5000 сотрудников), рекомендуем выполнять обновление порциями или в нерабочее время, так как процедура формирования строк может быть ресурсоемкой.
  5. После завершения работы кода сформируем отчет «Список граждан для сверки с военкоматом» и проверим заполнение колонки Семейное положение.

Таким образом, мы выяснили, что регистр СтроковыеСведенияФизическихЛиц является производным (кэширующим), и для его заполнения требуется вызов программных методов конфигурации. Использование типовых процедур обновления — это самый надежный и быстрый способ восстановить корректность кадрового учета после переноса данных или некорректных групповых правок.

← На главную