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