Где хранится адрес контактного лица в 1С:УНФ 1.6 и как его вывести в печатную форму?

Программист 1С v8.3 (Управляемые формы) 1С:Управление нашей фирмой Управленческий учет IT и автоматизация бизнеса
← На главную

При разработке и кастомизации конфигурации 1С:Управление нашей фирмой (УНФ) версии 1.6 (и более новых редакций 3.0) часто возникает задача вывода контактных данных не только самой компании-контрагента, но и конкретных лиц, представляющих её интересы. Разберем подробно, где физически располагаются эти данные в базе, как устроена их структура и какими программными методами их правильно извлекать.

Разбираемся в архитектуре хранения контактной информации

В современных конфигурациях 1С, построенных на базе Библиотеки стандартных подсистем (БСП), механизм хранения адресов и телефонов унифицирован. Однако новички часто совершают ошибку, пытаясь найти адрес в основных реквизитах справочника. Проанализируем, как это устроено на самом деле.

Адрес контактного лица не является отдельным реквизитом типа "Строка" в шапке справочника. Все контактные данные (адреса, телефоны, email) хранятся в табличной части. Рассмотрим основные объекты метаданных, задействованные в процессе:

  1. Справочник.КонтактныеЛица: Именно здесь хранятся записи о людях, связанных с контрагентами. Внутри этого справочника есть табличная часть КонтактнаяИнформация.
  2. Регистр сведений.СвязиКонтрагентКонтакт: Этот регистр служит "мостом" между контрагентом и контактным лицом. Он определяет, какой человек к какой компании относится и является ли он основным контактом.
  3. Справочник.ВидыКонтактнойИнформации: Содержит настройки для каждого типа данных (например, "Адрес контактного лица", "Телефон мобильный").

В табличной части КонтактнаяИнформация нас интересуют следующие поля:

Почему не подходят стандартные функции для организаций?

Рассмотрим типичную ошибку, упомянутую в обсуждении. Попытка использовать функцию УправлениеНебольшойФирмойСервер.ОписаниеОрганизации() для получения адреса контактного лица не увенчается успехом. Выясним причину: эта функция жестко завязана на метаданные организации (собственной компании или контрагента) и ищет данные по предопределенным видам КИ, специфичным для юридических или физических лиц — владельцев бизнеса.

Контактное лицо — это самостоятельный объект. Для работы с ним необходимо использовать универсальные механизмы БСП, предназначенные для любого объекта, обладающего табличной частью КонтактнаяИнформация.

Программные способы получения адреса контактного лица

Для того чтобы "выдернуть" адрес кодом, крайне не рекомендуется писать прямые запросы к табличным частям, так как структура хранения (особенно в поле ЗначенияПолей) может меняться от версии к версии. Рассмотрим правильный подход с использованием общего модуля УправлениеКонтактнойИнформацией.

Способ 1: Получение текстового представления адреса

Если нам нужно просто получить строку адреса для вывода в макет, используем следующий код:


// Определяем вид контактной информации, который нам нужен
ВидИнформации = Справочники.ВидыКонтактнойИнформации.АдресКонтактногоЛица;

// Получаем строковое представление
// КонтактСсылка — это ссылка на элемент справочника "Контактные лица"
АдресТекстом = УправлениеКонтактнойИнформацией.ПредставлениеКонтактнойИнформацииОбъекта(КонтактСсылка, ВидИнформации);

Сообщить(АдресТекстом);

Способ 2: Использование специализированных функций УНФ

В конфигурации УНФ есть свои обертки над методами БСП. Проанализируем использование функции модуля УправлениеНебольшойФирмойСервер:


// Функция возвращает структуру или таблицу со всеми данными КИ объекта
ДанныеКонтакта = УправлениеНебольшойФирмойСервер.ПолучитьКонтактнуюИнформациюОбъекта(КонтактСсылка);

// Далее можно извлечь нужный вид адреса из полученной коллекции

Практический пример: добавление адреса в макет печати

Представим ситуацию: нам нужно в макет счета или расходной накладной добавить адрес контактного лица, выбранного в документе. Разберем алгоритм действий по шагам:

  1. Модификация запроса: В модуле менеджера документа найдем процедуру формирования данных для печати. Убедимся, что в запросе выбирается поле КонтактноеЛицо (или аналогичное).
  2. Получение данных: В цикле обхода результатов запроса или при подготовке структуры параметров вызываем функцию получения адреса.
  3. Заполнение макета: Передаем полученную строку в параметр области макета.

Пример реализации в коде печати:


// Допустим, у нас есть выборка из запроса "ВыборкаДанных"
Пока ВыборкаДанных.Следующий() Цикл
    
    ОбластьМакета = Макет.ПолучитьОбласть("Заголовок");
    
    // Получаем ссылку на контакт из документа
    СсылкаНаКонтакт = ВыборкаДанных.КонтактноеЛицо;
    
    Если ЗначениеЗаполнено(СсылкаНаКонтакт) Тогда
        ВидАдреса = Справочники.ВидыКонтактнойИнформации.АдресКонтактногоЛица;
        ТекстАдреса = УправлениеКонтактнойИнформацией.ПредставлениеКонтактнойИнформацииОбъекта(СсылкаНаКонтакт, ВидАдреса);
        
        // Заполняем параметр в макете
        ОбластьМакета.Параметры.АдресДоставкиКонтакта = ТекстАдреса;
    КонецЕсли;
    
    ТабличныйДокумент.Вывести(ОбластьМакета);
    
КонецЦикла;

Особенности работы с регистром связей

Иногда адрес нужно получить не просто у произвольного контакта, а у основного контактного лица контрагента, указанного в карточке компании. В этом случае нам поможет регистр сведений СвязиКонтрагентКонтакт. Проанализируем, как найти этого человека:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	СвязиКонтрагентКонтакт.Контакт КАК ОсновнойКонтакт
    |ИЗ
    |	РегистрСведений.СвязиКонтрагентКонтакт КАК СвязиКонтрагентКонтакт
    |ГДЕ
    |	СвязиКонтрагентКонтакт.Контрагент = &Контрагент
    |	И СвязиКонтрагентКонтакт.Основной = ИСТИНА";

Запрос.УстановитьПараметр("Контрагент", СсылкаНаКонтрагента);
Результат = Запрос.Выполнить();

Если Не Результат.Пустой() Тогда
    Выборка = Результат.Выбрать();
    Выборка.Следующий();
    // Теперь у нас есть ссылка на контакт, и мы можем получить его адрес методами выше
    Адрес = УправлениеКонтактнойИнформацией.ПредставлениеКонтактнойИнформацииОбъекта(Выборка.ОсновнойКонтакт, Справочники.ВидыКонтактнойИнформации.АдресКонтактногоЛица);
КонецЕсли;

Важный нюанс: Помните, что в справочнике ВидыКонтактнойИнформации для контактов может быть создано несколько видов адресов (например, "Адрес проживания", "Рабочий адрес"). Всегда проверяйте, какой именно вид используется в вашей базе, чтобы передать правильную ссылку в функцию ПредставлениеКонтактнойИнформацииОбъекта.

Таким образом, мы выяснили, что ключ к решению задачи лежит в понимании структуры БСП. Адрес хранится "внутри" контакта, а связь с компанией регулируется отдельным регистром. Используя стандартные методы общего модуля УправлениеКонтактнойИнформацией, вы обеспечите стабильную работу кода даже после обновлений конфигурации.

← На главную