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