Как пользоваться стандартными функциями БСП для получения юридического адреса организации

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

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

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

Быстрое решение: Получение представления адреса в одну строку

Если перед нами стоит задача просто получить текстовое представление юридического адреса головной организации и вывести его в параметр печатной формы, наиболее лаконичным и правильным решением будет вызов функции с установленным флагом ТолькоПредставление = Истина. Давайте посмотрим на готовый пример кода, который решает эту задачу в одну строку:


ОбластьПодвал1.Параметры.ГоловнаяОрганизацияАдресЮридический = 
    УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъекта(
        СсылкаНаДокумент.ГоловнаяОрганизация, 
        Справочники.ВидыКонтактнойИнформации.ЮрАдресОрганизации, 
        СсылкаНаДокумент.Дата, 
        Истина
    );

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

  1. Первым параметром мы передаем ссылку на объект-владелец контактной информации — в данном случае это СсылкаНаДокумент.ГоловнаяОрганизация.
  2. Вторым параметром мы указываем конкретный вид контактной информации. Мы используем предопределенный элемент справочника Справочники.ВидыКонтактнойИнформации.ЮрАдресОрганизации.
  3. Третьим параметром мы передаем дату документа (СсылкаНаДокумент.Дата). Это критически важно для корректного получения исторических данных, о чем мы подробно поговорим далее.
  4. Четвертым параметром мы передаем значение Истина (параметр ТолькоПредставление). Это указывает системе, что нам не нужна таблица со служебными данными, а достаточно получить простую готовую строку с адресом.

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

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

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


// Получаем таблицу со всеми видами контактной информации объекта
ТаблицаКИ = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъекта(
    СсылкаНаДокумент.ГоловнаяОрганизация, 
    Неопределено, 
    СсылкаНаДокумент.Дата, 
    Ложь
);

// Ищем строку, соответствующую юридическому адресу
СтрокаЮрАдрес = ТаблицаКИ.Найти(Справочники.ВидыКонтактнойИнформации.ЮрАдресОрганизации, "Вид");

Если СтрокаЮрАдрес <> Неопределено Тогда
    ОбластьПодвал1.Parameтры.ГоловнаяОрганизацияАдресЮридический = СтрокаЮрАдрес.Представление;
Иначе
    ОбластьПодвал1.Параметры.ГоловнаяОрганизацияАдресЮридический = "Адрес не заполнен";
КонецЕсли;

Обратите внимание: объявление переменной в виде Адрес = Новый ТаблицаЗначений; перед вызовом функции является грубой ошибкой и лишним действием. Функция КонтактнаяИнформацияОбъекта сама инициализирует и возвращает готовую таблицу значений. Предварительное создание пустого объекта таблицы лишь бессмысленно расходует оперативную память и процессорное время.

Разбор параметров функции КонтактнаяИнформацияОбъекта

Для глубокого понимания работы механизма рассмотрим структуру параметров функции:

Откуда берется значение "ЮрАдресОрганизации"?

В старых версиях конфигураций 1С (на платформе 1С:Предприятие 8.1 и ранних версиях 8.2) виды контактной информации хранились в Планах видов характеристик (ПВХ). Однако в современных решениях на БСП вся контактная информация классифицируется с помощью справочника ВидыКонтактнойИнформации.

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

Оптимизация производительности: Избегаем критической ошибки N+1 запросов

Рассмотрим очень важный нюанс, связанный с быстродействием системы. Функция КонтактнаяИнформацияОбъекта при каждом своем вызове обращается к базе данных с помощью запроса.

Представим сценарий: пользователь выводит на печать реестр из 100 документов или выполняет групповую печать накладных. Если мы поместим вызов функции КонтактнаяИнформацияОбъекта внутрь цикла обхода документов, программа выполнит 100 отдельных запросов к базе данных. Это классическая проблема производительности N+1 запрос, которая может привести к значительному зависанию интерфейса и избыточной нагрузке на СУБД.

Для решения этой проблемы в БСП предусмотрен альтернативный метод пакетного получения данных — УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъектов (обратите внимание на множественное число в имени функции). Давайте разберем, как правильно организовать получение адресов для списка документов:


// Шаг 1. Собираем массив уникальных организаций из списка документов
МассивОрганизаций = Новый Массив;
Для Каждого СтрокаДокумента Из СписокДокументов Цикл
    Если МассивОрганизаций.Найти(СтрокаДокумента.Организация) = Неопределено Тогда
        МассивОрганизаций.Добавить(СтрокаДокумента.Организация);
    КонецЕсли;
КонецЦикла;

// Шаг 2. Задаем массив интересующих нас видов контактной информации
МассивВидовКИ = Новый Массив;
МассивВидовКИ.Добавить(Справочники.ВидыКонтактнойИнформации.ЮрАдресОрганизации);

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

// Шаг 4. При формировании печатных форм находим адреса в локальной таблице значений
Для Каждого СтрокаДокумента Из СписокДокументов Цикл
    // Код вывода секции печатной формы...
    ПараметрыОтбора = Новый Структура;
    ПараметрыОтбора.Вставить("Объект", СтрокаДокумента.Организация);
    ПараметрыОтбора.Вставить("Вид", Справочники.ВидыКонтактнойИнформации.ЮрАдресОрганизации);
    
    НайденныеСтроки = ТаблицаАдресовОрганизаций.НайтиСтроки(ПараметрыОтбора);
    Если НайденныеСтроки.Количество() > 0 Тогда
        АдресДляПечати = НайденныеСтроки[0].Представление;
    Иначе
        АдресДляПечати = "";
    КонецЕсли;
    
    // Заполняем параметры области
    ОбластьСтроки.Параметры.Адрес = АдресДляПечати;
КонецЦикла;

Использование этого подхода позволяет сократить количество запросов к СУБД с сотен до одного-единственного, что обеспечивает мгновенное формирование печатных форм даже при больших объемах данных.

Важность параметра "Дата" для архивных документов

В конфигурациях 1С часто включается опция хранения истории изменений контактной информации. Это необходимо для случаев, когда организация меняет свой фактический или юридический адрес, но старые документы (например, накладные или акты трехлетней давности) должны по закону быть распечатаны со старыми реквизитами, актуальными на момент совершения сделки.

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

Всегда передавайте дату документа в качестве третьего параметра функции, чтобы обеспечить историческую достоверность выводимых реквизитов:


// Правильное получение адреса с учетом историчности изменений
АдресНаДату = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъекта(
    СсылкаНаДокумент.ГоловнаяОрганизация, 
    Справочники.ВидыКонтактнойИнформации.ЮрАдресОрганизации, 
    СсылкаНаДокумент.Дата, 
    Истина
);

Специализированная альтернатива для прикладных решений (ERP, КА, УТ)

Если вы работаете в таких комплексных конфигурациях, как 1С:ERP Управление предприятием, Комплексная автоматизация или Управление торговлей, в них присутствует специализированный общий модуль ОрганизацииСервер. Данный модуль предоставляет еще более простой программный интерфейс для работы с данными организаций.

Вместо ручного указания ссылок на справочник видов контактной информации мы можем вызвать готовый метод, который вернет структуру с заполненными текстовыми представлениями основных адресов:


// Запрашиваем структуру сведений по организации
СписокПолей = "ЮридическийАдрес, ФактическийАдрес, Телефоны";
ДанныеОрганизации = ОрганизацииСервер.КонтактнаяИнформацияОрганизации(
    СсылкаНаДокумент.ГоловнаяОрганизация, 
    СписокПолей, 
    СсылкаНаДокумент.Дата
);

// Заполняем параметры печатной формы
ОбластьПодвал1.Параметры.ГоловнаяОрганизацияАдресЮридический = ДанныеОрганизации.ЮридическийАдрес;

Этот способ удобен тем, что разработчику не нужно знать точные имена предопределенных элементов в справочнике КИ, система сама выполнит все сопоставления под капотом.

Работа со структурированным адресом (XML / JSON)

Иногда стандартного текстового представления адреса бывает недостаточно. Например, если в печатной форме жестко регламентировано разделение адреса по отдельным полям (индекс, субъект РФ, город, улица, дом) или требуется программно проанализировать код региона.

Для реализации такой логики нам потребуется получить структурированные данные. Для этого мы вызываем функцию с параметром ТолькоПредставление = Ложь и используем вспомогательные функции БСП для парсинга XML или JSON структуры:


ТаблицаКИ = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъекта(
    СсылкаНаДокумент.ГоловнаяОрганизация, 
    Справочники.ВидыКонтактнойИнформации.ЮрАдресОрганизации, 
    СсылкаНаДокумент.Дата, 
    Ложь
);

Если ТаблицаКИ.Количество() > 0 Тогда
    СтрокаКИ = ТаблицаКИ[0];
    
    // Получаем структуру полей адреса с помощью специализированного модуля
    СведенияОбАдресе = РаботаСАдресами.СведенияОбАдресе(СтрокаКИ.ЗначенияПолей, СтрокаКИ.Представление);
    
    // Теперь мы можем обращаться к отдельным составляющим адреса
    ПочтовыйИндекс = СведенияОбАдресе.Индекс;
    Город          = СведенияОбАдресе.Город;
    Улица          = СведенияОбАдресе.Улица;
    Дом            = СведенияОбАдресе.Дом;
    
    // Пример вывода только индекса и города
    ОбластьПодвал1.Параметры.КраткийАдрес = ПочтовыйИндекс + ", г. " + Город;
КонецЕсли;

Резюме и правила хорошего тона при работе с КИ

Подводя итоги, сформулируем основные правила работы с контактной информацией в среде 1С:Предприятие 8 на базе БСП:

  1. Никогда не пишите прямые SQL-подобные запросы к табличным частям КонтактнаяИнформация справочников. Используйте методы API БСП.
  2. Для одиночных запросов применяйте УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъекта.
  3. Всегда передавайте Дата документа при запросе КИ, чтобы избежать вывода неактуальных юридических адресов на старых печатных формах.
  4. При групповой печати или обработке массивов данных обязательно переходите на пакетный метод УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъектов для предотвращения деградации производительности вашей СУБД.
  5. Если требуется разбить адрес по полям — используйте функцию РаботаСАдресами.СведенияОбАдресе для преобразования внутреннего формата хранения в удобную структуру 1С.
← На главную