При разработке печатных форм или отчетов в конфигурациях на базе 1С:Предприятие 8.3 (таких как ЗУП 3.1, БП 3.0 или ERP) начинающие разработчики часто сталкиваются с проблемой поиска контактной информации. В частности, поиск адреса прописки или проживания сотрудника может завести в тупик, так как эти данные хранятся не в явных реквизитах справочника ФизическиеЛица, а в подчиненных структурах. В этой статье мы подробно разберем, где лежат эти данные и как их правильно извлечь для вывода на печать.
В современных конфигурациях, построенных на БСП (Библиотеке стандартных подсистем), информация об адресах, телефонах и электронных почтах не хранится в отдельных полях справочника. Для этих целей используется универсальный механизм. Проанализируем два основных места, где могут физически находиться данные:
ФизическиеЛица и Контрагенты. Это «первичное» место хранения.Важный нюанс: адрес в системе хранится в двух видах. Первый — это Представление (простая строка текста, например: «г. Москва, ул. Ленина, д. 1»). Второй — это ЗначенияПолей (сложная строка в формате XML или JSON, где адрес разбит по полям: индекс, город, улица). Для печатных форм нам чаще всего нужно именно Представление.
Рассмотрим ситуацию, когда вам необходимо быстро получить адрес через консоль запросов или вставить его в простую печатную форму. Выясним, как правильно настроить связи таблиц, чтобы не получить лишних данных.
Если мы просто выберем все записи из таблицы Справочник.ФизическиеЛица.КонтактнаяИнформация, то на каждого сотрудника система выдаст несколько строк: и телефон, и адрес регистрации, и адрес проживания, и email. Чтобы получить только «прописку», выполним следующие шаги:
Справочник.ФизическиеЛица.КонтактнаяИнформация.ФизическиеЛица по условию: Справочник.ФизическиеЛица.Ссылка = Справочник.ФизическиеЛица.КонтактнаяИнформация.Ссылка (или поле Объект, в зависимости от версии).Пример кода запроса, который можно использовать в конструкторе:
ВЫБРАТЬ
ФизЛицаКонтактнаяИнформация.Представление КАК АдресРегистрации,
ФизическиеЛица.Наименование КАК ФИО
ИЗ
Справочник.ФизическиеЛица КАК ФизическиеЛица
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ФизическиеЛица.КонтактнаяИнформация КАК ФизЛицаКонтактнаяИнформация
ПО ФизическиеЛица.Ссылка = ФизЛицаКонтактнаяИнформация.Ссылка
ГДЕ
ФизЛицаКонтактнаяИнформация.Вид = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.АдресПоПропискеФизЛица)
Обратите внимание, что значение Справочник.ВидыКонтактнойИнформации.АдресПоПропискеФизЛица является предопределенным. Использование именно такого фильтра гарантирует, что вы не выведете номер телефона вместо адреса.
Проанализируем совет опытных разработчиков: «не используйте сырые запросы, используйте методы БСП». Почему это важно? Контактная информация может храниться в разных форматах, и программные методы БСП автоматически учитывают все нюансы конфигурации, корректно обрабатывают пустые значения и форматируют строку адреса.
Для получения данных в коде модуля (например, в модуле менеджера при формировании печатной формы) используем функцию общего модуля УправлениеКонтактнойИнформацией.
Рассмотрим пример получения адреса для одного объекта:
// Получаем представление адреса регистрации
ПараметрыАдреса = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъекта(СсылкаНаФизЛицо, Справочники.ВидыКонтактнойИнформации.АдресПоПропискеФизЛица);
СтрокаАдреса = ПараметрыАдреса.Представление;
Если же мы работаем с печатью списка сотрудников (например, ведомость), выполнение функции в цикле крайне неэффективно. В этом случае применим метод для массового получения данных:
// МассивСсылок - это массив с вашими сотрудниками (физлицами)
ВидАдреса = Справочники.ВидыКонтактнойИнформации.АдресПоПропискеФизЛица;
ТаблицаАдресов = УправлениеКонтактнойИнформацией.ПолучитьКонтактнуюИнформациюОбъектов(МассивСсылок, ВидАдреса);
Для Каждого Строка Из ТаблицаАдресов Цикл
// Здесь получаем адрес для конкретного объекта из таблицы
ТекущийАдрес = Строка.Представление;
КонецЦикла;
Посмотрим на типичный процесс создания печатной формы. Обычно у вас есть команда печати, которая вызывает процедуру в модуле менеджера или модуле объекта. Именно в тот момент, когда вы подготавливаете СтруктуруПараметров или ОбластьМакета для заполнения, нужно вызвать функции БСП.
Проанализируем ситуацию: вы создали макет, добавили в него параметр АдресПрописки. Теперь в коде формирования печатной формы вам нужно заполнить этот параметр:
УправлениеКонтактнойИнформацией.ПредставлениеКонтактнойИнформацииОбъекта.Пример реализации в коде формирования области:
ОбластьМакета = Макет.ПолучитьОбласть("ДанныеСотрудника");
ОбластьМакета.Параметры.ФИО = Выборка.Наименование;
// Получаем адрес через БСП
ВидАдреса = Справочники.ВидыКонтактнойИнформации.АдресПоПропискеФизЛица;
ОбластьМакета.Параметры.АдресПрописки = УправлениеКонтактнойИнформацией.ПредставлениеКонтактнойИнформацииОбъекта(Выборка.Ссылка, ВидАдреса);
ТабличныйДокумент.Вывести(ОбластьМакета);
Мы выяснили, что для получения адреса регистрации сотрудников в 1С 8.3 существует два пути. Запросный метод хорош для простых отчетов и понимания структуры БД. Однако метод через БСП является стандартом разработки, так как он более надежен, лучше работает с производительностью (при массовом получении данных) и гарантирует корректное строковое представление адреса независимо от того, как он был введен пользователем.
Всегда проверяйте, какой именно «Вид контактной информации» вы запрашиваете, так как в системе одновременно могут существовать «Адрес проживания», «Адрес по прописке» и «Адрес для информирования».