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