Как вывести телефон, адрес и email партнера в одном запросе 1С:Управление торговлей 11

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

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

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

Проанализируем ситуацию: в современных конфигурациях 1С контактная информация хранится не в отдельных реквизитах справочника, а в его табличной части КонтактнаяИнформация. Это позволяет привязывать к одному партнеру неограниченное количество адресов и телефонов. Однако такая структура усложняет написание простых плоских отчетов.

Рассмотрим основные поля табличной части КонтактнаяИнформация, которые нам понадобятся:

  1. Тип — значение перечисления (Телефон, Адрес, Электронная почта и т.д.).
  2. Вид — ссылка на справочник ВидыКонтактнойИнформации (например, "Рабочий телефон" или "Фактический адрес").
  3. Представление — строковое поле, где хранится уже отформатированный текст (именно его лучше всего выводить в отчеты).
  4. НомерТелефона — только цифры номера (используется для интеграции с телефонией).

Вариант 1. Базовый запрос для вывода одного типа информации

Если нам нужно вывести только один вид информации (например, только телефон), мы можем обратиться напрямую к табличной части. Посмотрим на пример кода:


ВЫБРАТЬ
    Партнеры.Наименование КАК Наименование,
    ПартнерыКИ.Представление КАК Телефон
ИЗ
    Справочник.Партнеры КАК Партнеры
        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Партнеры.КонтактнаяИнформация КАК ПартнерыКИ
        ПО ПартнерыКИ.Ссылка = Партнеры.Ссылка
            И ПартнерыКИ.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Телефон)
ГДЕ
    Партнеры.Ссылка = &Партнер

Важный момент: обратите внимание на использование поля Представление вместо НомерТелефона. В поле Представление хранится корректно отформатированная строка, которую привык видеть пользователь. Также крайне важно добавлять условие по полю Тип или Вид прямо в условие соединения ПО, чтобы не получить лишних строк в результате.

Вариант 2. Вывод нескольких полей (Телефон, Адрес, Email) одной строкой

Часто возникает задача вывести разные типы контактной информации в разные колонки одного отчета. Если просто соединиться с табличной частью несколько раз, запрос может стать "тяжелым" или начать дублировать строки. Разберем самый надежный и быстрый способ — использование функции МАКСИМУМ с условием ВЫБОР.

Проанализируем этот подход по шагам. Мы группируем таблицу по партнеру, а для каждой колонки (телефон, адрес) "собираем" данные только нужного типа.


ВЫБРАТЬ
    Партнеры.Наименование КАК Наименование,
    МАКСИМУМ(ВЫБОР
            КОГДА ПартнерыКИ.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Телефон)
                ТОГДА ПартнерыКИ.Представление
            ИНАЧЕ ""
        КОНЕЦ) КАК Телефон,
    МАКСИМУМ(ВЫБОР
            КОГДА ПартнерыКИ.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Адрес)
                ТОГДА ПартнерыКИ.Представление
            ИНАЧЕ ""
        КОНЕЦ) КАК Адрес,
    МАКСИМУМ(ВЫБОР
            КОГДА ПартнерыКИ.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.АдресЭлектроннойПочты)
                ТОГДА ПартнерыКИ.Представление
            ИНАЧЕ ""
        КОНЕЦ) КАК ЭлектроннаяПочта
ИЗ
    Справочник.Партнеры КАК Партнеры
        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Партнеры.КонтактнаяИнформация КАК ПартнерыКИ
        ПО ПартнерыКИ.Ссылка = Партнеры.Ссылка
ГДЕ
    Партнеры.Наименование = &Партнер

СГРУППИРОВАТЬ ПО
    Партнеры.Наименование

Этот метод хорош тем, что он всегда возвращает ровно одну строку на каждого партнера, даже если у него заполнено несколько видов КИ. Если же у партнера введено два разных телефона, функция МАКСИМУМ выберет один из них (по алфавиту).

Вариант 3. Использование левых соединений (Классический метод)

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


ВЫБРАТЬ
    Партнеры.Наименование КАК Наименование,
    Тлф.Представление КАК Телефон,
    Почта.Представление КАК Email,
    Адр.Представление КАК Адрес
ИЗ
    Справочник.Партнеры КАК Партнеры
        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Партнеры.КонтактнаяИнформация КАК Тлф
        ПО Тлф.Ссылка = Партнеры.Ссылка
            И Тлф.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Телефон)
        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Партнеры.КонтактнаяИнформация КАК Почта
        ПО Почта.Ссылка = Партнеры.Ссылка
            И Почта.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.АдресЭлектроннойПочты)
        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Партнеры.КонтактнаяИнформация КАК Адр
        ПО Адр.Ссылка = Партнеры.Ссылка
            И Адр.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Адрес)
ГДЕ
    Партнеры.Наименование = &Партнер

Осторожно: этот метод может привести к "размножению" строк, если у партнера задано два разных телефона (например, мобильный и рабочий) без уточнения конкретного Вида КИ. Чтобы этого избежать, вместо фильтра по Тип используйте фильтр по конкретному Вид (ссылка на справочник видов КИ).

Программное получение данных через механизмы БСП

Если задача стоит не в написании сложного запроса для СКД, а в получении данных внутри кода модуля (например, для заполнения печатной формы), рассмотрим более правильный архитектурный путь. В УТ 11 предусмотрены специальные функции в общих модулях.

Посмотрим на пример использования функции из модуля УправлениеКонтактнойИнформацией:


// Получаем представление телефона партнера
ПараметрыОбъекта = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъекта(ПартнерСсылка);
Для Каждого СтрокаКИ Из ПараметрыОбъекта Цикл
    Если СтрокаКИ.Тип = Перечисления.ТипыКонтактнойИнформации.Телефон Тогда
        ТелефонПредставление = СтрокаКИ.Представление;
    КонецЕсли;
КонецЦикла;

Также в некоторых релизах УТ 11 доступны функции в модуле ФормированиеПечатныхФорм, такие как ПолучитьТелефонИзКонтактнойИнформации(). Использование стандартных функций гарантирует, что вы получите данные именно так, как они задуманы логикой системы, с учетом всех настроек и прав доступа.

Особенности УТ 11.4: "Сводная" строка КИ

Проанализируем интересную особенность хранения данных в последних версиях 1С:Управление торговлей. Разработчики системы для ускорения работы некоторых отчетов добавили механизм, который автоматически формирует одну "сводную" строку в табличной части КИ. В этой строке в поле Представление через запятую перечислены все телефоны или все адреса.

Чтобы найти такую строку в запросе, часто анализируют дополнительные реквизиты табличной части, но самый простой способ для новичка — это фильтрация по конкретному Виду контактной информации, который помечен в настройках как основной для данного типа объекта.

Подведем итоги нашего разбора:

← На главную