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