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