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