Как запросом получить актуальную контактную информацию контрагентов в УТ 11 с учетом истории изменений?

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

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

Разберем подробно, как правильно извлечь актуальный юридический адрес, телефон или email, избежав дублей и ошибок выбора устаревших данных. Подобные задачи часто возникают при построении сложных отчетов, где требуется реализовать срез последних N записей в СКД для каждой категории данных.

Проблема: дублирование строк и исторические данные

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

  1. Дубли строк: Если у контрагента заведено несколько адресов (например, история изменения юр. адреса), в выборку попадут все записи.
  2. Актуальность: Нам нужно выбрать только ту запись, которая действует на текущий момент (имеет максимальную дату начала действия, но не больше текущей).

Рассмотрим два основных подхода к решению этой задачи: прямой запрос к базе данных и использование программного интерфейса БСП.

Способ 1: Получение данных прямым запросом (Оптимальный вариант)

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

Проанализируем правильный алгоритм действий:

  1. Отбираем записи нужного вида (например, Юридический адрес).
  2. Группируем их по Ссылке и находим МАКСИМУМ по полю ДействуетС.
  3. Помещаем результат во временную таблицу.
  4. Соединяем исходную табличную часть с этой временной таблицей по двум полям: Ссылка и ДействуетС.

Посмотрим на пример кода запроса, который решает эту задачу корректно:


ВЫБРАТЬ
    КИ.Ссылка КАК Ссылка,
    МАКСИМУМ(КИ.ДействуетС) КАК ДействуетС
ПОМЕСТИТЬ ВТ_МаксимальныеДаты
ИЗ
    Справочник.Контрагенты.КонтактнаяИнформация КАК КИ
ГДЕ
    КИ.Вид = &ВидЮрАдрес
    // Важно: отсекаем записи, которые начнут действовать в будущем
    И КИ.ДействуетС <= &ТекущаяДата 
СГРУППИРОВАТЬ ПО
    КИ.Ссылка
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Контрагенты.Ссылка КАК Контрагент,
    Контрагенты.ИНН,
    ЕСТЬNULL(КИ_Детали.Представление, "") КАК ЮридическийАдрес
ИЗ
    Справочник.Контрагенты КАК Контрагенты
    
    // Присоединяем таблицу с максимальными датами
    ЛЕВОЕ СОЕДИНЕНИЕ ВТ_МаксимальныеДаты КАК ВТ_Даты
    ПО Контрагенты.Ссылка = ВТ_Даты.Ссылка
    
    // Присоединяем реальную таблицу КИ по дате
    ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты.КонтактнаяИнформация КАК КИ_Детали
    ПО ВТ_Даты.Ссылка = КИ_Детали.Ссылка 
    И ВТ_Даты.ДействуетС = КИ_Детали.ДействуетС
    И КИ_Детали.Вид = &ВидЮрАдрес

Важные нюансы данного подхода:

Способ 2: Использование механизмов БСП (Рекомендуемый)

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

В УТ 11 существует общий модуль УправлениеКонтактнойИнформацией. Рассмотрим ключевые функции.

Получение информации сразу для списка объектов

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


// Подготовим список контрагентов
МассивСсылок = Новый Массив;
МассивСсылок.Добавить(СсылкаНаКонтрагента1);
МассивСсылок.Добавить(СсылкаНаКонтрагента2);

// Определим типы или виды КИ, которые нам нужны (необязательно)
// Если не передать, вернет все виды
ТипыКИ = Новый Массив;
ТипыКИ.Добавить(Перечисления.ТипыКонтактнойИнформации.Адрес);

// Вызываем функцию БСП
ТаблицаКИ = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъектов(
    МассивСсылок, 
    ТипыКИ, 
    , 
    ТекущаяДата() // Дата актуальности
);

// Обрабатываем результат
Для Каждого СтрокаТЗ Из ТаблицаКИ Цикл
    Сообщить("Контрагент: " + СтрокаТЗ.Объект + ", Адрес: " + СтрокаТЗ.Представление);
КонецЦикла;

Этот метод автоматически учитывает поле ДействуетС, выбирает актуальные записи и формирует корректное представление.

Архитектурные особенности УТ 11: Партнеры и Контрагенты

При работе с "Управлением торговлей 11" необходимо помнить о разделении сущностей. У нас есть Партнеры (управленческий учет) и Контрагенты (регламентированный учет, "юрлица").

Рассмотрим ситуацию, когда запрос по справочнику Контрагенты возвращает пустоту, хотя в карточке адрес виден. Это происходит потому, что контактная информация может храниться в справочнике Партнеры. Это критично учитывать, когда вы проводите анализ неактивных клиентов в УТ 11.5, КА 2.5 или ERP 2.5, так как взаимодействия могут фиксироваться по разным сущностям.

Как с этим работать:

  1. В справочнике Контрагенты есть реквизит Партнер.
  2. Логика системы часто подразумевает "наследование": если у Контрагента не задан собственный адрес, используется адрес Партнера.
  3. Если вы пишете прямой запрос, вам придется делать ЕСТЬNULL и соединять две таблицы (Контрагенты.КИ и Партнеры.КИ).
  4. В некоторых случаях требуется расширить возможности учета, например, фиксировать представителей торговых точек и специфические данные по ним (дни обзвона и т.д.).

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


ВЫБРАТЬ
    Контрагенты.Ссылка,
    ЕСТЬNULL(КИ_Контрагента.Представление, КИ_Партнера.Представление) КАК АктуальныйАдрес
...

Резюме

← На главную