В современных конфигурациях на базе 1С:ERP Управление предприятием 2 работа с контактной информацией (адреса, телефоны, email) реализована через механизмы Библиотеки стандартных подсистем (БСП). Это накладывает определенные требования на разработку: мы не можем просто обратиться к реквизиту объекта, так как данные хранятся в подчиненных структурах. В этой статье мы подробно разберем, как правильно извлекать юридический адрес, какие методы БСП использовать и на что обратить внимание при написании запросов.
Проанализируем структуру хранения данных. В 1С:ERP юридический адрес контрагента может храниться в двух местах в зависимости от настроек системы:
Рассмотрим, как определить вид контактной информации. Для контрагентов юридический адрес обычно соответствует предопределенному элементу справочника ВидыКонтактнойИнформации. Посмотрим на правильный способ проверки вида в коде:
// Правильная проверка вида контактной информации
Если СтрКИ.Вид = Справочники.ВидыКонтактнойИнформации.ЮрАдресКонтрагента Тогда
// Обработка юридического адреса
КонецЕсли;
Выясним наиболее универсальный способ получения адреса. Использование методов общего модуля УправлениеКонтактнойИнформацией позволяет абстрагироваться от того, где именно лежат данные (в ТЧ или регистре) и в каком формате они записаны. Разберем работу с функцией КонтактнаяИнформацияОбъекта.
Этот метод возвращает таблицу со всеми необходимыми данными — для их вывода в документы пригодится печать договоров в 1С:ERP с автоподстановкой реквизитов. Если нам нужно только текстовое представление, мы устанавливаем соответствующий флаг. Проанализируем пример кода:
// Получаем только текстовое представление адреса
ВидАдреса = Справочники.ВидыКонтактнойИнформации.ЮрАдресКонтрагента;
АдресТекстом = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъекта(СсылкаНаКонтрагента, ВидАдреса, ТекущаяДата(), Истина);
// Если нужно получить структурированный адрес (город, улица, индекс)
ТаблицаАдреса = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъекта(СсылкаНаКонтрагента, ВидАдреса, ТекущаяДата(), Ложь);
Если ТаблицаАдреса.Количество() > 0 Тогда
СтруктураАдреса = ТаблицаАдреса[0];
// Здесь доступны поля: Представление, ЗначенияПолей, Город, Улица и т.д.
КонецЕсли;
Важный нюанс: Параметр Дата крайне важен. Если в системе ведется история адресов, без указания даты вы рискуете получить либо пустой результат, либо неактуальные данные. Рассмотрим ситуацию, когда нужно вывести адрес в печатную форму. Для этого лучше использовать специализированный метод:
// Получение представления для вывода в документы
Представление = УправлениеКонтактнойИнформацией.ПредставлениеКонтактнойИнформации(СсылкаНаКонтрагента, Справочники.ВидыКонтактнойИнформации.ЮрАдресКонтрагента);
Иногда требуется получить адреса сразу для большого списка контрагентов (например, в отчете или обработке заполнения). В таких случаях вызов функции БСП в цикле будет крайне неэффективным. Рассмотрим, как составить правильный запрос к базе данных.
Помните, что нам нужно фильтровать данные не только по ссылке на контрагента, но и по конкретному Виду и Типу контактной информации. Проанализируем структуру запроса:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| КонтрагентыКонтактнаяИнформация.Представление КАК ЮридическийАдрес
|ИЗ
| Справочник.Контрагенты.КонтактнаяИнформация КАК КонтрагентыКонтактнаяИнформация
|ГДЕ
| КонтрагентыКонтактнаяИнформация.Ссылка = &Контрагент
| И КонтрагентыКонтактнаяИнформация.Вид = &ВидКИ
| И КонтрагентыКонтактнаяИнформация.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Адрес)";
Запрос.УстановитьПараметр("Контрагент", СсылкаНаКонтрагента);
Запрос.УстановитьПараметр("ВидКИ", Справочники.ВидыКонтактнойИнформации.ЮрАдресКонтрагента);
Результат = Запрос.Выполнить();
Внимание: Если в вашей конфигурации включено хранение истории, вместо Справочник.Контрагенты.КонтактнаяИнформация следует обращаться к виртуальной таблице РегистрСведений.КонтактнаяИнформация.СрезПоследних.
Разберем типичную ошибку начинающих разработчиков в ERP. В системе разделены понятия Партнер (управленческая сущность) и Контрагент (юридическое лицо). Юридический адрес всегда привязан к Контрагенту. Если у вас в руках есть ссылка на Партнера, сначала необходимо найти его юридическое лицо.
Посмотрим, как это сделать программно:
// Поиск основного контрагента для партнера
КонтрагентСсылка = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ПартнерСсылка, "ОсновнойКонтрагент");
Если ЗначениеЗаполнено(КонтрагентСсылка) Тогда
ЮрАдрес = УправлениеКонтактнойИнформацией.ПредставлениеКонтактнойИнформации(КонтрагентСсылка, Справочники.ВидыКонтактнойИнформации.ЮрАдресКонтрагента);
КонецЕсли;
Иногда простой строки представления недостаточно. Например, если нужно выгрузить адрес в стороннюю систему, разделив его на индекс, город и улицу. В поле ЗначенияПолей данные хранятся в формате JSON (в новых версиях) или XML. Разберем, как их обработать с помощью БСП.
// Разбор контактной информации в структуру
ЗначенияПолей = ТаблицаАдреса[0].ЗначенияПолей; // Получено ранее из метода КонтактнаяИнформацияОбъекта
СтруктураАдреса = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияВСтруктуру(ЗначенияПолей);
// Теперь можно обращаться к конкретным составляющим
Город = СтруктураАдреса.Город;
Улица = СтруктураАдреса.Улица;
Индекс = СтруктураАдреса.Индекс;
Подведем итоги. Для разового получения адреса на форме или в модуле объекта лучше использовать УправлениеКонтактнойИнформацией.ПредставлениеКонтактнойИнформации. Для массовой выборки — запрос к табличной части или регистру с обязательной фильтрацией по виду КИ. Всегда учитывайте разницу между партнером и контрагентом, чтобы не получить фактический адрес вместо юридического. Для выгрузки адреса в документы без программирования есть готовый вывод реквизитов в печатные формы Word.