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