Как программно изменить ФИО физического лица в ЗУП 3.1 без вызова интерактивных форм

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

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

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

Причина возникновения ошибки и анализ ситуации

Рассмотрим типичную ошибку начинающего разработчика. При попытке получить форму объекта на сервере для выполнения действий, имитирующих работу пользователя, система выдает исключение. Проанализируем неудачный пример кода:


&НаСервере
Функция ПолучитьФизЛицо(Сотрудник)
    // Ошибка: ПолучитьФорму() нельзя вызывать на сервере
    Возврат Справочники.ФизическиеЛица.НайтиПоКоду(Сотрудник.Код).ПолучитьФорму("ФормаЭлемента");
КонецФункции

Проблема заключается в том, что ПолучитьФорму — это клиентский метод. Но даже если вызвать форму на клиенте, автоматизация процесса через "прокликивание" кнопок в коде является неэффективной и ненадежной. Правильный путь — использовать прямой программный интерфейс (API) конфигурации или прямую запись в объекты базы данных.

Решение 1: Прямая запись в регистр и справочник

ФИО в ЗУП 3.1 — это не просто строка в справочнике. Это исторические данные, которые хранятся в периодическом регистре сведений ФИОФизическихЛиц. Кроме того, для быстрого поиска и отображения в списках, ФИО дублируется в реквизитах справочника ФизическиеЛица.

Разберем пошагово, как реализовать изменение ФИО через прямую запись данных. Рассмотрим пример процедуры, которая выполняет эти действия на сервере:

Шаг 1. Запись в регистр сведений. Мы используем МенеджерЗаписи, так как регистр сведений ФИОФизическихЛиц является периодическим и подчиненным физическому лицу.


&НаСервере
Процедура ИзменитьДанныеВРегистре(ФизЛицоСсылка, Фамилия, Имя, Отчество, ДатаИзменения)
    
    МенеджерЗаписи = РегистрыСведений.ФИОФизическихЛиц.СоздатьМенеджерЗаписи();
    МенеджерЗаписи.ФизическоеЛицо = ФизЛицоСсылка;
    МенеджерЗаписи.Период = ДатаИзменения; // Важно: указываем дату, с которой действуют новые данные
    
    МенеджерЗаписи.Фамилия = Фамилия;
    МенеджерЗаписи.Имя = Имя;
    МенеджерЗаписи.Отчество = Отчество;
    
    // Записываем данные. Если запись на эту дату уже есть, она будет обновлена.
    МенеджерЗаписи.Записать();
    
КонецПроцедуры

Шаг 2. Обновление справочника Физические лица. Чтобы изменения отобразились в интерфейсе (в списках выбора, в полях поиска), необходимо обновить наименование элемента справочника и служебный реквизит ФИО.


&НаСервере
Процедура ОбновитьОбъектФизЛица(ФизЛицоСсылка, НовоеФИО)
    
    ОбъектФизЛицо = ФизЛицоСсылка.ПолучитьОбъект();
    // Наименование справочника обычно строится как Фамилия Имя Отчество
    ОбъектФизЛицо.Наименование = НовоеФИО;
    // В ЗУП 3.1 есть реквизит ФИО, который используется для поиска
    ОбъектФизЛицо.ФИО = НовоеФИО;
    
    ОбъектФизЛицо.Записать();
    
КонецПроцедуры

Решение 2: Использование типового API (Рекомендуется)

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

Проанализируем преимущества использования типовых методов:

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

Важные нюансы: что часто забывают разработчики

Просто изменить ФИО в одном месте недостаточно для корректной работы ЗУП. Рассмотрим критические моменты, которые необходимо учесть:

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

2. Представления сотрудников. В справочнике Сотрудники есть реквизиты, отвечающие за публичное представление. Чтобы данные обновились везде, после записи физлица стоит вызвать процедуру обновления представлений:

Сотрудники.ОбновитьПредставленияСотрудниковФизическогоЛица(ФизЛицоСсылка);

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

Итоговый пример кода для массовой обработки

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


Процедура ВыполнитьИзменениеФИО()
    
    Для Каждого СтрокаДанных Из ТаблицаНовыхДанных Цикл
        
        // 1. Получаем ссылку на физлицо
        ФизЛицоСсылка = СтрокаДанных.ФизическоеЛицо;
        НовоеФИО = СтрокаДанных.Фамилия + " " + СтрокаДанных.Имя + " " + СтрокаДанных.Отчество;
        
        // 2. Записываем историю ФИО в регистр
        ИзменитьДанныеВРегистре(ФизЛицоСсылка, СтрокаДанных.Фамилия, СтрокаДанных.Имя, СтрокаДанных.Отчество, СтрокаДанных.Дата);
        
        // 3. Обновляем основной справочник
        ОбновитьОбъектФизЛица(ФизЛицоСсылка, НовоеФИО);
        
        // 4. Синхронизируем представления сотрудников
        Сотрудники.ОбновитьПредставленияСотрудниковФизическогоЛица(ФизЛицоСсылка);
        
    КонецЦикла;
    
КонецПроцедуры

Таким образом, мы выяснили, что для успешного изменения ФИО в ЗУП 3.1 необходимо работать напрямую с данными на сервере, избегая обращения к формам. Это гарантирует отсутствие ошибок типа «Интерактивные операции недоступны» и обеспечивает корректное отображение данных во всех кадровых отчетах и документах.

← На главную