Разработка и Конфигурация · 13 мин
Тип значения как строка в запросе 1С: рабочие способы и ограничения
Как получить тип значения в виде строки в запросе 1С: ВЫБОР с ТИПЗНАЧЕНИЯ, ПРЕДСТАВЛЕНИЕ, сравнение способов, примеры кода, типичные ошибки и FAQ.
В языке запросов 1С нет функции, которая напрямую возвращает имя типа значения строкой, как это делает метод встроенного языка ТипЗнч() в связке со строковым представлением. Оператор ТИПЗНАЧЕНИЯ() возвращает именно тип, а не текст, поэтому использовать его результат в группировках, соединениях по строке или выгрузке в текстовый отчёт напрямую нельзя. Тем не менее задача решается несколькими обходными приёмами, и выбор зависит от того, нужен ли тип для отбора, для отображения пользователю или для дальнейшей обработки в коде.
Чаще всего вопрос возникает у разработчиков универсальных отчётов и обработок, где поле может хранить ссылку составного типа — например, «ДокументОснование» или «Контрагент» с типами «Справочник.Контрагенты» и «Справочник.Организации». В таких случаях нужно вывести в колонку читаемое имя типа: «Справочник.Контрагенты», «Документ.РеализацияТоваровУслуг» и т.д. Ниже разобраны все рабочие варианты с примерами и ограничениями каждого.
Почему ТИПЗНАЧЕНИЯ не возвращает строку
Оператор ТИПЗНАЧЕНИЯ(<Поле>) в запросе возвращает значение специального вида — тип. Его можно сравнить с конструкцией ТИП(Справочник.Номенклатура), использовать в условии ГДЕ или в ВЫБОР, но нельзя присвоить полю строкового типа или вывести как текст. Если попытаться поместить результат ТИПЗНАЧЕНИЯ() в итоговое поле выборки, консоль запросов покажет тип в виде служебного обозначения, однако программно преобразовать его в строку средствами самого запроса не получится.
Это осознанное ограничение платформы: запрос работает с типизированными данными, а текстовое имя типа — метаинформация, которая по замыслу разработчиков обрабатывается на уровне встроенного языка. Поэтому все решения делятся на две группы: «собрать строку вручную внутри запроса» и «получить тип после выполнения запроса в коде».
Способ 1. ВЫБОР с перечислением типов — основной приём
Классическое решение — конструкция ВЫБОР, где каждому типу вручную сопоставляется строковый литерал. Запрос перебирает известные типы поля и возвращает нужную строку:
ВЫБРАТЬ
Реестр.ДокументОснование КАК Основание,
ВЫБОР
КОГДА ТИПЗНАЧЕНИЯ(Реестр.ДокументОснование) = ТИП(Документ.РеализацияТоваровУслуг)
ТОГДА "Документ.РеализацияТоваровУслуг"
КОГДА ТИПЗНАЧЕНИЯ(Реестр.ДокументОснование) = ТИП(Документ.ПоступлениеТоваровУслуг)
ТОГДА "Документ.ПоступлениеТоваровУслуг"
КОГДА Реестр.ДокументОснование ЕСТЬ NULL
ТОГДА "Не указано"
ИНАЧЕ "Прочий тип"
КОНЕЦ КАК ТипСтрокой
ИЗ
РегистрСведений.РеестрДокументов КАК Реестр
Плюс подхода — полный контроль над текстом: можно выводить синонимы («Реализация»), технические имена или любые собственные обозначения. Минус очевиден: все типы нужно перечислить вручную, и при добавлении нового типа в составное поле запрос придётся дорабатывать, иначе значение попадёт в ветку ИНАЧЕ.
Когда перечислять типы долго
Если составной тип включает десятки видов документов, вручную писать ветки нерационально. В этом случае текст запроса генерируют программно: в модуле обходят Метаданные.Документы (или типы из описания типов поля) и для каждого добавляют строку КОГДА ... ТОГДА "...". Такой шаблон собирается один раз при формировании отчёта, а дальше выполняется как обычный запрос.
Способ 2. ПРЕДСТАВЛЕНИЕ ссылки и разбор в коде
Функция ПРЕДСТАВЛЕНИЕ(<Ссылка>) возвращает строку вида «Реализация товаров и услуг 0000-000001 от 12.01.2026». Имя типа здесь не выводится отдельно, но представление пригодно, когда цель — показать пользователю, что за объект в поле, а не получить техническое имя типа. Для отчётов «покажите мне основание» этого часто достаточно, и запрос остаётся простым:
ВЫБРАТЬ
Реестр.ДокументОснование КАК Основание,
ПРЕДСТАВЛЕНИЕ(Реестр.ДокументОснование) КАК ОснованиеПредставление
ИЗ
РегистрСведений.РеестрДокументов КАК Реестр
Ограничение принципиально: представление зависит от синонима объекта и данных самой ссылки, а не от метаданных. Два документа разных видов с похожими синонимами дадут похожие строки, и надёжно восстановить тип из такого текста нельзя. Использовать ПРЕДСТАВЛЕНИЕ для программной логики (сравнений, соединений) — ошибка.
Способ 3. Определение типа после запроса через ТипЗнч()
Если запрос нужен только для выборки ссылок, а тип требуется для логики обработки, самый честный путь — получить ссылку в запросе, а тип вычислить уже в модуле:
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ТипСсылки = ТипЗнч(Выборка.Основание);
ИмяТипа = Метаданные.НайтиПоТипу(ТипСсылки).ПолноеИмя(); // "Документ.РеализацияТоваровУслуг"
КонецЦикла;
Метод Метаданные.НайтиПоТипу() возвращает объект метаданных, а его свойство ПолноеИмя() — точное техническое имя вида «Документ.РеализацияТоваровУслуг» или «Справочник.Номенклатура». Это единственный способ получить каноническое имя типа без ручного перечисления. Для примитивных типов (число, строка) НайтиПоТипу вернёт Неопределено, поэтому результат нужно проверять.
Недостаток — обход выборки в коде, что для больших таблиц медленнее, чем вычисление на сервере СУБД. Поэтому приём оправдан, когда тип нужен для построчной логики, а не для группировки миллионов записей.
- 1Определите цель: отбор по типу, отображение пользователю или программная логика
- 2Для отбора используйте ГДЕ ТИПЗНАЧЕНИЯ(Поле) = ТИП(...) — строка вообще не нужна
- 3Для вывода пользователю добавьте ВЫБОР с перечислением типов или ПРЕДСТАВЛЕНИЕ
- 4Для точного технического имени типа вычислите его в коде через ТипЗнч() и Метаданные.НайтиПоТипу()
- 5Проверьте результат на данных с NULL и пустыми ссылками
Отбор по типу без строки: частый частный случай
Значительная часть запросов «тип как строка» на деле сводится к задаче «выбрать только документы определённого вида». Здесь строка не нужна вовсе — достаточно условия:
ВЫБРАТЬ
Реестр.ДокументОснование КАК Основание
ИЗ
РегистрСведений.РеестрДокументов КАК Реестр
ГДЕ
ТИПЗНАЧЕНИЯ(Реестр.ДокументОснование) = ТИП(Документ.РеализацияТоваровУслуг)
Альтернатива с тем же результатом — оператор ССЫЛКА: ГДЕ Реестр.ДокументОснование ССЫЛКА Документ.РеализацияТоваровУслуг. Оба варианта корректны; ССЫЛКА короче и читается проще, а ТИПЗНАЧЕНИЯ универсальнее, если тип передаётся параметром. Важно понимать, что такой отбор по составному полю, как правило, не использует индекс эффективно, и на больших таблицах стоит проверить план запроса.
Сравнение способов
Подходит для вывода имени типа в отчёты и СКД. Требует ручного перечисления типов, нужна доработка при расширении составного типа
Подходит для отображения объекта пользователю. Не даёт техническое имя типа, непригодно для программной логики
Даёт точное метаданное имя без перечисления. Требует обхода выборки, медленнее на больших объёмах
Решает задачу отбора без строки вовсе. Самый быстрый вариант, но только для фильтрации
Работа со строкой типа в СКД и динамических списках
В системе компоновки данных вычисляемые поля позволяют использовать тот же приём с ВЫБОР уже на уровне выражения компоновки, а не текста запроса. Это удобно, когда один и тот же набор данных используется в нескольких вариантах отчёта: запрос остаётся простым, а «тип строкой» добавляется вычисляемым полем. Учтите, что в выражениях СКД доступен свой диалект языка — функция ТипЗначения() там есть, но сравнение типов оформляется через Тип() аналогично запросу.
В динамических списках с произвольным запросом колонку «Тип» добавляют тем же ВЫБОР. Практическая деталь: если список должен сортироваться по этой колонке, вычисляемое поле замедлит выборку, потому что сортировка по результату ВЫБОР не использует индексы. Для журналов с сотнями тысяч записей лучше ограничить составной тип на уровне метаданных или хранить вид документа в отдельном измерении.
Как выбрать действие
Производительность и ограничения
Сравнение ТИПЗНАЧЕНИЯ в условии и ветках ВЫБОР выполняется на сервере СУБД и само по себе недорогое, но оно мешает оптимизатору использовать индексы по составному полю. На больших регистрах сведений и журналах документов отбор по типу может превратиться в полное сканирование. Признак проблемы — резкий рост времени выполнения при добавлении условия по типу.
Если фильтрация по типу нужна постоянно, архитектурно правильнее вынести вид объекта в отдельное поле (измерение или реквизит) и заполнять его при записи. Запросы по такому полю индексируются нормально, а имя типа хранится сразу строкой. Это редизайн структуры данных, поэтому решение принимают на этапе проектирования, а не как быструю правку.
Ещё одно ограничение касается внешних источников данных и временных таблиц: для полей, пришедших из внешних источников, поведение ТИПЗНАЧЕНИЯ зависит от того, как типизировано поле, и в ряде случаев сравнение типов недоступно. В таких сценариях тип определяют на стороне кода после выгрузки результата.
Как проверить результат
Строки вида «Документ.РеализацияТоваровУслуг» или заданные вами обозначения
NULL, пустые строки или «Прочий тип» там, где тип известен
Попадают в отдельную ветку «Не указано»
Пустые ссылки смешаны с реальными типами
Сопоставимо с запросом без условия по типу
Рост времени в разы после добавления ТИПЗНАЧЕНИЯ
Новый тип отображается корректно
Новые документы попадают в ИНАЧЕ — запрос требует доработки
Частые вопросы
Можно ли преобразовать ТИПЗНАЧЕНИЯ в строку прямо в запросе функцией?
Нет, такой встроенной функции в языке запросов 1С не существует. Все решения — обходные: ВЫБОР с сопоставлением типов строкам, ПРЕДСТАВЛЕНИЕ для отображения или вычисление типа в коде после выполнения запроса через ТипЗнч() и Метаданные.НайтиПоТипу().
Что вернёт ТИПЗНАЧЕНИЯ для пустой ссылки или NULL?
Для NULL оператор вернёт тип неопределённого значения, а для пустой ссылки — соответствующий ссылочный тип. Сравнение с ТИП(Справочник.Номенклатура) для пустой ссылки этого справочника даст Истина, а для NULL — Ложь. Поэтому проверку ЕСТЬ NULL стоит ставить первой веткой ВЫБОР.
Чем отличается проверка ССЫЛКА от ТИПЗНАЧЕНИЯ?
Оба оператора проверяют тип поля, но ССЫЛКА пишется как «Поле ССЫЛКА Документ.Реализация» и читается проще, а ТИПЗНАЧЕНИЯ позволяет сравнить тип со значением, полученным из другого поля или параметра. По результату для ссылочных типов они эквивалентны.
Как получить синоним типа, а не техническое имя?
В запросе — только вручную через ВЫБОР, подставляя нужный текст в каждую ветку. В коде можно получить синоним через Метаданные.НайтиПоТипу(ТипЗнч(Ссылка)).Синоним. Автоматического способа вывести синоним типа средствами запроса нет.
Работает ли приём с ВЫБОР в СКД и динамических списках?
Да, конструкция ВЫБОР с ТИПЗНАЧЕНИЯ корректно работает в тексте запроса СКД, в вычисляемых полях компоновки и в произвольных запросах динамических списков. Учитывайте только, что сортировка и отбор по такому вычисляемому полю не используют индексы и могут замедлить выборку на больших таблицах.
Можно ли передать тип в запрос параметром и сравнить с ТИПЗНАЧЕНИЯ?
Да, параметру можно присвоить значение типа «Тип» (например, Тип("ДокументСсылка.РеализацияТоваровУслуг")) и написать условие ГДЕ ТИПЗНАЧЕНИЯ(Поле) = &Тип. Это удобно для универсальных обработок, где нужный тип выбирает пользователь.
Что важно запомнить
Строкового представления типа в языке запросов 1С нет. Для отбора используйте ТИПЗНАЧЕНИЯ или ССЫЛКА без строки, для вывода имени типа — ВЫБОР с перечислением типов или ПРЕДСТАВЛЕНИЕ, а точное техническое имя получайте в коде через ТипЗнч() и Метаданные.НайтиПоТипу(). Всегда обрабатывайте NULL и помните о влиянии на производительность больших таблиц.