Как правильно получить адрес электронной почты контрагента с отбором по статусу в 1С

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

При работе с современными конфигурациями на базе 1С:Предприятие 8 часто возникает задача выгрузки контактной информации (например, адресов электронной почты) с определенным фильтром по свойствам владельца. На первый взгляд задача кажется простой, но разработчики часто сталкиваются с ситуацией, когда запрос, выглядящий корректно, возвращает пустой результат. В этой статье мы разберем, почему так происходит, и как правильно составить запрос к контактной информации.

Анализ проблемы: почему запрос возвращает пустой результат

Рассмотрим ситуацию: нам нужно получить список «Контрагент — Почта», отфильтрованный по статусу контрагента. Часто разработчики пытаются использовать следующий код:


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

Если этот запрос не выдает данных, хотя контрагенты с нужным статусом существуют, необходимо проанализировать несколько аспектов системы. Выясним основные причины «пустоты» в консоли запросов.

Разделение сущностей «Партнер» и «Контрагент»

В современных типовых решениях, таких как 1С:ERP Управление предприятием, 1С:Управление торговлей 11 или 1С:Комплексная автоматизация 2, реализована концепция разделения управленческого и регламентированного учета. В этих системах существуют два разных справочника:

  1. Партнеры — используются для управленческого учета, CRM-процессов и хранения общих статусов взаимодействия.
  2. Контрагенты — хранят юридические данные (ИНН, КПП) для регламентированного учета.

Важный нюанс: Статус (например, «Действует», «Закрыт») и контактная информация часто привязываются именно к Партнеру, а не к Контрагенту. Если вы делаете запрос к справочнику Справочник.Контрагенты, а данные занесены в карточку партнера, запрос будет пустым. Проверьте связь через поле Контрагент.Партнер.

Особенности работы с табличными частями контактной информации

Контактная информация в 1С обычно хранится в табличных частях (ТЧ) объектов. Мы можем обращаться к ней напрямую, что зачастую эффективнее и проще. Рассмотрим правильный подход к построению запроса через ТЧ:


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

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

Фильтрация по типу и виду контактной информации

В табличной части КонтактнаяИнформация хранятся записи разных типов: телефоны, адреса, email. Поле АдресЭП будет заполнено только в строках с типом «Адрес электронной почты». Если мы просто берем МАКСИМУМ(АдресЭП) без фильтра по типу, мы рискуем получить некорректные данные или пустые значения.

Рассмотрим подробнее, как добавить фильтр по предопределенному виду, чтобы получить именно «Рабочий email», а не личный адрес сотрудника:


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

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

Проверка параметров в консоли запросов

Если запрос все равно пустой, разберем технический момент работы в консоли. Поле СтатусКонтрагента обычно имеет тип Перечисление. При установке параметра &СтатусКонтрагента в консоли запросов убедитесь, что:

Использование «битых» ссылок и пустых строк

Иногда в базе данных могут присутствовать записи с визуально пустыми, но технически заполненными полями (например, пробелами). Чтобы очистить результат, рекомендуем добавлять проверку на пустую строку:


ГДЕ
    КИ.АдресЭП <> ""
    И НЕ КИ.АдресЭП ЕСТЬ NULL

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

← На главную