При оформлении печатных форм документов (например, актов, накладных или счетов) часто требуется вывести не только ФИО ответственного сотрудника, но и его контактный телефон. В платформе 1С:Предприятие эта задача решается достаточно просто, однако начинающие разработчики часто сталкиваются с трудностями при извлечении контактной информации и ее выводе в макет табличного документа.
В этой статье мы подробно разберем, как правильно получить телефон текущего пользователя, какие ошибки при этом часто совершают и как вывести эти данные в макет печатной формы без сбоев в работе программы.
Рассмотрим частые ошибки, которые совершают разработчики при попытке получить номер телефона из справочника Пользователи.
Ошибка 1. Обращение к табличной части по жесткому индексу.
Попытка получить телефон напрямую через обращение к первой строке табличной части контактной информации выглядит следующим образом:
КонтактыПользователя = ТекущийПользователь.КонтактнаяИнформация;
Если КонтактыПользователя.Количество() > 0 Тогда
Телефон = КонтактыПользователя[0].НомерТелефона; // ОПАСНО!
КонецЕсли;
Этот код крайне ненадежен. Контактная информация пользователя хранится в табличной части, где может быть записано несколько строк: адрес электронной почты, рабочий телефон, мобильный телефон, адрес проживания. Нет никакой гарантии, что строка с телефоном всегда будет находиться на первой позиции (под индексом 0). Если пользователь сначала укажет почту, программа вернет ее вместо телефона или вызовет ошибку, так как у типа контактной информации «Адрес электронной почты» отсутствуют свойства телефонных номеров.
Ошибка 2. Передача табличной части напрямую в параметры макета.
Еще одна популярная ошибка — попытка присвоить параметр макета напрямую объекту табличной части:
ОбластьПодвал.Параметры.ТелефонИсполнителя = ТекущийПользователь.КонтактнаяИнформация;
Параметры макета печатной формы (ячейки табличного документа) могут принимать только простые типы данных: строку, число, дату или булево. Попытка передать туда коллекцию строк (табличную часть) приведет к тому, что в печатной форме выведется системное представление объекта (например, «Табличная часть строка») либо программа завершит работу с критической ошибкой.
---
Если вы работаете в современной типовой конфигурации 1С (например, «Бухгалтерия предприятия», «Управление нашей фирмой», «ERP» или «Управление торговлей»), в ней гарантированно установлена БСП. Механизмы БСП позволяют получить контактную информацию одной строкой кода, избегая ручного написания запросов.
Рассмотрим по шагам, как безопасно извлечь телефон текущего пользователя и передать его в макет:
ВидыКонтактнойИнформации).Реализуем этот алгоритм на практике:
// Шаг 1. Получаем текущего авторизованного пользователя
ТекущийПользователь = Пользователи.ТекущийПользователь();
// Шаг 2. Задаем вид контактной информации, который нам нужен
ВидКонтакта = Справочники.ВидыКонтактнойИнформации.ТелефонПользователя;
// Шаг 3. Используем функции БСП для получения строкового представления телефона
ТелефонСтрокой = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъекта(ТекущийПользователь, ВидКонтакта, , Истина);
// Проверяем, заполнено ли значение, и передаем в параметр макета
Если ЗначениеЗаполнено(ТелефонСтрокой) Тогда
ОбластьПодвал.Параметры.ТелефонИсполнителя = ТелефонСтрокой;
Иначе
ОбластьПодвал.Параметры.ТелефонИсполнителя = "Телефон не указан";
КонецЕсли;
Важная архитектурная особенность: в некоторых конфигурациях контактные телефоны сотрудников хранятся не в справочнике Пользователи, а в связанном с ним справочнике ФизическиеЛица. Если у пользователя телефон не заполнен, хорошим тоном будет попытаться получить его из карточки физического лица. Расширим наш код:
ТекущийПользователь = Пользователи.ТекущийПользователь();
ВидКонтакта = Справочники.ВидыКонтактнойИнформации.ТелефонПользователя;
ТелефонСтрокой = УправлениеКонтактнойИнформацией.ContactInformationOfObject(ТекущийПользователь, ВидКонтакта, , Истина);
// Если у пользователя телефон пустой, ищем в справочнике Физические Лица
Если Не ЗначениеЗаполнено(ТелефонСтрокой) Тогда
ФизЛицо = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ТекущийПользователь, "ФизическоеЛицо");
Если ЗначениеЗаполнено(ФизЛицо) Тогда
ВидКонтактаФизЛица = Справочники.ВидыКонтактнойИнформации.ТелефонФизЛица;
ТелефонСтрокой = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъекта(ФизЛицо, ВидКонтактаФизЛица, , Истина);
КонецЕсли;
EndIf;
ОбластьПодвал.Параметры.ТелефонИсполнителя = ?(ЗначениеЗаполнено(ТелефонСтрокой), ТелефонСтрокой, "Контакты отсутствуют");
---
Если конфигурация сильно измененная, старая или написана с нуля (без использования БСП), мы можем написать прямой запрос к табличной части справочника. Запросы работают быстрее и не вызывают ошибок при отсутствии записей.
Проанализируем структуру запроса и напишем функцию для получения телефона:
Функция ПолучитьТелефонПользователя(ПользовательСсылка) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПользователиКонтактнаяИнформация.Представление КАК Телефон
|ИЗ
| Справочник.Пользователи.КонтактнаяИнформация КАК ПользователиКонтактнаяИнформация
|ГДЕ
| ПользователиКонтактнаяИнформация.Ссылка = &ПользовательСсылка
| И ПользователиКонтактнаяИнформация.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Телефон)";
Запрос.УстановитьПараметр("ПользовательСсылка", ПользовательСсылка);
РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой() Тогда
Выборка = РезультатЗапроса.Выбрать();
Выборка.Следующий();
Возврат Выборка.Телефон;
КонецЕсли;
Возврат "";
КонецФункции
Этот метод гарантированно выберет именно телефон из всех доступных контактов пользователя, отсекая адреса электронной почты и физические адреса благодаря фильтру по типу контактной информации.
---
После того как мы научились извлекать телефон в виде строки, необходимо правильно вывести его в печатную форму. Выполним следующие шаги:
ТелефонИсполнителя.Теперь в программном коде формирования печатной формы (в модуле менеджера или модуле объекта) мы можем передать полученную строку напрямую в созданный параметр:
// Заполняем параметр в полученной области макета
ОбластьПодвал.Параметры.ТелефонИсполнителя = ПолучитьТелефонПользователя(Пользователи.ТекущийПользователь());
Также можно воспользоваться автозаполнением параметров через структуру, если имен параметров в макете много:
ДанныеДляПечати = Новый Структура;
ДанныеДляПечати.Вставить("ФИОИсполнителя", ФизическиеЛица.ФамилияИнициалы(ТекущийПользователь));
ДанныеДляПечати.Вставить("ТелефонИсполнителя", ТелефонСтрокой);
ОбластьПодвал.Параметры.Заполнить(ДанныеДляПечати);
---
При доработке печатных форм часто возникает проблема поиска нужного документа или его формы в огромном дереве метаданных конфигуратора. Чтобы не тратить время на долгие поиски, воспользуемся штатными возможностями платформы 1С:
Ctrl + F11 («Получить ссылку»): Находясь на открытой форме документа в режиме «1С:Предприятие», нажмите данную комбинацию клавиш. В появившемся окне отобразится навигационная ссылка на объект. В начале ссылки будет указан точный тип объекта метаданных. Например: e1cib/data/Документ.РеализацияТоваровУслуг.... Теперь вы точно знаете, какой документ нужно открыть в Конфигураторе.Документ.АктВыполненныхРабот.Форма.ФормаДокумента.