Как вывести адрес прописки сотрудника в печатную форму 1С

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

При разработке печатных форм в 1С часто возникает задача вывода контактной информации, в частности адреса по прописке. Несмотря на кажущуюся простоту, этот процесс имеет свои нюансы, связанные со структурой хранения данных и использованием механизмов Библиотеки Стандартных Подсистем (БСП). Рассмотрим, как правильно реализовать получение этих данных, исправим типичные ошибки в запросах и изучим наиболее эффективные методы решения задачи.

Разбор типичных ошибок в запросе к контактной информации

Проанализируем ситуацию, когда разработчик пытается получить адрес через прямой запрос к табличной части справочника. В исходном коде автора темы была допущена критическая ошибка в блоке ГДЕ. Рассмотрим этот фрагмент кода подробнее:


|ГДЕ
|    АдресПоПрописке.Представление = &Представление
|    И Сотрудники.ФизическоеЛицо = &ФизическоеЛицо

Выясним причину, по которой такой запрос не возвращает результат. В языке запросов 1С поле Представление в табличной части КонтактнаяИнформация является строковым (там хранится сам текст адреса). Автор же передает в параметр &Представление ссылку на элемент справочника ВидыКонтактнойИнформации. Сравнение строки с ссылкой всегда будет давать «Ложь», поэтому выборка будет пустой.

Также проанализируем структуру связей. Если у нас уже есть ссылка на ФизическоеЛицо, нам нет необходимости соединять справочник Сотрудники со справочником ФизическиеЛица. Это избыточная операция, которая замедляет выполнение кода. Достаточно обратиться напрямую к контактной информации физического лица.

Вариант 1: Правильное использование запроса

Если нам необходимо получить данные именно через запрос (например, для использования в СКД или при массовой выборке), мы должны скорректировать условия. Правильнее будет вынести фильтр по виду контактной информации в условие соединения или отдельный отбор по полю Вид. Рассмотрим правильный пример запроса:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	КИ.Представление КАК АдресПрописки
    |ИЗ
    |	Справочник.ФизическиеЛица.КонтактнаяИнформация КАК КИ
    |ГДЕ
    |	КИ.Ссылка = &ФизическоеЛицо
    |	И КИ.Вид = &ВидКИ";

Запрос.УстановитьПараметр("ФизическоеЛицо", Объект.Сотрудник.ФизическоеЛицо);
Запрос.УстановитьПараметр("ВидКИ", Справочники.ВидыКонтактнойИнформации.АдресПоПропискеФизическиеЛица);

Результат = Запрос.Выполнить();

Обратите внимание на имя предопределенного элемента: АдресПоПропискеФизическиеЛица. В современных конфигурациях (БП 3.0, ЗУП 3.1) именно так называется нужный нам вид информации. Использование просто АдресПоПрописке часто приводит к ошибке «Поле объекта не обнаружено», так как имя в конфигураторе может отличаться от синонима.

Вариант 2: Использование программного интерфейса БСП (Рекомендуемый)

В современных конфигурациях 1С прямой запрос к табличным частям контактной информации считается плохим тоном. Это связано с тем, что формат хранения адресов может меняться (например, переход на JSON-хранение данных ФИАС). Для получения данных лучше использовать функции общего модуля УправлениеКонтактнойИнформацией.

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


ФизЛицо = Объект.Сотрудник.ФизическоеЛицо;
ВидКИ = Справочники.ВидыКонтактнойИнформации.АдресПоПропискеФизическиеЛица;

АдресПр = УправлениеКонтактнойИнформацией.ПредставлениеКонтактнойИнформацииОбъекта(ФизЛицо, ВидКИ);

Если ЗначениеЗаполнено(АдресПр) Тогда
    ДанныеЗаголовка.Вставить("АдресПр", АдресПр);
Иначе
    ДанныеЗаголовка.Вставить("АдресПр", "Адрес не заполнен");
КонецЕсли;

Преимущества этого метода:

  1. Надежность: Код продолжит работать, даже если разработчики платформы изменят структуру справочников.
  2. Простота: Вам не нужно писать сложные соединения в запросах.
  3. Корректность: Метод корректно обрабатывает пустые значения и специфические типы контактной информации.

Вариант 3: Массовое получение адресов

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

Разберем пример получения данных для массива сотрудников:


МассивФизЛиц = Новый Массив;
// Допустим, мы наполнили массив ссылками на физических лиц
ВидКИ = Справочники.ВидыКонтактнойИнформации.АдресПоПропискеФизическиеЛица;

ТаблицаАдресов = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъектов(МассивФизЛиц, ВидКИ);

// Теперь мы можем быстро найти адрес для каждого лица в таблице
Для Каждого Стр Из ТаблицаАдресов Цикл
    // Стр.Объект - ссылка на ФизЛицо
    // Стр.Представление - текст адреса
КонецЦикла;

Дополнительные рекомендации по работе с адресами

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

Воспользуемся функцией УправлениеКонтактнойИнформацией.АдресИзЗначенияПолей. Она преобразует внутреннюю строку базы данных в структуру, с которой удобно работать программисту. Это позволит вам, например, вывести индекс отдельно от остальной части адреса или отфильтровать только город.

Важные моменты для проверки:

  1. Всегда проверяйте через «Функции для технического специалиста», как именно называется предопределенный элемент в справочнике ВидыКонтактнойИнформации.
  2. Убедитесь, что у объекта (Физического лица) заполнена контактная информация именно того вида, который вы запрашиваете.
  3. При работе с печатными формами в Управляемых формах помните, что обращение к общим модулям должно происходить на сервере.

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

← На главную