При разработке внешних печатных форм в 1С часто возникает необходимость вывести контактную информацию организации, такую как адрес электронной почты. Эта задача, на первый взгляд, может показаться простой, но имеет свои нюансы, особенно при работе с конфигурациями на обычных формах, как, например, "Управление торговлей", редакция 10.3. Давайте рассмотрим, как правильно получить адрес электронной почты из регистра сведений "Контактная информация" и вывести его в макет печатной формы.
Мы проанализируем основные подходы: использование типовых функций конфигурации (если они есть) и прямой запрос к регистру сведений, а также разберем типичные ошибки и способы их исправления.
Прежде чем приступать к написанию кода, необходимо разобраться, как устроено хранение контактной информации в 1С. В большинстве типовых конфигураций (включая УТ 10.3) эти данные хранятся в общем регистре сведений КонтактнаяИнформация. Этот регистр универсален и содержит информацию для различных объектов системы: организаций, контрагентов, физических лиц и так далее.
Давайте посмотрим на ключевые измерения этого регистра, понимание которых критически важно для построения правильного запроса:
Объект: Это измерение является ссылкой на владельца контактной информации. Именно здесь хранится указание на конкретную организацию, контрагента или физическое лицо, к которому относится данная контактная информация. Без отбора по этому измерению мы получим все записи из регистра, а не только те, что относятся к нужной нам организации.Тип: Это системное перечисление Перечисления.ТипыКонтактнойИнформации. Оно определяет общий тип данных, например: "Адрес", "Телефон", "АдресЭлектроннойПочты", "Факс" и т.д. Этот тип жестко задан разработчиками платформы и конфигурации.Вид: Это ссылка на справочник Справочники.ВидыКонтактнойИнформации. Он позволяет пользователям создавать более детализированные виды для каждого типа контактной информации. Например, для типа "Телефон" можно создать виды "Рабочий", "Мобильный", "Факс", а для типа "АдресЭлектроннойПочты" — "Основной", "Для рассылок", "Бухгалтерия".Как видим, в начальных попытках получения адреса электронной почты, автор темы столкнулся с путаницей между измерениями Вид и Объект, а также с неверным использованием их типов. Мы должны будем явно отбирать данные по двум ключевым измерениям: конкретной организации (Объект) и нужному типу или виду контактной информации (Тип или Вид).
Наиболее предпочтительным и надежным способом получения контактной информации является использование готовых функций, предоставляемых конфигурацией, как правило, из Библиотеки стандартных подсистем (БСП). Эти функции уже содержат всю необходимую логику, учитывают особенности хранения данных и права доступа. Используя их, мы делаем наш код более стабильным и легким для поддержки.
В конфигурации "Управление торговлей 10.3" (и аналогичных, таких как УПП) для этих целей часто используются функции из общих модулей, например, УправлениеКонтактнойИнформацией или УправлениеЭлектроннойПочтой. Одной из таких функций, которая успешно сработала у автора темы, является УправлениеЭлектроннойПочтой.ОпределитьАдресПолучателя().
УправлениеЭлектроннойПочтой.ОпределитьАдресПолучателя()Для того чтобы воспользоваться этой функцией, нам понадобится ссылка на объект "Организация", для которого мы хотим получить адрес электронной почты. Обычно, при формировании внешней печатной формы, такая ссылка доступна через параметр, например, СсылкаНаОбъект.Организация (если форма вызывается из документа, у которого есть реквизит "Организация") или напрямую из реквизитов объекта, который является источником данных для формы.
Давайте рассмотрим, как это выглядит в коде:
// Предполагаем, что СсылкаНаОбъект - это объект, для которого формируется печатная форма
// и у него есть реквизит Организация, который содержит ссылку на нужную организацию.
// Например, если печатная форма вызывается из документа "РеализацияТоваровУслуг",
// то СсылкаНаОбъект будет ссылкой на этот документ.
// Получаем адрес электронной почты организации
АдресЭП = УправлениеЭлектроннойПочтой.ОпределитьАдресПолучателя(СсылкаНаОбъект.Организация);
// Передаем полученный адрес в параметры области макета для вывода
ОбластьМакета.Параметры.АдресЭП = АдресЭП;
Здесь СсылкаНаОбъект.Организация представляет собой ссылку на элемент справочника Справочники.Организации. Функция ОпределитьАдресПолучателя сама выполнит необходимый запрос к регистру сведений и вернет найденный адрес. Если адрес не будет найден, функция вернет пустую строку, что очень удобно для обработки в макете.
Преимущества этого подхода:
Иногда использование типовых функций может быть затруднено (например, если функции с нужной логикой нет или она не подходит под специфические требования), или же мы просто хотим глубже понять, как система работает. В таком случае мы можем обратиться к регистру сведений КонтактнаяИнформация напрямую с помощью запроса.
Давайте пошагово разберем, как построить корректный запрос, исправляя ошибки, которые возникали у автора темы.
В начале нам нужно создать новый объект Запрос и определить параметры, которые мы будем использовать для фильтрации данных.
Первоначальная ошибка автора заключалась в неверном использовании параметра Вид и отсутствии отбора по Объект. Вспомним структуру регистра: нам нужен конкретный Объект (наша организация) и конкретный Тип контактной информации (Адрес электронной почты).
Нам потребуется два параметра:
Объект: Ссылка на нужную организацию. Важно: Это должна быть именно ссылка на элемент справочника (например, СсылкаНаОбъект.Организация), а не менеджер справочника (Справочники.Организации), который является общим объектом для работы со всем справочником. Несоответствие типов здесь вызовет ошибку "Нельзя сравнивать поля неограниченной длины и поля несовместимых типов".Тип: Значение из перечисления Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты. Это гарантирует, что мы ищем именно электронные адреса.Инициализация параметров будет выглядеть так:
Запрос = Новый Запрос;
// Параметр для ссылки на объект (организацию)
Запрос.УстановитьПараметр("Объект", СсылкаНаОбъект.Организация);
// Параметр для типа контактной информации (АдресЭлектроннойПочты)
Запрос.УстановитьПараметр("Тип", Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты);
Теперь, когда параметры определены, мы можем составить текст запроса. Нам нужно выбрать поле Представление из регистра сведений КонтактнаяИнформация, отфильтровав его по нашим параметрам Объект и Тип.
Обратите внимание на использование ключевого слова РАЗРЕШЕННЫЕ. Оно рекомендуется для запросов в типовых конфигурациях, так как обеспечивает соблюдение прав доступа на уровне записей (RLS), если они настроены в системе. Это хорошая практика для безопасного получения данных.
Запрос.Текст = "
|ВЫБРАТЬ РАЗРЕШЕННЫЕ
| КонтактнаяИнформация.Представление
|ИЗ
| РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
|ГДЕ
| КонтактнаяИнформация.Объект = &Объект
| И КонтактнаяИнформация.Тип = &Тип
|";
После формирования текста запроса и установки параметров, мы можем выполнить запрос. Однако очень важно правильно обработать его результат, особенно если по какой-то причине адрес электронной почты для данной организации не был указан в системе.
В одной из попыток автор темы использовал строку ТаблицаЗапроса[0].Представление;. Этот подход содержит потенциальную ошибку: если запрос не вернет ни одной записи (то есть, у организации нет адреса электронной почты нужного типа), то обращение к элементу по индексу [0] вызовет ошибку "Индекс находится за границами массива".
Для надежной обработки результата мы должны проверить, пустой ли он, и затем безопасно получить данные, если они есть. Мы воспользуемся объектом ВыборкаИзРезультатаЗапроса.
// Выполняем запрос
РезультатЗапроса = Запрос.Выполнить();
// Инициализируем переменную для хранения адреса электронной почты пустым значением
АдресЭП = "";
// Проверяем, есть ли вообще какие-либо записи в результате запроса
Если НЕ РезультатЗапроса.Пустой() Тогда
// Создаем выборку для обхода результатов
Выборка = РезультатЗапроса.Выбрать();
// Пытаемся спозиционироваться на первой записи.
// Если запись существует, Выборка.Следующий() вернет Истина.
Если Выборка.Следующий() Тогда
АдресЭП = Выборка.Представление;
КонецЕсли;
КонецЕсли;
// Передаем полученный (или пустой) адрес в параметры области макета
ОбластьМакета.Параметры.АдресЭП = АдресЭП;
Этот код сначала проверяет, не пустой ли результат запроса в целом. Затем, если записи есть, он создает объект Выборка и пытается спозиционироваться на первой записи с помощью Выборка.Следующий(). Только после успешного позиционирования мы обращаемся к полю Представление. Если записи нет, переменная АдресЭП останется пустой строкой, и печатная форма будет сформирована без ошибок.
Соединив все шаги, мы получим следующий рабочий код для получения адреса электронной почты с помощью прямого запроса:
// Предполагаем, что СсылкаНаОбъект - это объект, для которого формируется печатная форма
// и у него есть реквизит Организация.
Запрос = Новый Запрос;
// Устанавливаем параметры для отбора
Запрос.УстановитьПараметр("Объект", СсылкаНаОбъект.Организация);
Запрос.УстановитьПараметр("Тип", Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты);
// Текст запроса к регистру сведений "КонтактнаяИнформация"
Запрос.Текст = "
|ВЫБРАТЬ РАЗРЕШЕННЫЕ
| КонтактнаяИнформация.Представление
|ИЗ
| РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
|ГДЕ
| КонтактнаяИнформация.Объект = &Объект
| И КонтактнаяИнформация.Тип = &Тип
|";
// Выполняем запрос
РезультатЗапроса = Запрос.Выполнить();
АдресЭП = ""; // Инициализируем переменную
// Обрабатываем результат запроса
Если НЕ РезультатЗапроса.Пустой() Тогда
Выборка = РезультатЗапроса.Выбрать();
Если Выборка.Следующий() Тогда
АдресЭП = Выборка.Представление;
КонецЕсли;
КонецЕсли;
// Передаем адрес электронной почты в параметры макета
ОбластьМакета.Параметры.АдресЭП = АдресЭП;
Как мы убедились, есть два основных пути решения задачи по получению адреса электронной почты организации для внешней печатной формы:
Независимо от выбранного метода, всегда уделяйте внимание корректной передаче параметров (ссылки на объекты вместо менеджеров справочников) и надежной обработке пустых результатов запросов. Это сделает ваш код более устойчивым и стабильным в работе.
Проанализировав все шаги и примеры, вы теперь обладаете необходимыми знаниями для успешного внедрения адреса электронной почты организации в свои внешние печатные формы в 1С:Управление торговлей 10.3 и аналогичных конфигурациях.