При разработке внешних отчетов в 1С часто возникает задача вывести в отдельные колонки контактные данные, например, телефон и электронную почту контрагента или партнера — для этого подойдёт универсальная выгрузка любых данных из 1С в Excel. В конфигурации "Управление торговлей 11.5" эта информация не хранится как простые поля в карточке партнера, а находится в отдельной табличной части КонтактнаяИнформация. Разберем, как правильно получить эти данные с помощью запроса и другими, более современными способами.
Проанализируем несколько подходов, от простого запроса (поможет инструментарий для отладки запросов и анализа структуры данных) к табличной части до использования рекомендованных платформенных механизмов.
Это самый очевидный способ, который часто приходит на ум в первую очередь. Логика заключается в том, чтобы соединить основную таблицу справочника Партнеры с его же табличной частью КонтактнаяИнформация.
Ключевой момент: так как телефон и почта — это разные строки в табличной части, нам потребуется присоединить эту таблицу дважды: один раз для получения телефона, второй — для получения почты. Чтобы в результат попадали партнеры, у которых может отсутствовать один из видов контактов (или оба), будем использовать ЛЕВОЕ СОЕДИНЕНИЕ — для контроля качества данных есть поиск незаполненных реквизитов в справочниках Партнеры и Контрагенты.
Посмотрим на пример такого запроса:
ВЫБРАТЬ
Партнеры.Ссылка КАК Партнер,
Партнеры.Наименование КАК НаименованиеПартнера,
ПартнерыКонтактнаяИнформацияПочта.Представление КАК Почта,
ПартнерыКонтактнаяИнформацияТелефон.Представление КАК Телефон
ИЗ
Справочник.Партнеры КАК Партнеры
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Партнеры.КонтактнаяИнформация КАК ПартнерыКонтактнаяИнформацияПочта
ПО Партнеры.Ссылка = ПартнерыКонтактнаяИнформацияПочта.Ссылка
И (ПартнерыКонтактнаяИнформацияПочта.Вид = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.EmailПартнера))
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Партнеры.КонтактнаяИнформация КАК ПартнерыКонтактнаяИнформацияТелефон
ПО Партнеры.Ссылка = ПартнерыКонтактнаяИнформацияТелефон.Ссылка
И (ПартнерыКонтактнаяИнформацияТелефон.Вид = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.ТелефонПартнера))
Разберем этот запрос по шагам:
Справочник.Партнеры.ЛЕВОЕ СОЕДИНЕНИЕ подключает табличную часть КонтактнаяИнформация (под псевдонимом ПартнерыКонтактнаяИнформацияПочта). В условии соединения мы связываем записи по владельцу (Партнеры.Ссылка = ПартнерыКонтактнаяИнформацияПочта.Ссылка) и сразу же накладываем фильтр, чтобы выбрать только строки с типом "EmailПартнера": И (ПартнерыКонтактнаяИнформацияПочта.Вид = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.EmailПартнера)).ЛЕВОЕ СОЕДИНЕНИЕ делает то же самое, но уже для телефона (псевдоним ПартнерыКонтактнаяИнформацияТелефон), отбирая строки с видом ТелефонПартнера.ВЫБРАТЬ мы выводим ссылку на партнера и поле Представление из каждой присоединенной таблицы, получая таким образом почту и телефон в отдельных колонках.Важно: Названия видов контактной информации, такие как EmailПартнера и ТелефонПартнера, являются предопределенными элементами справочника ВидыКонтактнойИнформации. Убедитесь, что используете правильные имена для вашей конфигурации — для настройки обязательности полей без кода подойдёт контроль заполнения реквизитов в 1С.
Хотя предыдущий способ работает, в современных типовых конфигурациях на базе "Библиотеки стандартных подсистем" (БСП) контактная информация хранится не только в табличной части. Основным хранилищем является периодический регистр сведений КонтактнаяИнформация. Этот регистр позволяет хранить историю изменений контактов.
Для получения актуальных (последних действующих) данных правильнее обращаться к виртуальной таблице регистра КонтактнаяИнформация.СрезПоследних. Этот подход более надежен и универсален.
Пример запроса с использованием среза последних:
ВЫБРАТЬ
Партнеры.Ссылка КАК Партнер,
Партнеры.Наименование КАК НаименованиеПартнера,
Телефоны.Представление КАК Телефон,
Почта.Представление КАК ЭлектроннаяПочта
ИЗ
Справочник.Партнеры КАК Партнеры
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КонтактнаяИнформация.СрезПоследних КАК Телефоны
ПО Партнеры.Ссылка = Телефоны.Объект
И (Телефоны.Вид = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.ТелефонПартнера))
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КонтактнаяИнформация.СрезПоследних КАК Почта
ПО Партнеры.Ссылка = Почта.Объект
И (Почта.Вид = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.EmailПартнера))
Структура запроса очень похожа на первую, но есть отличия:
РегистрСведений.КонтактнаяИнформация.СрезПоследних.Объект, а не Ссылка.Этот способ является предпочтительным для построения запросов в отчетах, так как он соответствует архитектуре хранения данных в БСП и гарантирует получение именно актуальной информации. Для этой задачи есть вывод ИНН в список партнеров и поиск по ним в УТ 11.5.
Самым правильным и "бесшовным" способом получения контактной информации является использование функций из общих модулей конфигурации. Разработчики 1С уже создали программный интерфейс (API), который скрывает всю сложность хранения и получения данных. Для работы с контактной информацией в УТ 11.5 предназначен общий модуль УправлениеКонтактнойИнформацией.
Использование этого модуля гарантирует, что ваш код будет работать корректно даже после обновлений конфигурации, так как вам не нужно беспокоиться об изменениях в структуре хранения данных.
Рассмотрим пример кода на встроенном языке 1С:
// Предположим, у нас есть переменная СсылкаНаПартнера, содержащая ссылку на элемент справочника "Партнеры"
// 1. Получаем всю контактную информацию по объекту в виде таблицы значений
ТаблицаКонтактов = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъекта(СсылкаНаПартнера);
// 2. Ищем нужные строки в полученной таблице по имени вида контакта
НайденнаяСтрокаПочты = ТаблицаКонтактов.Найти("EmailПартнера", "Вид");
НайденнаяСтрокаТелефона = ТаблицаКонтактов.Найти("ТелефонПартнера", "Вид");
// 3. Получаем представления и выводим их
Если НайденнаяСтрокаПочты <> Неопределено Тогда
Сообщить("Email: " + НайденнаяСтрокаПочты.Представление);
КонецЕсли;
Если НайденнаяСтрокаТелефона <> Неопределено Тогда
Сообщить("Телефон: " + НайденнаяСтрокаТелефона.Представление);
КонецЕсли;
Этот метод идеален, если вам нужно получить контакты не в запросе, а при обработке данных в коде (например, в модуле формы или объекта). Он прост, надежен и не требует написания сложных запросов.
Итог: для построения отчета в СКД или простого запроса используйте Решение 2 (запрос к регистру КонтактнаяИнформация.СрезПоследних). Если вам нужно получить данные программно в модуле, наилучшим выбором будет Решение 3 (использование функций общего модуля УправлениеКонтактнойИнформацией).