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

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

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

Причина проблемы: использование вложенных выборок

Рассмотрим ситуацию, когда в запросе используется синтаксис с круглыми скобками для обращения к табличной части объекта через ссылку. Например:


ВЫБРАТЬ
    ДокПрием.Сотрудник.КонтактнаяИнформация.(Представление) КАК Адрес
ИЗ
    Документ.Прием.Состав КАК ДокПрием

В данном случае платформа 1С интерпретирует конструкцию в скобках как команду создать вложенную выборку. Даже если у сотрудника в табличной части всего одна строка, поле Адрес в результирующей таблице будет содержать не строку, а объект типа РезультатЗапроса. Проанализируем, как можно преобразовать этот запрос в "плоский" вид, где каждая характеристика будет представлена отдельным полем.

Решение: Левое соединение с табличной частью

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

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

Рассмотрим исправленный пример кода:


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

Оптимизация: избавляемся от лишних соединений

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

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

Тонкости фильтрации контактной информации

При работе с контактной информацией или другими табличными частями следует помнить о нескольких правилах:

Таким образом, для получения строкового значения из табличной части в запросе мы всегда используем соединение с нужной таблицей и накладываем фильтр по виду данных, избегая вложенных конструкций в блоке ВЫБРАТЬ.

← На главную