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