Как в 1С: УТ 11.5 получить телефон и почту партнера для отчета?

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

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

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

Решение 1: Прямой запрос к табличной части справочника

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

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

Посмотрим на пример такого запроса:


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

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

Разберем этот запрос по шагам:

  1. Основной таблицей для выборки является Справочник.Партнеры.
  2. Первое ЛЕВОЕ СОЕДИНЕНИЕ подключает табличную часть КонтактнаяИнформация (под псевдонимом ПартнерыКонтактнаяИнформацияПочта). В условии соединения мы связываем записи по владельцу (Партнеры.Ссылка = ПартнерыКонтактнаяИнформацияПочта.Ссылка) и сразу же накладываем фильтр, чтобы выбрать только строки с типом "EmailПартнера": И (ПартнерыКонтактнаяИнформацияПочта.Вид = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.EmailПартнера)).
  3. Второе ЛЕВОЕ СОЕДИНЕНИЕ делает то же самое, но уже для телефона (псевдоним ПартнерыКонтактнаяИнформацияТелефон), отбирая строки с видом ТелефонПартнера.
  4. В секции ВЫБРАТЬ мы выводим ссылку на партнера и поле Представление из каждой присоединенной таблицы, получая таким образом почту и телефон в отдельных колонках.

Важно: Названия видов контактной информации, такие как EmailПартнера и ТелефонПартнера, являются предопределенными элементами справочника ВидыКонтактнойИнформации. Убедитесь, что используете правильные имена для вашей конфигурации — для настройки обязательности полей без кода подойдёт контроль заполнения реквизитов в 1С.

Решение 2: Запрос к регистру сведений "КонтактнаяИнформация" (Рекомендуемый способ)

Хотя предыдущий способ работает, в современных типовых конфигурациях на базе "Библиотеки стандартных подсистем" (БСП) контактная информация хранится не только в табличной части. Основным хранилищем является периодический регистр сведений КонтактнаяИнформация. Этот регистр позволяет хранить историю изменений контактов.

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

Пример запроса с использованием среза последних:


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

        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КонтактнаяИнформация.СрезПоследних КАК Почта
        ПО Партнеры.Ссылка = Почта.Объект
            И (Почта.Вид = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.EmailПартнера))

Структура запроса очень похожа на первую, но есть отличия:

Этот способ является предпочтительным для построения запросов в отчетах, так как он соответствует архитектуре хранения данных в БСП и гарантирует получение именно актуальной информации. Для этой задачи есть вывод ИНН в список партнеров и поиск по ним в УТ 11.5.

Решение 3: Программное получение через общие модули (Самый надежный способ)

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

Использование этого модуля гарантирует, что ваш код будет работать корректно даже после обновлений конфигурации, так как вам не нужно беспокоиться об изменениях в структуре хранения данных.

Рассмотрим пример кода на встроенном языке 1С:


// Предположим, у нас есть переменная СсылкаНаПартнера, содержащая ссылку на элемент справочника "Партнеры"

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

// 2. Ищем нужные строки в полученной таблице по имени вида контакта
НайденнаяСтрокаПочты = ТаблицаКонтактов.Найти("EmailПартнера", "Вид");
НайденнаяСтрокаТелефона = ТаблицаКонтактов.Найти("ТелефонПартнера", "Вид");

// 3. Получаем представления и выводим их
Если НайденнаяСтрокаПочты <> Неопределено Тогда
    Сообщить("Email: " + НайденнаяСтрокаПочты.Представление);
КонецЕсли;

Если НайденнаяСтрокаТелефона <> Неопределено Тогда
    Сообщить("Телефон: " + НайденнаяСтрокаТелефона.Представление);
КонецЕсли;

Этот метод идеален, если вам нужно получить контакты не в запросе, а при обработке данных в коде (например, в модуле формы или объекта). Он прост, надежен и не требует написания сложных запросов.

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

← На главную