Разработка и Конфигурация · 11 мин
Как получить email пользователя в 1С
Как получить email пользователя в 1С: код для обычных и управляемых форм, работа с контактной информацией, типовые функции БСП, ошибки и проверка результата.
Адрес электронной почты пользователя в 1С может храниться в разных местах: в списке пользователей информационной базы, в справочнике «Пользователи» с табличной частью контактной информации, в карточке физического лица или контрагента. Поэтому универсального однострочного решения нет — сначала нужно понять, какой именно email требуется и где он фактически заполнен в вашей конфигурации.
Чаще всего задача возникает в трёх сценариях: отправка уведомлений из кода (например, о согласовании документа), выгрузка адресов во внешние системы и подстановка почты в печатные формы. В типовых конфигурациях на базе Библиотеки стандартных подсистем (БСП) для этого есть готовые функции, в самописных решениях приходится обращаться к данным напрямую.
Ниже разобраны основные способы получения email: через объект ПользовательИнформационнойБазы, через механизм контактной информации БСП и через связанные справочники. Для каждого способа приведены условия применимости, примеры кода и способы проверить результат.
Определите, где хранится email в вашей конфигурации
Прежде чем писать код, откройте карточку пользователя в режиме предприятия и посмотрите, заполнен ли адрес и в каком поле. В типовых конфигурациях (УТ, ERP, БП, ЗУП) email хранится в табличной части «Контактная информация» справочника «Пользователи», а физически — в регистре сведений «Контактная информация» или в служебных полях табличной части, в зависимости от версии БСП.
Отдельно существует адрес в настройках пользователя информационной базы — тот, что задаётся в конфигураторе или в разделе администрирования. Он используется, например, для восстановления пароля и системных рассылок, и в прикладных данных его обычно не видно. Это два разных адреса, и они могут не совпадать.
Если требуется почта не «пользователя-учётной записи», а человека как сотрудника или клиента, адрес может лежать в справочниках «Физические лица», «Сотрудники» или «Контрагенты». Уточните у постановщика задачи, какой именно адрес нужен, — от этого зависит весь дальнейший код.
Типовой вариант для УТ, ERP, БП, ЗУП
Задаётся в конфигураторе, часто пустое
Когда нужна почта человека, а не учётной записи
Получение email через контактную информацию БСП
В конфигурациях на базе БСП правильный способ — использовать программный интерфейс подсистемы «Контактная информация», а не лезть в табличную часть напрямую. Основная функция — УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъекта(), которая возвращает таблицу значений с адресами нужного вида.
Типовой фрагмент кода для получения email текущего пользователя выглядит так:
ТекущийПользователь = Пользователи.ТекущийПользователь();
ВидыКИ = Новый Массив;
ВидыКИ.Добавить(Справочники.ВидыКонтактнойИнформации.EmailПользователя);
ТаблицаКИ = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъекта(
ТекущийПользователь, ВидыКИ, ТекущаяДатаСеанса(), Ложь);
Если ТаблицаКИ.Количество() > 0 Тогда
Email = ТаблицаКИ[0].АдресЭП;
Иначе
Email = "";
КонецЕсли;
Поле АдресЭП содержит сам адрес, поле Представление — отображаемое значение. В новых версиях БСП модуль может называться УправлениеКонтактнойИнформацией или вызываться через ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформацией") — проверьте актуальное имя в своей конфигурации через синтакс-помощник.
Адрес из пользователя информационной базы
Если конфигурация самописная или нужен именно системный адрес учётной записи, используйте менеджер пользователей информационной базы. Этот способ не зависит от БСП и работает на любой платформе 8.3:
ПользовательИБ = ПользователиИнформационнойБазы.ТекущийПользователь();
Email = ПользовательИБ.АдресЭлектроннойПочты;
Для произвольного пользователя, а не текущего, применяется метод НайтиПоИмени() или НайтиПоУникальномуИдентификатору(). Учтите, что поиск по имени чувствителен к точному написанию, а метод может вернуть Неопределено — это нужно обрабатывать, иначе получите ошибку обращения к свойству.
Главное ограничение способа: поле «Адрес электронной почты» в свойствах пользователя ИБ администраторы заполняют редко. Чаще всего вы получите пустую строку, даже если в карточке пользователя в справочнике email указан. Поэтому для прикладных задач (рассылки, уведомления) этот вариант подходит плохо.
Email физического лица или контрагента
Когда требуется почта сотрудника или клиента, ссылка на справочник «Пользователи» не поможет. В ЗУП адрес хранится у физического лица, в УТ и ERP — у партнёра или контрагента, в БП — у контрагента. Механика та же: функция КонтактнаяИнформацияОбъекта(), но с другим видом контактной информации, например EmailКонтрагента или EMailФизическиеЛица.
Как связать пользователя с физлицом: в типовых конфигурациях у элемента справочника «Пользователи» есть реквизит «Физическое лицо». Получив его, вы обращаетесь к контактной информации уже физлица. В ЗУП дополнительно может понадобиться переход от физлица к сотруднику через регистр или функции кадрового учёта.
- 1Получите ссылку на текущего пользователя через Пользователи.ТекущийПользователь()
- 2Прочитайте реквизит «ФизическоеЛицо» через ОбщегоНазначения.ЗначениеРеквизитаОбъекта()
- 3Вызовите КонтактнаяИнформацияОбъекта() для физлица с видом EMailФизическиеЛица
- 4Проверьте, что таблица результата не пустая, и возьмите АдресЭП
Массовое получение адресов и производительность
Если email нужен для списка пользователей — например, для рассылки всем согласующим, — не вызывайте функцию контактной информации в цикле по одному объекту. Функция КонтактнаяИнформацияОбъектов() (во множественном числе) принимает массив ссылок и возвращает все адреса одним запросом, что заметно быстрее при десятках и сотнях получателей.
Альтернатива — прямой запрос к табличной части или регистру контактной информации. Он даёт максимальную скорость, но привязывает код к внутренней структуре хранения БСП, которая менялась между версиями. Такой запрос оправдан только в обработках массовой выгрузки, и его нужно тестировать после каждого обновления конфигурации.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПользователиКИ.Ссылка КАК Пользователь,
| ПользователиКИ.АдресЭП КАК Email
|ИЗ
| Справочник.Пользователи.КонтактнаяИнформация КАК ПользователиКИ
|ГДЕ
| ПользователиКИ.Вид = &ВидEmail";
Запрос.УстановитьПараметр("ВидEmail",
Справочники.ВидыКонтактнойИнформации.EmailПользователя);
Сравнение подходов
Устойчивы к обновлениям, но требуют наличия БСП и знания видов КИ
Быстро при массовой выборке, но ломается при смене структуры хранения
Не зависит от конфигурации, но поле обычно не заполнено
Проверка результата и типичные ошибки
После получения адреса проверьте три вещи: строка не пустая, адрес соответствует формату (наличие «@» и домена), адрес принадлежит нужному объекту. Для формальной проверки в БСП есть функция ОбщегоНазначенияКлиентСервер.АдресЭлектроннойПочтыСоответствуетТребованиям() — используйте её вместо самописных проверок.
Самая частая ошибка — молчаливая пустота: функция вернула пустую таблицу, код не упал, но письмо никому не ушло. Всегда обрабатывайте случай отсутствия адреса явно: пишите предупреждение в журнал регистрации или сообщайте пользователю, у кого именно email не заполнен.
Вторая группа ошибок — права доступа. Код, выполняемый под рядовым пользователем, может не иметь права чтения справочника «Пользователи» или видов контактной информации. В этом случае выборка вернёт пустой результат без ошибки. Для серверных процедур рассылки используйте привилегированный режим (УстановитьПривилегированныйРежим(Истина)) там, где это оправдано.
Отправка письма после получения адреса
Полученный email обычно передаётся в объект ИнтернетПочтовоеСообщение вместе с учётной записью почты (Справочники.УчетныеЗаписиЭлектроннойПочты) и отправляется через ИнтернетПочта. В БСП есть готовая процедура РаботаСПочтовымиСообщениями.ОтправитьПочтовоеСообщение(), которая скрывает детали SMTP-соединения.
Учтите, что отправка требует настроенной системной учётной записи в разделе администрирования. Если письма не уходят, проблема почти всегда в настройках почтового сервера (порт, шифрование, пароль приложения), а не в коде получения адреса. Проверяйте эти части независимо друг от друга.
Как проверить результат
Строка с адресом в формате имя@домен
Пустая строка или Неопределено
Нет ошибок почтового соединения
Ошибки авторизации SMTP или таймауты
Дошло до нужного получателя с корректной темой
Письмо ушло не тому адресату или в спам
Частые вопросы
Почему функция возвращает пустой результат, хотя email в карточке есть?
Чаще всего дело в виде контактной информации: адрес заполнен с другим видом (например, вручную добавленным), а вы запрашиваете предопределённый «EmailПользователя». Откройте карточку, посмотрите вид конкретной строки и либо запрашивайте его, либо вызывайте функцию без отбора по видам, чтобы получить всю контактную информацию объекта.
Как получить email пользователя, который сейчас не вошёл в базу?
Через справочник «Пользователи» — найдите элемент по наименованию или коду и вызовите КонтактнаяИнформацияОбъекта() для его ссылки. Авторизация пользователя в сеансе не требуется: контактная информация хранится в базе постоянно.
Можно ли получить email без БСП в самописной конфигурации?
Да, если вы сами храните адреса — например, в реквизите справочника пользователей или в собственном регистре сведений. Тогда достаточно обычного запроса или обращения к реквизиту. Стандартный механизм контактной информации без БСП недоступен.
Чем отличается АдресЭП от Представления в результате функции?
АдресЭП — это чистый адрес для программной отправки письма. Представление — отображаемое значение, которое может включать дополнительное оформление. Для поля «Кому» почтового сообщения используйте именно АдресЭП.
Безопасно ли выгружать email пользователей во внешний файл?
Адреса сотрудников — персональные данные, поэтому выгрузку стоит ограничить служебными целями, хранить файл в защищённом каталоге и удалять после использования. Не передавайте список адресов третьим лицам и не публикуйте его в открытом доступе.
Как узнать email пользователя в тонком клиенте без изменения кода?
Откройте раздел администрирования, перейдите в список пользователей и откройте карточку нужного человека — адрес виден на закладке с контактной информацией. Если у вас нет доступа к этому разделу, запросите данные у администратора базы.
Что важно запомнить
В типовых конфигурациях email берите через УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъекта() с видом EmailПользователя, для списков — через версию функции для массива объектов. Всегда проверяйте результат на пустоту, учитывайте права доступа и тестируйте отправку на себе перед массовой рассылкой.