Как программно получить юридический адрес контрагента в 1С:ERP 2.5

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

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

Где хранятся данные: Табличные части и Регистры

Проанализируем структуру хранения данных. В 1С:ERP юридический адрес контрагента может храниться в двух местах в зависимости от настроек системы:

  1. Табличная часть КонтактнаяИнформация: Это основной способ хранения для большинства объектов. Каждая строка содержит вид информации, тип (адрес, телефон), представление и значения полей в формате XML или JSON.
  2. Регистр сведений КонтактнаяИнформация: Используется, если в настройках программы включено хранение истории изменений контактной информации. В этом случае данные становятся периодическими, и обычный запрос к табличной части не вернет актуальный адрес на нужную дату.

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


// Правильная проверка вида контактной информации
Если СтрКИ.Вид = Справочники.ВидыКонтактнойИнформации.ЮрАдресКонтрагента Тогда
    // Обработка юридического адреса
КонецЕсли;

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

Выясним наиболее универсальный способ получения адреса. Использование методов общего модуля УправлениеКонтактнойИнформацией позволяет абстрагироваться от того, где именно лежат данные (в ТЧ или регистре) и в каком формате они записаны. Разберем работу с функцией КонтактнаяИнформацияОбъекта.

Этот метод возвращает таблицу со всеми необходимыми данными — для их вывода в документы пригодится печать договоров в 1С:ERP с автоподстановкой реквизитов. Если нам нужно только текстовое представление, мы устанавливаем соответствующий флаг. Проанализируем пример кода:


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

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

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


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

Метод 2: Получение адреса через запрос

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

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


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

Запрос.УстановитьПараметр("Контрагент", СсылкаНаКонтрагента);
Запрос.УстановитьПараметр("ВидКИ", Справочники.ВидыКонтактнойИнформации.ЮрАдресКонтрагента);

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

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

Различие между Партнером и Контрагентом

Разберем типичную ошибку начинающих разработчиков в ERP. В системе разделены понятия Партнер (управленческая сущность) и Контрагент (юридическое лицо). Юридический адрес всегда привязан к Контрагенту. Если у вас в руках есть ссылка на Партнера, сначала необходимо найти его юридическое лицо.

Посмотрим, как это сделать программно:


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

Работа со значениями полей (JSON/XML)

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


// Разбор контактной информации в структуру
ЗначенияПолей = ТаблицаАдреса[0].ЗначенияПолей; // Получено ранее из метода КонтактнаяИнформацияОбъекта
СтруктураАдреса = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияВСтруктуру(ЗначенияПолей);

// Теперь можно обращаться к конкретным составляющим
Город = СтруктураАдреса.Город;
Улица = СтруктураАдреса.Улица;
Индекс = СтруктураАдреса.Индекс;

Подведем итоги. Для разового получения адреса на форме или в модуле объекта лучше использовать УправлениеКонтактнойИнформацией.ПредставлениеКонтактнойИнформации. Для массовой выборки — запрос к табличной части или регистру с обязательной фильтрацией по виду КИ. Всегда учитывайте разницу между партнером и контрагентом, чтобы не получить фактический адрес вместо юридического. Для выгрузки адреса в документы без программирования есть готовый вывод реквизитов в печатные формы Word.

← На главную