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