Как получить адрес электронной почты организации для внешней печатной формы в УТ 10.3

Программист 1С v8.3 (Обычные формы) Торговля и дистрибуция
← На главную

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

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

Архитектура хранения контактной информации

Проанализируем структуру метаданных. В «Управлении торговлей 10.3» (и аналогичных решениях того поколения) контактная информация не всегда хранится непосредственно в табличных частях справочников. Основным местом хранения является РегистрСведений.КонтактнаяИнформация. Это периодический регистр, где записи привязаны к объекту (организации или контрагенту) через измерение Объект.

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

  1. Объект — ссылка на организацию, чей email мы ищем.
  2. Тип — значение перечисления Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты.
  3. Вид — ссылка на справочник Справочники.ВидыКонтактнойИнформации.

Способ 1: Использование программного интерфейса (API) системы

Рассмотрим самый быстрый и надежный способ. В типовых конфигурациях часто уже реализованы функции, которые берут на себя сложность построения запросов. Выясним, какая функция поможет нам в УТ 10.3.

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

Посмотрим на пример кода, который можно вставить в модуль внешней печатной формы:


// В контексте внешней печатной формы, где СсылкаНаОбъект — это текущий документ
АдресЭП = УправлениеЭлектроннойПочтой.ОпределитьАдресПолучателя(СсылкаНаОбъект.Организация);

// Далее передаем полученное значение в параметр макета
ОбластьМакета.Параметры.АдресЭП = АдресЭП;

Эта функция удобна тем, что она автоматически ищет подходящий адрес, учитывая настройки системы. Однако, если нам нужен контроль над тем, какой именно вид почты выбрать (например, строго «Рабочий email»), лучше использовать прямой запрос.

Способ 2: Получение email через запрос к регистру сведений

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

Правильный текст запроса должен обращаться к РегистрСведений.КонтактнаяИнформация. Рассмотрим структуру такого запроса:


Функция ПолучитьEmailОрганизации(ОрганизацияСсылка) Экспорт
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
    "ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1
    |	КонтактнаяИнформация.Представление КАК Email
    |ИЗ
    |	РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
    |ГДЕ
    |	КонтактнаяИнформация.Объект = &Объект
    |	И КонтактнаяИнформация.Тип = &Тип";
    
    Запрос.УстановитьПараметр("Объект", ОрганизацияСсылка);
    Запрос.УстановитьПараметр("Тип", Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты);
    
    РезультатЗапроса = Запрос.Выполнить();
    
    Если Не РезультатЗапроса.Пустой() Тогда
        Выборка = РезультатЗапроса.Выбрать();
        Выборка.Следующий();
        Возврат Выборка.Email;
    Иначе
        Возврат "";
    КонецЕсли;
    
КонецФункции

Важный нюанс: Обратите внимание на использование ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.АдресЭлектроннойПочты). В тексте запроса крайне важно указывать правильный тип. Если вы укажете ТипыКонтактнойИнформации.Другое, запрос вернет пустой результат, так как система четко разделяет почтовые адреса, телефоны и прочую информацию.

Типичные ошибки и способы их решения

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

  1. Ошибка в обращении к метаданным в запросе. Помните, что внутри текста запроса мы используем единственное число: Справочник.Организации, а не Справочники. В коде 1С (вне запроса) используется множественное число.
  2. Поиск вида КИ по наименованию. В сообщениях форума часто предлагают использовать НайтиПоНаименованию("Email"). Мы крайне не рекомендуем этот подход. Если пользователь в интерфейсе переименует вид контактной информации, ваш код сломается. Используйте фильтрацию по Типу (из перечисления), это более стабильный метод.
  3. Проблема пустых значений. Если у организации заведено несколько записей в регистре (например, почта и телефон), но вы не указали фильтр по типу, запрос может вернуть номер телефона вместо email. Всегда проверяйте условие КонтактнаяИнформация.Тип = &Тип.

Интеграция в модуль внешней печатной формы

Выясним, как правильно встроить полученный код в структуру внешней обработки. Обычно в модуле объекта внешней печатной формы существует функция Печать(). Рекомендуется получать контактную информацию один раз в начале формирования макета, чтобы не замедлять работу системы лишними обращениями к базе данных в цикле.

Проанализируем пример итоговой реализации:


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

Таким образом, мы обеспечиваем корректный вывод данных. Использование типовых функций, таких как УправлениеЭлектроннойПочтой.ОпределитьАдресПолучателя, является наиболее предпочтительным для конфигураций 1С:УТ 10.3, так как учитывает внутреннюю логику приоритетов выбора адресов, заложенную разработчиками фирмы «1С».

← На главную