Как правильно получить контактную информацию контрагента в запросе 1С

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

При разработке отчетов или обработок в 1С:Управление нашей фирмой (УНФ) часто возникает задача вывести список контрагентов, совершивших покупки, вместе с их контактной информацией (адресом, телефоном или email). Однако начинающие разработчики часто сталкиваются с ситуацией, когда запрос вместо ожидаемых данных возвращает пустоту или значения NULL. Разберем пошагово, как правильно составить такой запрос, и выясним причины, по которым данные могут не выбираться.

Проблема использования условий в секции ГДЕ при левом соединении

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

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

Правильное соединение таблиц

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


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

В данном примере мы используем объект Справочник.Контрагенты.КонтактнаяИнформация. Обратите внимание, что условие по периоду остается в секции ГДЕ, так как оно относится к основной (левой) таблице запроса.

Почему запрос все равно возвращает NULL?

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

  1. Отсутствие данных в базе: Самая очевидная причина — у выбранных контрагентов действительно не заполнен «Фактический адрес» в карточке. Чтобы проверить это, попробуйте временно убрать из соединения условия по Типу и Виду. Если после этого данные появятся, значит, проблема в фильтрах.
  2. Неверный Вид контактной информации: В разных конфигурациях (или даже в разных версиях УНФ) предопределенные элементы могут называться по-разному. Выясним причину, проверив справочник ВидыКонтактнойИнформации. Возможно, вместо ФактАдресКонтрагента используется АдресФактическийКонтрагента.
  3. Место хранения данных: В современных конфигурациях на базе БСП (Библиотеки Стандартных Подсистем) контактная информация может храниться не в табличной части справочника, а в регистре сведений КонтактнаяИнформация. Если ваш запрос к табличной части не дает результатов, попробуем обратиться к регистру.

Использование регистра сведений Контактная информация

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


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

Важный момент: Обратите внимание, что в данном примере мы заменили основную таблицу РегистрНакопления.Продажи на виртуальную таблицу Обороты. Это значительно повышает производительность запроса и избавляет от дублирования строк, если один и тот же контрагент совершал несколько покупок за период.

Методика отладки запроса по шагам

Если результат запроса вас не устраивает, выполните следующие действия вместе с нами:

  1. Шаг 1. Проверьте связь. Убедитесь, что поле Контрагент в регистре продаж заполнено и соответствует ссылке в справочнике.
  2. Шаг 2. Упростите запрос. Уберите все условия из ПО и ГДЕ, оставьте только ЛЕВОЕ СОЕДИНЕНИЕ по ссылке. Если вы увидите в результате много строк для каждого контрагента (все его телефоны, адреса, почту), значит, связь работает.
  3. Шаг 3. Добавляйте условия постепенно. Сначала добавьте Тип, проверьте результат. Затем добавьте Вид. Так вы поймете, на каком этапе «отваливаются» данные.
  4. Шаг 4. Проверьте настройки программы. В некоторых версиях 1С:УНФ адрес может храниться в виде JSON-строки в поле ЗначенияПолей. В этом случае поле Представление может быть пустым до тех пор, пока запись не будет пересохранена.

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

← На главную