Как программно изменить ФИО сотрудника в 1С:ЗУП 3.1 с помощью внешней обработки

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

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

Анализируем архитектуру хранения ФИО в ЗУП 3.1

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

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

Таким образом, наша задача — обеспечить согласованное изменение данных во всех трех точках.

Выбираем стратегию: исправление ошибки или изменение фамилии

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

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

Вариант Б: Историческое изменение. Если мы хотим зафиксировать факт смены фамилии (например, при вступлении в брак), нам необходимо создать новую запись в регистре с новым значением Период. Это позволит системе формировать документы прошлым числом со старой фамилией, а новые — с актуальной.

Программная реализация изменения ФИО

Рассмотрим по шагам, как должна работать наша обработка. Выясним причину, по которой простого присвоения Объект.Фамилия = "Новая" недостаточно. Для корректной работы нам потребуется задействовать типовые механизмы конфигурации.

Сначала подготовим данные для справочника ФизическиеЛица. Посмотрим на пример кода, который обновляет данные в справочнике и регистре одновременно:


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

// 1. Устанавливаем реквизиты в объекте справочника
ФизЛицоОбъект.Фамилия = НоваяФамилия;
ФизЛицоОбъект.Имя = НовоеИмя;
ФизЛицоОбъект.Отчество = НовоеОтчество;

// Формируем наименование с помощью типового метода
ФизЛицоОбъект.Наименование = ФизическиеЛицаКлиентСервер.СформироватьФИО(НоваяФамилия, НовоеИмя, НовоеОтчество);

// Устанавливаем режим загрузки, чтобы обойти лишние проверки, если это необходимо
ФизЛицоОбъект.ОбменДанными.Загрузка = Истина;
ФизЛицоОбъект.Записать();

Однако записи только в справочник недостаточно. Нам нужно обновить регистр сведений. Проанализируем фрагмент кода, использующий типовую процедуру РедактированиеПериодическихСведений:


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

Менеджер.Фамилия = НоваяФамилия;
Менеджер.Имя = НовоеИмя;
Менеджер.Отчество = НовоеОтчество;
Менеджер.Записать();

Синхронизация данных со справочником «Сотрудники»

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

Рассмотрим, как обновить наименования всех связанных сотрудников одной командой:


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

НоваяСтрока = ТаблицаФизЛиц.Добавить();
НоваяСтрока.ФизическоеЛицо = ФизЛицоСсылка;

// Вызов типового метода для массового обновления сотрудников
ЗарплатаКадры.ОбновитьНаименованияФизЛицаИСотрудника(ТаблицаФизЛиц);

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

Важные технические нюансы

При написании внешней обработки обратите внимание на следующие моменты:

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

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

← На главную