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