К статье
Практический материал

Разработка и Конфигурация · 13 мин

Тип значения как строка в запросе 1С: рабочие способы и ограничения

Как получить тип значения в виде строки в запросе 1С: ВЫБОР с ТИПЗНАЧЕНИЯ, ПРЕДСТАВЛЕНИЕ, сравнение способов, примеры кода, типичные ошибки и FAQ.

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

Чаще всего вопрос возникает у разработчиков универсальных отчётов и обработок, где поле может хранить ссылку составного типа — например, «ДокументОснование» или «Контрагент» с типами «Справочник.Контрагенты» и «Справочник.Организации». В таких случаях нужно вывести в колонку читаемое имя типа: «Справочник.Контрагенты», «Документ.РеализацияТоваровУслуг» и т.д. Ниже разобраны все рабочие варианты с примерами и ограничениями каждого.

Почему ТИПЗНАЧЕНИЯ не возвращает строку

Оператор ТИПЗНАЧЕНИЯ(<Поле>) в запросе возвращает значение специального вида — тип. Его можно сравнить с конструкцией ТИП(Справочник.Номенклатура), использовать в условии ГДЕ или в ВЫБОР, но нельзя присвоить полю строкового типа или вывести как текст. Если попытаться поместить результат ТИПЗНАЧЕНИЯ() в итоговое поле выборки, консоль запросов покажет тип в виде служебного обозначения, однако программно преобразовать его в строку средствами самого запроса не получится.

Это осознанное ограничение платформы: запрос работает с типизированными данными, а текстовое имя типа — метаинформация, которая по замыслу разработчиков обрабатывается на уровне встроенного языка. Поэтому все решения делятся на две группы: «собрать строку вручную внутри запроса» и «получить тип после выполнения запроса в коде».

Способ 1. ВЫБОР с перечислением типов — основной приём

Классическое решение — конструкция ВЫБОР, где каждому типу вручную сопоставляется строковый литерал. Запрос перебирает известные типы поля и возвращает нужную строку:

ВЫБРАТЬ

Реестр.ДокументОснование КАК Основание,

ВЫБОР

КОГДА ТИПЗНАЧЕНИЯ(Реестр.ДокументОснование) = ТИП(Документ.РеализацияТоваровУслуг)

ТОГДА "Документ.РеализацияТоваровУслуг"

КОГДА ТИПЗНАЧЕНИЯ(Реестр.ДокументОснование) = ТИП(Документ.ПоступлениеТоваровУслуг)

ТОГДА "Документ.ПоступлениеТоваровУслуг"

КОГДА Реестр.ДокументОснование ЕСТЬ NULL

ТОГДА "Не указано"

ИНАЧЕ "Прочий тип"

КОНЕЦ КАК ТипСтрокой

ИЗ

РегистрСведений.РеестрДокументов КАК Реестр

Плюс подхода — полный контроль над текстом: можно выводить синонимы («Реализация»), технические имена или любые собственные обозначения. Минус очевиден: все типы нужно перечислить вручную, и при добавлении нового типа в составное поле запрос придётся дорабатывать, иначе значение попадёт в ветку ИНАЧЕ.

Когда перечислять типы долго

Если составной тип включает десятки видов документов, вручную писать ветки нерационально. В этом случае текст запроса генерируют программно: в модуле обходят Метаданные.Документы (или типы из описания типов поля) и для каждого добавляют строку КОГДА ... ТОГДА "...". Такой шаблон собирается один раз при формировании отчёта, а дальше выполняется как обычный запрос.

Способ 2. ПРЕДСТАВЛЕНИЕ ссылки и разбор в коде

Функция ПРЕДСТАВЛЕНИЕ(<Ссылка>) возвращает строку вида «Реализация товаров и услуг 0000-000001 от 12.01.2026». Имя типа здесь не выводится отдельно, но представление пригодно, когда цель — показать пользователю, что за объект в поле, а не получить техническое имя типа. Для отчётов «покажите мне основание» этого часто достаточно, и запрос остаётся простым:

ВЫБРАТЬ

Реестр.ДокументОснование КАК Основание,

ПРЕДСТАВЛЕНИЕ(Реестр.ДокументОснование) КАК ОснованиеПредставление

ИЗ

РегистрСведений.РеестрДокументов КАК Реестр

Ограничение принципиально: представление зависит от синонима объекта и данных самой ссылки, а не от метаданных. Два документа разных видов с похожими синонимами дадут похожие строки, и надёжно восстановить тип из такого текста нельзя. Использовать ПРЕДСТАВЛЕНИЕ для программной логики (сравнений, соединений) — ошибка.

Типичные ошибки
01
Попытка сравнить ТИПЗНАЧЕНИЯ(Поле) со строкой — запрос упадёт с ошибкой несоответствия типов, сравнивать нужно только с ТИП(...)
02
Использование ПРЕДСТАВЛЕНИЕ(Поле) для программного определения типа — представление зависит от локализации и синонимов, логика сломается
03
Отсутствие ветки ИНАЧЕ в ВЫБОР — при появлении нового типа поле вернёт NULL, что исказит итоги и группировки
04
Сравнение типов через представление поля в соединениях — такие соединения не используют индексы и резко замедляют запрос

Способ 3. Определение типа после запроса через ТипЗнч()

Если запрос нужен только для выборки ссылок, а тип требуется для логики обработки, самый честный путь — получить ссылку в запросе, а тип вычислить уже в модуле:

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл

ТипСсылки = ТипЗнч(Выборка.Основание);

ИмяТипа = Метаданные.НайтиПоТипу(ТипСсылки).ПолноеИмя(); // "Документ.РеализацияТоваровУслуг"

КонецЦикла;

Метод Метаданные.НайтиПоТипу() возвращает объект метаданных, а его свойство ПолноеИмя() — точное техническое имя вида «Документ.РеализацияТоваровУслуг» или «Справочник.Номенклатура». Это единственный способ получить каноническое имя типа без ручного перечисления. Для примитивных типов (число, строка) НайтиПоТипу вернёт Неопределено, поэтому результат нужно проверять.

Недостаток — обход выборки в коде, что для больших таблиц медленнее, чем вычисление на сервере СУБД. Поэтому приём оправдан, когда тип нужен для построчной логики, а не для группировки миллионов записей.

Выбор подходящего способа
  1. 1
    Определите цель: отбор по типу, отображение пользователю или программная логика
  2. 2
    Для отбора используйте ГДЕ ТИПЗНАЧЕНИЯ(Поле) = ТИП(...) — строка вообще не нужна
  3. 3
    Для вывода пользователю добавьте ВЫБОР с перечислением типов или ПРЕДСТАВЛЕНИЕ
  4. 4
    Для точного технического имени типа вычислите его в коде через ТипЗнч() и Метаданные.НайтиПоТипу()
  5. 5
    Проверьте результат на данных с NULL и пустыми ссылками

Отбор по типу без строки: частый частный случай

Значительная часть запросов «тип как строка» на деле сводится к задаче «выбрать только документы определённого вида». Здесь строка не нужна вовсе — достаточно условия:

ВЫБРАТЬ

Реестр.ДокументОснование КАК Основание

ИЗ

РегистрСведений.РеестрДокументов КАК Реестр

ГДЕ

ТИПЗНАЧЕНИЯ(Реестр.ДокументОснование) = ТИП(Документ.РеализацияТоваровУслуг)

Альтернатива с тем же результатом — оператор ССЫЛКА: ГДЕ Реестр.ДокументОснование ССЫЛКА Документ.РеализацияТоваровУслуг. Оба варианта корректны; ССЫЛКА короче и читается проще, а ТИПЗНАЧЕНИЯ универсальнее, если тип передаётся параметром. Важно понимать, что такой отбор по составному полю, как правило, не использует индекс эффективно, и на больших таблицах стоит проверить план запроса.

Сравнение способов

ВЫБОР + ТИПЗНАЧЕНИЯ

Подходит для вывода имени типа в отчёты и СКД. Требует ручного перечисления типов, нужна доработка при расширении составного типа

ПРЕДСТАВЛЕНИЕ

Подходит для отображения объекта пользователю. Не даёт техническое имя типа, непригодно для программной логики

ТипЗнч() в коде после запроса

Даёт точное метаданное имя без перечисления. Требует обхода выборки, медленнее на больших объёмах

ГДЕ ТИПЗНАЧЕНИЯ / ССЫЛКА

Решает задачу отбора без строки вовсе. Самый быстрый вариант, но только для фильтрации

Работа со строкой типа в СКД и динамических списках

В системе компоновки данных вычисляемые поля позволяют использовать тот же приём с ВЫБОР уже на уровне выражения компоновки, а не текста запроса. Это удобно, когда один и тот же набор данных используется в нескольких вариантах отчёта: запрос остаётся простым, а «тип строкой» добавляется вычисляемым полем. Учтите, что в выражениях СКД доступен свой диалект языка — функция ТипЗначения() там есть, но сравнение типов оформляется через Тип() аналогично запросу.

В динамических списках с произвольным запросом колонку «Тип» добавляют тем же ВЫБОР. Практическая деталь: если список должен сортироваться по этой колонке, вычисляемое поле замедлит выборку, потому что сортировка по результату ВЫБОР не использует индексы. Для журналов с сотнями тысяч записей лучше ограничить составной тип на уровне метаданных или хранить вид документа в отдельном измерении.

Маршрут решения

Как выбрать действие

Нужно просто отфильтровать записи по виду документаИспользуйте ГДЕ ТИПЗНАЧЕНИЯ(Поле) = ТИП(...) или ССЫЛКА — строка не требуется
Нужно показать пользователю, что за объект в полеДобавьте поле ПРЕДСТАВЛЕНИЕ(Поле) — этого достаточно для отображения
Нужна колонка с именем типа в отчёте на СКДСоберите ВЫБОР с перечислением типов в запросе или вычисляемом поле
Нужно точное техническое имя типа для программной логикиВычислите тип после запроса через ТипЗнч() и Метаданные.НайтиПоТипу().ПолноеИмя()
Составной тип содержит много видов и часто расширяетсяГенерируйте текст ВЫБОР программно обходом метаданных при построении запроса

Производительность и ограничения

Сравнение ТИПЗНАЧЕНИЯ в условии и ветках ВЫБОР выполняется на сервере СУБД и само по себе недорогое, но оно мешает оптимизатору использовать индексы по составному полю. На больших регистрах сведений и журналах документов отбор по типу может превратиться в полное сканирование. Признак проблемы — резкий рост времени выполнения при добавлении условия по типу.

Если фильтрация по типу нужна постоянно, архитектурно правильнее вынести вид объекта в отдельное поле (измерение или реквизит) и заполнять его при записи. Запросы по такому полю индексируются нормально, а имя типа хранится сразу строкой. Это редизайн структуры данных, поэтому решение принимают на этапе проектирования, а не как быструю правку.

Ещё одно ограничение касается внешних источников данных и временных таблиц: для полей, пришедших из внешних источников, поведение ТИПЗНАЧЕНИЯ зависит от того, как типизировано поле, и в ряде случаев сравнение типов недоступно. В таких сценариях тип определяют на стороне кода после выгрузки результата.

Контрольные точки

Как проверить результат

Колонка с типом в консоли запросов
Норма

Строки вида «Документ.РеализацияТоваровУслуг» или заданные вами обозначения

Тревожный признак

NULL, пустые строки или «Прочий тип» там, где тип известен

Записи с пустым основанием
Норма

Попадают в отдельную ветку «Не указано»

Тревожный признак

Пустые ссылки смешаны с реальными типами

Время выполнения запроса
Норма

Сопоставимо с запросом без условия по типу

Тревожный признак

Рост времени в разы после добавления ТИПЗНАЧЕНИЯ

Поведение после добавления нового вида документа
Норма

Новый тип отображается корректно

Тревожный признак

Новые документы попадают в ИНАЧЕ — запрос требует доработки

Частые вопросы

Можно ли преобразовать ТИПЗНАЧЕНИЯ в строку прямо в запросе функцией?

Нет, такой встроенной функции в языке запросов 1С не существует. Все решения — обходные: ВЫБОР с сопоставлением типов строкам, ПРЕДСТАВЛЕНИЕ для отображения или вычисление типа в коде после выполнения запроса через ТипЗнч() и Метаданные.НайтиПоТипу().

Что вернёт ТИПЗНАЧЕНИЯ для пустой ссылки или NULL?

Для NULL оператор вернёт тип неопределённого значения, а для пустой ссылки — соответствующий ссылочный тип. Сравнение с ТИП(Справочник.Номенклатура) для пустой ссылки этого справочника даст Истина, а для NULL — Ложь. Поэтому проверку ЕСТЬ NULL стоит ставить первой веткой ВЫБОР.

Чем отличается проверка ССЫЛКА от ТИПЗНАЧЕНИЯ?

Оба оператора проверяют тип поля, но ССЫЛКА пишется как «Поле ССЫЛКА Документ.Реализация» и читается проще, а ТИПЗНАЧЕНИЯ позволяет сравнить тип со значением, полученным из другого поля или параметра. По результату для ссылочных типов они эквивалентны.

Как получить синоним типа, а не техническое имя?

В запросе — только вручную через ВЫБОР, подставляя нужный текст в каждую ветку. В коде можно получить синоним через Метаданные.НайтиПоТипу(ТипЗнч(Ссылка)).Синоним. Автоматического способа вывести синоним типа средствами запроса нет.

Работает ли приём с ВЫБОР в СКД и динамических списках?

Да, конструкция ВЫБОР с ТИПЗНАЧЕНИЯ корректно работает в тексте запроса СКД, в вычисляемых полях компоновки и в произвольных запросах динамических списков. Учитывайте только, что сортировка и отбор по такому вычисляемому полю не используют индексы и могут замедлить выборку на больших таблицах.

Можно ли передать тип в запрос параметром и сравнить с ТИПЗНАЧЕНИЯ?

Да, параметру можно присвоить значение типа «Тип» (например, Тип("ДокументСсылка.РеализацияТоваровУслуг")) и написать условие ГДЕ ТИПЗНАЧЕНИЯ(Поле) = &Тип. Это удобно для универсальных обработок, где нужный тип выбирает пользователь.

Итог

Что важно запомнить

Строкового представления типа в языке запросов 1С нет. Для отбора используйте ТИПЗНАЧЕНИЯ или ССЫЛКА без строки, для вывода имени типа — ВЫБОР с перечислением типов или ПРЕДСТАВЛЕНИЕ, а точное техническое имя получайте в коде через ТипЗнч() и Метаданные.НайтиПоТипу(). Всегда обрабатывайте NULL и помните о влиянии на производительность больших таблиц.