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