Как вывести контактный телефон текущего пользователя в печатную форму 1С?

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

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

В этой статье мы подробно разберем, как правильно получить телефон текущего пользователя, какие ошибки при этом часто совершают и как вывести эти данные в макет печатной формы без сбоев в работе программы.

Типичные ошибки при получении контактной информации

Рассмотрим частые ошибки, которые совершают разработчики при попытке получить номер телефона из справочника Пользователи.

Ошибка 1. Обращение к табличной части по жесткому индексу.

Попытка получить телефон напрямую через обращение к первой строке табличной части контактной информации выглядит следующим образом:


КонтактыПользователя = ТекущийПользователь.КонтактнаяИнформация;
Если КонтактыПользователя.Количество() > 0 Тогда
    Телефон = КонтактыПользователя[0].НомерТелефона; // ОПАСНО!
КонецЕсли;

Этот код крайне ненадежен. Контактная информация пользователя хранится в табличной части, где может быть записано несколько строк: адрес электронной почты, рабочий телефон, мобильный телефон, адрес проживания. Нет никакой гарантии, что строка с телефоном всегда будет находиться на первой позиции (под индексом 0). Если пользователь сначала укажет почту, программа вернет ее вместо телефона или вызовет ошибку, так как у типа контактной информации «Адрес электронной почты» отсутствуют свойства телефонных номеров.

Ошибка 2. Передача табличной части напрямую в параметры макета.

Еще одна популярная ошибка — попытка присвоить параметр макета напрямую объекту табличной части:


ОбластьПодвал.Параметры.ТелефонИсполнителя = ТекущийПользователь.КонтактнаяИнформация;

Параметры макета печатной формы (ячейки табличного документа) могут принимать только простые типы данных: строку, число, дату или булево. Попытка передать туда коллекцию строк (табличную часть) приведет к тому, что в печатной форме выведется системное представление объекта (например, «Табличная часть строка») либо программа завершит работу с критической ошибкой.

---

Способ 1. Безопасное получение телефона через Библиотеку стандартных подсистем (БСП)

Если вы работаете в современной типовой конфигурации 1С (например, «Бухгалтерия предприятия», «Управление нашей фирмой», «ERP» или «Управление торговлей»), в ней гарантированно установлена БСП. Механизмы БСП позволяют получить контактную информацию одной строкой кода, избегая ручного написания запросов.

Рассмотрим по шагам, как безопасно извлечь телефон текущего пользователя и передать его в макет:

  1. Получим ссылку на текущего авторизованного пользователя информационной базы.
  2. Определим вид контактной информации (для этого используется предопределенный элемент справочника ВидыКонтактнойИнформации).
  3. Вызовем экспортный метод общего модуля БСП, который вернет готовую строку телефона.

Реализуем этот алгоритм на практике:


// Шаг 1. Получаем текущего авторизованного пользователя
ТекущийПользователь = Пользователи.ТекущийПользователь();

// Шаг 2. Задаем вид контактной информации, который нам нужен
ВидКонтакта = Справочники.ВидыКонтактнойИнформации.ТелефонПользователя;

// Шаг 3. Используем функции БСП для получения строкового представления телефона
ТелефонСтрокой = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъекта(ТекущийПользователь, ВидКонтакта, , Истина);

// Проверяем, заполнено ли значение, и передаем в параметр макета
Если ЗначениеЗаполнено(ТелефонСтрокой) Тогда
    ОбластьПодвал.Параметры.ТелефонИсполнителя = ТелефонСтрокой;
Иначе
    ОбластьПодвал.Параметры.ТелефонИсполнителя = "Телефон не указан";
КонецЕсли;

Важная архитектурная особенность: в некоторых конфигурациях контактные телефоны сотрудников хранятся не в справочнике Пользователи, а в связанном с ним справочнике ФизическиеЛица. Если у пользователя телефон не заполнен, хорошим тоном будет попытаться получить его из карточки физического лица. Расширим наш код:


ТекущийПользователь = Пользователи.ТекущийПользователь();
ВидКонтакта = Справочники.ВидыКонтактнойИнформации.ТелефонПользователя;
ТелефонСтрокой = УправлениеКонтактнойИнформацией.ContactInformationOfObject(ТекущийПользователь, ВидКонтакта, , Истина);

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

ОбластьПодвал.Параметры.ТелефонИсполнителя = ?(ЗначениеЗаполнено(ТелефонСтрокой), ТелефонСтрокой, "Контакты отсутствуют");

---

Способ 2. Получение телефона через прямой запрос к базе данных

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

Проанализируем структуру запроса и напишем функцию для получения телефона:


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

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

---

Как правильно настроить макет печатной формы в Конфигураторе

После того как мы научились извлекать телефон в виде строки, необходимо правильно вывести его в печатную форму. Выполним следующие шаги:

  1. Откроем нужный макет печатной формы в Конфигураторе (обычно это табличный документ в составе обработок печати или самого документа).
  2. Найдем ячейку, в которую должен выводиться телефон исполнителя.
  3. Нажмем на ячейку правой кнопкой мыши и выберем пункт «Свойства».
  4. В палитре свойств найдем категорию «Макет» и свойство «Заполнение». Переведем его в положение «Параметр» (по умолчанию там стоит «Текст»).
  5. В поле «Параметр» впишем имя нашей переменной, например: ТелефонИсполнителя.

Теперь в программном коде формирования печатной формы (в модуле менеджера или модуле объекта) мы можем передать полученную строку напрямую в созданный параметр:


// Заполняем параметр в полученной области макета
ОбластьПодвал.Параметры.ТелефонИсполнителя = ПолучитьТелефонПользователя(Пользователи.ТекущийПользователь());

Также можно воспользоваться автозаполнением параметров через структуру, если имен параметров в макете много:


ДанныеДляПечати = Новый Структура;
ДанныеДляПечати.Вставить("ФИОИсполнителя", ФизическиеЛица.ФамилияИнициалы(ТекущийПользователь));
ДанныеДляПечати.Вставить("ТелефонИсполнителя", ТелефонСтрокой);

ОбластьПодвал.Параметры.Заполнить(ДанныеДляПечати);

---

Полезный лайфхак: Как быстро узнать, какая форма или документ открыты в режиме предприятия?

При доработке печатных форм часто возникает проблема поиска нужного документа или его формы в огромном дереве метаданных конфигуратора. Чтобы не тратить время на долгие поиски, воспользуемся штатными возможностями платформы 1С:

← На главную