Почему программно добавленный e-mail физического лица не отображается на форме в 1С:ЗУП КОРП?

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

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

Как мы выяснили из обсуждения (особенно если выполняется загрузка физических лиц из Excel), стандартная процедура УправлениеКонтактнойИнформацией.ДобавитьКонтактнуюИнформацию() может быть недостаточной для полного отображения информации, поскольку система ожидает данные в определенном внутреннем формате и требует корректных настроек связанных элементов справочников. Мы рассмотрим несколько ключевых аспектов, влияющих на отображение контактной информации, и предложим комплексное решение.

1. Корректное заполнение полей табличной части "Контактная информация"

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

В системе 1С, основанной на Библиотеке Стандартных Подсистем (БСП), для каждого вида контактной информации (адрес, телефон, e-mail) существует свой тип. Если поле Тип в строке табличной части не заполнено или заполнено неверно, система не сможет корректно интерпретировать данные и, соответственно, отобразить их на форме. Рассмотрим пример кода, который демонстрирует правильное заполнение необходимых полей при программном добавлении электронной почты:


// Допустим, ОбъектФизЛица - это объект справочника ФизическиеЛица
// АдресЭлектроннойПочты - строка с e-mail

НоваяСтрокаКИ = ОбъектФизЛица.КонтактнаяИнформация.Добавить();
НоваяСтрокаКИ.Тип = Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты;
НоваяСтрокаКИ.Вид = Справочники.ВидыКонтактнойИнформации.Email; // Или другой вид e-mail, например, EmailФизическогоЛица
НоваяСтрокаКИ.Представление = АдресЭлектроннойПочты;
НоваяСтрокаКИ.Значение = АдресЭлектроннойПочты; // Часто поле "Значение" дублирует "Представление" для простых типов или содержит XML/JSON
НоваяСтрокаКИ.ДействуетС = ТекущаяДата();
// Дополнительные поля, если требуются по структуре контактной информации
// НоваяСтрокаКИ.НомерТелефона = ... // Для телефонов
// НоваяСтрокаКИ.Город = ... // Для адресов

ОбъектФизЛица.Записать();

Обратите внимание на явное указание поля Тип через перечисление Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты и поля Вид, которое ссылается на предопределенный или созданный нами элемент справочника ВидыКонтактнойИнформации. Поле Представление — это то, что увидит пользователь на форме, а Значение — это внутреннее представление данных, которое в простых случаях может совпадать с Представлением, но для более сложных видов контактной информации (например, адресов) может хранить структурированные данные (XML или JSON).

2. Настройки элемента справочника "Виды контактной информации"

Еще один критически важный аспект, который часто упускается из виду, — это настройки самого элемента справочника ВидыКонтактнойИнформации, который мы используем для добавляемого e-mail (например, элемент с наименованием "Email" или "EmailФизическогоЛица"). Даже если мы корректно заполнили табличную часть объекта, но вид контактной информации настроен неверно, данные не будут отображаться на форме.

Давайте проверим следующие реквизиты элемента Справочники.ВидыКонтактнойИнформации:

  1. Используется (булево): Этот реквизит должен быть установлен в Истина. Если он равен Ложь, данный вид контактной информации не будет отображаться нигде в системе.
  2. ВидРедактирования: Для свободных текстовых полей, таких как электронная почта, обычно должно быть установлено значение "ПолеВвода". Это определяет, как пользователь сможет вводить и редактировать данные на форме.
  3. ИмяГруппы: Этот реквизит указывает, к какой группе объектов относится данный вид контактной информации. Для физических лиц он должен быть установлен в "СправочникФизическиеЛица". Это позволяет системе отображать конкретный вид контактной информации только для соответствующих объектов.
  4. Тип (перечисление): Убедитесь, что здесь указан правильный тип контактной информации, например, "ЭлектроннаяПочта". Этот тип должен соответствовать тому, что мы устанавливаем в поле Тип табличной части объекта (Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты).

Мы можем проверить и, при необходимости, программно установить эти реквизиты для элемента ВидыКонтактнойИнформации. Например, если мы создаем новый вид контактной информации или хотим убедиться в его корректности:


ВидКИ_Email = Справочники.ВидыКонтактнойИнформации.НайтиПоНаименованию("Email");
Если ВидКИ_Email = Неопределено Тогда
    // Если такого вида нет, можно создать его
    // Или использовать существующий, например, "Email"
    Сообщить("Вид контактной информации 'Email' не найден. Убедитесь в его наличии.");
Иначе
    // Откроем объект для редактирования
    ОбъектВидаКИ = ВидКИ_Email.ПолучитьОбъект();
    
    // Проверяем и устанавливаем ключевые реквизиты
    Если Не ОбъектВидаКИ.Используется Тогда
        ОбъектВидаКИ.Используется = Истина;
        Сообщить("Установлен реквизит 'Используется' для вида контактной информации 'Email'.");
    КонецЕсли;
    
    Если ОбъектВидаКИ.ВидРедактирования <> Перечисления.ВидыРедактированияКонтактнойИнформации.ПолеВвода Тогда
        ОбъектВидаКИ.ВидРедактирования = Перечисления.ВидыРедактированияКонтактнойИнформации.ПолеВвода;
        Сообщить("Установлен реквизит 'ВидРедактирования' = 'ПолеВвода' для вида контактной информации 'Email'.");
    КонецЕсли;
    
    Если ОбъектВидаКИ.ИмяГруппы <> "СправочникФизическиеЛица" Тогда
        ОбъектВидаКИ.ИмяГруппы = "СправочникФизическиеЛица";
        Сообщить("Установлен реквизит 'ИмяГруппы' = 'СправочникФизическиеЛица' для вида контактной информации 'Email'.");
    КонецЕсли;

    Если ОбъектВидаКИ.Тип <> Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты Тогда
        ОбъектВидаКИ.Тип = Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты;
        Сообщить("Установлен реквизит 'Тип' = 'АдресЭлектроннойПочты' для вида контактной информации 'Email'.");
    КонецЕсли;
    
    // Записываем изменения
    Если ОбъектВидаКИ.Модифицирован() Тогда
        Попытка
            ОбъектВидаКИ.Записать();
        Исключение
            Сообщить("Ошибка при записи вида контактной информации 'Email': " + ОписаниеОшибки());
        КонецПопытки;
    КонецЕсли;
КонецЕсли;

3. Использование стандартных процедур БСП для работы с контактной информацией

Система 1С:Предприятие с БСП предлагает специализированные экспортные процедуры в общем модуле УправлениеКонтактнойИнформацией, которые предназначены для корректной работы с контактной информацией. Использование этих процедур помогает нам избежать многих ошибок, связанных с внутренними механизмами хранения и отображения данных.

Изначально мы использовали процедуру УправлениеКонтактнойИнформацией.ДобавитьКонтактнуюИнформацию(). Хотя она и предназначена для добавления информации, мы видим, что она может не учитывать все нюансы отображения на форме. Более гибким и надежным является подход через процедуру УправлениеКонтактнойИнформацией.УстановитьКонтактнуюИнформациюОбъектов().

Давайте рассмотрим, как мы можем использовать этот подход:

  1. Формирование таблицы значений контактной информации: Сначала нам нужно сформировать таблицу значений, которая будет содержать все необходимые поля для каждой записи контактной информации. Для этого мы можем использовать функцию УправлениеКонтактнойИнформацией.НоваяКонтактнаяИнформация(), которая возвращает готовую структуру таблицы значений с нужными колонками.
  2. Заполнение таблицы значений: Мы заполняем эту таблицу, указывая Тип, Вид, Представление, Значение и другие поля для нашего e-mail.
  3. Запись информации: Передаем эту таблицу значений в процедуру УправлениеКонтактнойИнформацией.УстановитьКонтактнуюИнформациюОбъектов(). Эта процедура позаботится о правильном сохранении данных, в том числе и об их внутреннем XML/JSON представлении в поле Значение, если это необходимо.

Пример кода с использованием УстановитьКонтактнуюИнформациюОбъектов():


// Допустим, ФизЛицоСсылка - это ссылка на физическое лицо
// АдресЭлектроннойПочты - строка с e-mail

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

// 2. Создаем новую таблицу для контактной информации или добавляем в существующую
// Если нужно полностью заменить, можно начать с новой:
// ТаблицаКИ = УправлениеКонтактнойИнформацией.НоваяКонтактнаяИнформация();
// Или добавить к существующей, если не нужно замещать все
ТаблицаКИ = КонтактнаяИнформацияОбъекта; 

// 3. Добавляем новую строку с e-mail
НоваяСтрока = ТаблицаКИ.Добавить();
НоваяСтрока.Владелец                  = ФизЛицоСсылка;
НоваяСтрока.Тип                       = Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты;
НоваяСтрока.Вид                       = Справочники.ВидыКонтактнойИнформации.Email; // Или Ваш конкретный вид
НоваяСтрока.Представление             = АдресЭлектроннойПочты;
НоваяСтрока.Значение                  = АдресЭлектроннойПочты; // Для простых типов часто совпадает
НоваяСтрока.ДействуетС                = ТекущаяДата();
НоваяСтрока.Основной                  = Истина; // Если это основной e-mail
НоваяСтрока.Используется              = Истина; // Обязательно для отображения

// Дополнительные поля, которые могут быть важны для определенных видов КИ:
// НоваяСтрока.Надпись                  = "Электронная почта"; 
// НоваяСтрока.КодСтраны               = "643"; // Для телефонов
// ...

// 4. Устанавливаем (записываем) контактную информацию
// Второй параметр "Замещать" (Истина/Ложь) указывает, нужно ли полностью заменять существующую
// контактную информацию или добавлять к ней.
Попытка
    УправлениеКонтактнойИнформацией.УстановитьКонтактнуюИнформациюОбъектов(ТаблицаКИ, Истина); // Замещаем всю информацию
Исключение
    Сообщить("Ошибка при установке контактной информации: " + ОписаниеОшибки());
КонецПопытки;

Этот подход гарантирует, что система обработает данные в соответствии со своими внутренними правилами, включая формирование скрытого поля Значение в XML- или JSON-формате, если это требуется для данного типа контактной информации, и учет всех настроек, определенных для элемента справочника ВидыКонтактнойИнформации.

4. Дополнительные советы по отладке и поиску неисправностей

Если после выполнения вышеуказанных шагов электронная почта по-прежнему не отображается, мы можем применить следующие методы отладки:

  1. Сравнение данных: Создайте запись контактной информации (e-mail) вручную через форму элемента справочника "Физические лица". Затем откройте обе записи (вручную созданную и программно добавленную) в отладчике или с помощью специализированных обработок (например, "1Cadmin" или "Универсальный обмен данными в формате XML", который позволяет выгрузить данные объекта) и сравните значения всех реквизитов в табличной части "Контактная информация". Мы ищем малейшие различия, особенно в полях Тип, Вид, Представление, Значение, ДействуетС и Основной, Используется.
  2. Версионирование объектов: Включите версионирование для справочника "Физические лица" (если оно не включено). После этого, сначала запишите e-mail через форму, а затем программно. Мы сможем проанализировать изменения в версиях объекта и увидеть, какие реквизиты изменились или были добавлены при каждом способе записи. Это поможет нам выявить скрытые поля или процессы, которые не учтены в программном коде.
  3. Кэширование форм: В редких случаях, проблема может быть связана с кэшированием или особенностями работы управляемых форм. Попробуйте принудительно обновить или переоткрыть форму после программного добавления информации. Это может быть актуально, если форма была открыта до внесения изменений.
  4. Анализ поля "Значение": Если вид контактной информации относится к сложным (например, адрес), поле Значение табличной части КонтактнаяИнформация может содержать XML или JSON. Проверьте, что формат данных в этом поле соответствует ожидаемому, сравнивая его с данными, добавленными вручную. Функции БСП, такие как УправлениеКонтактнойИнформацией.КонтактнаяИнформацияXDTOПоПредставлению() или УправлениеКонтактнойИнформацией.КонтактнаяИнформацияВJSON(), при необходимости помогают сформировать это поле корректно.

Применяя эти шаги, мы сможем методично выявить причину, по которой программно добавленный e-mail не отображается на форме, и обеспечить его корректное функционирование.

Заключение

Проблема с отображением программно добавленной контактной информации в 1С:ЗУП КОРП чаще всего кроется в неполном или неверном заполнении полей табличной части "Контактная информация" (особенно поля Тип) и некорректных настройках самого элемента справочника "Виды контактной информации" (реквизиты Используется, ВидРедактирования, ИмяГруппы, Тип). Мы настоятельно рекомендуем использовать специализированные экспортные процедуры общего модуля УправлениеКонтактнойИнформацией, такие как УстановитьКонтактнуюИнформациюОбъектов(), которые обеспечивают полный цикл обработки и сохранения данных в соответствии со всеми внутренними требованиями БСП. Последовательная проверка всех этих аспектов и использование методов отладки поможет нам решить данную задачу и обеспечить корректное отображение контактной информации на форме.

← На главную