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