Как программно заполнить адрес электронной почты физического лица в 1С:ЗУП 2.5?

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

При разработке интеграций, загрузке данных из внешних систем или написании групповых обработок в конфигурации «Зарплата и Управление Персоналом, редакция 2.5» часто возникает задача программного заполнения контактной информации. Самой популярной операцией является внесение адреса электронной почты (e-mail) сотрудников.

Однако начинающие разработчики часто сталкиваются с ситуацией, когда код выполняется без ошибок, запись в базе данных вроде бы появляется, но при открытии карточки сотрудника или физического лица поле электронного адреса остаётся пустым. Давайте подробно разберем, почему так происходит, проанализируем архитектурные особенности хранения контактной информации в ЗУП 2.5 и рассмотрим правильные варианты решения этой задачи.

Выясняем причины: почему программно записанный адрес не отображается?

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

  1. Перепутан объект-владелец контактной информации. В ЗУП 2.5 контактная информация (адреса, телефоны, e-mail) привязывается исключительно к физическим лицам (справочник ФизическиеЛица), а не к сотрудникам (справочник СотрудникиОрганизаций). Если в поле Объект регистра сведений передать ссылку на сотрудника, система запишет ее, но стандартные формы карточки физлица или сотрудника эту информацию не прочитают.
  2. Неверно выбран Вид контактной информации. Автор вопроса использовал вид Справочники.ВидыКонтактнойИнформации.СлужебныйАдресЭлектроннойПочтыПользователя. Этот вид КИ предназначен исключительно для справочника Пользователи. Для физических лиц в системе предопределен другой вид — EMailФизическиеЛица. При открытии карточки физлица система делает жесткий отбор по "своим" видам контактной информации, игнорируя чужие записи.

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

Способ 1. Использование Менеджера записи регистра (Прямая запись)

Этот способ отлично подходит, когда нам нужно быстро обновить или записать одну конкретную запись в регистр сведений КонтактнаяИнформация. Мы используем объект РегистрСведенийМенеджерЗаписи, который позволяет работать с отдельной строкой регистра по ключевым измерениям.

Разберем готовый пример кода:


// Предположим, у нас есть переменная "СотрудникСсылка", указывающая на элемент справочника СотрудникиОрганизаций
// Шаг 1. Получаем ссылку на Физическое лицо, так как КИ хранится в разрезе физлиц
ФизЛицоСсылка = СотрудникСсылка.Физлицо;

Если ЗначениеЗаполнено(ФизЛицоСсылка) Тогда

    // Шаг 2. Создаем менеджер записи для регистра КонтактнаяИнформация
    МенеджерЗаписи = РегистрыСведений.ContactИнформация.СоздатьМенеджерЗаписи();
    
    // Шаг 3. Заполняем ключевые измерения (отборы)
    МенеджерЗаписи.Объект = ФизЛицоСсылка;
    МенеджерЗаписи.Тип   = Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты;
    МенеджерЗаписи.Вид   = Справочники.ВидыКонтактнойИнформации.EMailФизическиеЛица; // Используем правильный вид КИ!
    
    // Шаг 4. Заполняем ресурсы записи
    МенеджерЗаписи.Представление = "work_email@company.ru";
    
    // Шаг 5. Записываем данные с замещением существующей записи
    Попытка
        МенеджерЗаписи.Записать(Истина);
        Сообщить("Электронный адрес успешно сохранен для физлица: " + ФизЛицоСсылка);
    Исключение
        ВызватьИсключение "Не удалось записать контактную информацию: " + ОписаниеОшибки();
    КонецПопытки;

КонецЕсли;

Параметр Истина в методе Записать() указывает системе на необходимость перезаписать существующую информацию, если для данного физического лица с типом КИ "Адрес электронной почты" и видом "E-mail физ. лица" в базе уже была запись. Это предотвращает возникновение ошибки дублирования ключевых полей.

Способ 2. Запись через Набор записей

Если вам необходимо работать с группой записей или вы предпочитаете классический метод работы с регистрами сведений через отборы, рассмотрим, как переписать исходный код с использованием объекта РегистрСведенийНаборЗаписей.

Проанализируем правильную последовательность действий:


ФизЛицоСсылка = СотрудникСсылка.Физлицо;

Если ЗначениеЗаполнено(ФизЛицоСсылка) Тогда

    // Создаем набор записей
    НаборЗаписей = РегистрыСведений.КонтактнаяИнформация.СоздатьНаборЗаписей();
    
    // Устанавливаем жесткие отборы по измерениям регистра
    НаборЗаписей.Отбор.Объект.Установить(ФизЛицоСсылка);
    НаборЗаписей.Отбор.Тип.Установить(Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты);
    НаборЗаписей.Отбор.Вид.Установить(Справочники.ВидыКонтактнойИнформации.EMailФизическиеЛица);
    
    // Создаем новую запись в наборе
    НоваяЗапись = НаборЗаписей.Добавить();
    НоваяЗапись.Объект = ФизЛицоСсылка;
    НоваяЗапись.Тип    = Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты;
    НоваяЗапись.Вид    = Справочники.ВидыКонтактнойИнформации.EMailФизическиеЛица;
    НоваяЗапись.Представление = "personal_email@mail.ru";
    
    // Записываем набор (при этом старые записи, попавшие в отбор, будут заменены на новую)
    НаборЗаписей.Записать(Истина);

КонецЕсли;

Этот способ гарантирует, что у физического лица не появится "двойных" записей одного и того же вида контактной информации, что могло бы привести к путанице в отчетах или при отправке расчетных листков по почте.

Способ 3. Использование типового API (Рекомендуемый шаблон)

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

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


ФизЛицоСсылка = СотрудникСсылка.Физлицо;
АдресПочты    = "director@holding.ru";

// Вызываем стандартную экспортную процедуру из общего модуля
УправлениеКонтактнойИнформацией.ЗаписатьКонтактнуюИнформацию(
    ФизЛицоСсылка, 
    АдресПочты, 
    Справочники.ВидыКонтактнойИнформации.EMailФизическиеЛица, 
    Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты
);

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

Важная заметка для будущего перехода на ЗУП 3.1

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

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

Поэтому старые методы прямой записи в регистр в ЗУП 3.x работать не будут, и там запись КИ выполняется через работу с табличными частями объектов или обновленный программный интерфейс БСП.

← На главную