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

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

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

Как работать с ТипЗначения и оператором ВЫРАЗИТЬ КАК СТРОКА в запросах 1С: синтаксис, примеры кода, типичные ошибки и проверка результата.

Задача «выразить значение как строку» в 1С возникает в двух типовых ситуациях: в языке запросов, когда нужно привести поле к строковому типу для сравнения, соединения или группировки, и во встроенном языке, когда требуется получить тип значения через ТипЗнч() и сравнить его с типом, заданным строкой. Обе задачи решаются штатными средствами платформы, но у каждого подхода есть ограничения, о которых нужно знать заранее.

Ключевые инструменты — оператор ВЫРАЗИТЬ в языке запросов и функции ТипЗнч(), Тип(), Строка() во встроенном языке. Ошибки здесь обычно связаны не с синтаксисом, а с непониманием того, как платформа хранит составные типы и что именно возвращает преобразование: например, приведение ссылки к строке в запросе невозможно напрямую, а Строка(Ссылка) в коде возвращает представление, а не уникальный идентификатор.

Ниже разобраны оба сценария с готовыми примерами кода, условиями выбора подхода, способами проверки результата и типичными ошибками, которые приводят к пустым выборкам и некорректным сравнениям.

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

Каждое значение в 1С имеет тип: примитивный (Строка, Число, Дата, Булево), ссылочный (СправочникСсылка, ДокументСсылка и т.д.) или составной, когда реквизит может хранить значения нескольких типов. Составной тип — частый источник проблем: в запросе такое поле нельзя напрямую сравнить со строкой или использовать в соединении, пока оно не приведено к конкретному типу.

Приведение к строке нужно в трёх практических случаях. Первый — сравнение или поиск подстроки в поле составного типа через ПОДОБНО. Второй — соединение таблиц по полям разных типов. Третий — получение текстового представления значения в коде для логирования, сообщений пользователю или формирования наименований.

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

Приведение к строке в запросе: оператор ВЫРАЗИТЬ

В языке запросов приведение выполняется конструкцией ВЫРАЗИТЬ(Поле КАК СТРОКА(Длина)). Длина указывается обязательно; если реальное значение длиннее, оно будет усечено. Типичный пример — поиск по комментарию или строковому реквизиту составного типа:

ВЫБРАТЬ

ВЫРАЗИТЬ(Документы.Комментарий КАК СТРОКА(200)) КАК КомментарийСтрока

ИЗ

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

ГДЕ

ВЫРАЗИТЬ(Документы.Комментарий КАК СТРОКА(200)) ПОДОБНО "%оплата%"

Оператор ВЫРАЗИТЬ работает и для сужения составного типа до ссылочного: ВЫРАЗИТЬ(Поле КАК Справочник.Номенклатура). Это не приведение к строке, но та же механика — часто именно она нужна, когда разработчик ищет «тип значения выразить как строка», а на деле требуется отфильтровать составное поле по конкретному типу ссылки.

Ограничение: ссылку нельзя выразить как строку

Попытка написать ВЫРАЗИТЬ(Ссылка КАК СТРОКА(36)) для получения GUID завершится ошибкой запроса. Платформа не поддерживает приведение ссылочных типов к строке в языке запросов. Если нужен текстовый идентификатор ссылки, это делается в коде после выполнения запроса — через Строка(Ссылка.УникальныйИдентификатор()).

Обходной вариант для соединений по строковому представлению — использовать в запросе поля-представления (например, Ссылка.Наименование) и приводить уже их. Но такое соединение ненадёжно: наименования могут совпадать или меняться, поэтому для связи таблиц всегда предпочтительнее соединение по ссылке.

Получение типа значения в коде: ТипЗнч и Тип

Во встроенном языке тип значения определяется связкой ТипЗнч() и Тип(). Первая функция возвращает тип конкретного значения, вторая — тип по его строковому имени. Сравнение выглядит так:

Если ТипЗнч(Значение) = Тип("СправочникСсылка.Номенклатура") Тогда

// обработка ссылки на номенклатуру

ИначеЕсли ТипЗнч(Значение) = Тип("Строка") Тогда

// значение уже строка

КонецЕсли;

Имя типа для ссылочных объектов строится по шаблону СправочникСсылка.ИмяСправочника, ДокументСсылка.ИмяДокумента, ПеречислениеСсылка.ИмяПеречисления. Ошибка в имени (например, «Справочники» вместо «СправочникСсылка») приведёт к исключению в момент вызова Тип(), поэтому имена удобно проверять через конфигуратор.

Для проверки принадлежности значения целой группе типов удобнее метод Метаданные.НайтиПоТипу() или проверка через Справочники.ТипВсеСсылки() и функцию СодержитТип() описания типов, если работа идёт с реквизитом составного типа.

bsl
Если ТипЗнч(Значение) = Тип("Строка") Тогда
	Результат = Значение;
Иначе
	Результат = Строка(Значение);
КонецЕсли;

Преобразование значения в строку во встроенном языке

Функция Строка(Значение) возвращает строковое представление: для чисел — текст числа с учётом форматирования по умолчанию, для дат — дату в формате по умолчанию, для ссылок — представление объекта (наименование или «Реализация товаров 0001 от …»). Это удобно для сообщений и логов, но не для машинной обработки.

Если нужен управляемый формат, используйте Формат(Значение, ФорматнаяСтрока). Например, Формат(Сумма, "ЧДЦ=2; ЧРД=.") даст число с двумя знаками и точкой-разделителем, а Формат(Дата, "ДФ=yyyy-MM-dd") — дату в ISO-виде. Это предпочтительнее, чем Строка(), когда строка идёт в файл обмена, запрос к веб-сервису или печатную форму.

Для уникального идентификатора ссылки есть отдельный путь: Строка(Ссылка.УникальныйИдентификатор()). Обратное преобразование — через Новый УникальныйИдентификатор(СтрокаGUID) и МенеджерОбъекта.ПолучитьСсылку(). Помните, что Строка(Ссылка) без УникальныйИдентификатор() вернёт представление, и восстановить ссылку из него невозможно.

Сравнение вариантов

ВЫРАЗИТЬ КАК СТРОКА в запросе

Подходит для отбора и вывода примитивных полей. Не работает со ссылками, требует явной длины, усекает значение.

Строка() в коде

Универсально, но для ссылок возвращает представление — не подходит для идентификации и обратного преобразования.

Формат() в коде

Даёт управляемый формат чисел и дат. Нужен, когда строка передаётся во внешние системы или файлы.

УникальныйИдентификатор()

Единственный надёжный способ получить строковый ID ссылки для обмена данными между базами.

Типичные сценарии: выбор подхода

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

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

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

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

Отдельный сценарий — работа с описанием типов реквизита. У объекта метаданных есть свойство Тип (объект ОписаниеТипов), у которого метод СодержитТип() проверяет, допускает ли реквизит конкретный тип. Это правильный способ анализа составных полей при универсальных обработках, когда имена типов заранее неизвестны.

Проверка результата и типичные ошибки

После применения ВЫРАЗИТЬ в запросе проверьте три вещи: не усечено ли значение из-за малой длины строки, не стали ли строки пустыми из-за несовпадения типа (при приведении к ссылочному типу несовпадающие значения дают NULL), и не пропали ли записи из-за условия по NULL. Быстрая проверка — вывести приведённое поле в результат запроса и просмотреть выборку в консоли запросов.

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

При работе с ТипЗнч в цикле по большой выборке учитывайте производительность: сама проверка типа недорогая, но если внутри ветки выполняются обращения к базе (например, получение реквизитов ссылки), лучше сначала сгруппировать значения по типам и обработать каждую группу отдельным запросом.

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

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

Поле после ВЫРАЗИТЬ КАК СТРОКА
Норма

Значения выводятся полностью, без обрезанных хвостов

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

Строки обрезаны на длине, указанной в операторе

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

Подходящие значения — ссылки, остальные — NULL

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

Все значения NULL: имя типа указано неверно

Сравнение ТипЗнч с Тип()
Норма

Условие срабатывает на тестовом значении нужного типа

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

Исключение «Неверное имя типа» при вызове Тип()

Строковый идентификатор ссылки
Норма

Строка из 36 символов вида GUID

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

Получено наименование или номер — использована Строка(Ссылка) вместо УникальныйИдентификатор()

FAQ

Можно ли в запросе 1С получить GUID ссылки строкой?

Напрямую — нет, оператор ВЫРАЗИТЬ не приводит ссылки к строке. Нужный GUID получают в коде после выполнения запроса: Строка(Ссылка.УникальныйИдентификатор()). Если идентификатор нужен регулярно, его иногда хранят в отдельном строковом реквизите, заполняемом при записи объекта.

Чем ТипЗнч отличается от Тип в 1С?

ТипЗнч(Значение) возвращает тип конкретного переданного значения, а Тип("ИмяТипа") создаёт объект типа по строковому имени. Их используют в паре для сравнения: ТипЗнч(Значение) = Тип("Строка").

Почему после ВЫРАЗИТЬ КАК СТРОКА часть значений стала пустой?

Если поле составного типа и приведение выполняется к типу, которого нет в конкретном значении, результатом будет NULL. Проверьте условие: для сохранения таких записей используйте ЕСТЬ NULL или приведение к строке вместо ссылочного типа, если значения примитивные.

Как проверить, что значение — любая ссылка, а не примитивный тип?

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

Строка(Число) добавляет пробелы-разделители групп. Как убрать?

Используйте Формат(Число, "ЧГ=0") — параметр ЧГ=0 отключает группировку разрядов. Для дробных чисел дополнительно задайте разделитель, например "ЧДЦ=2; ЧРД=.; ЧГ=0".

Работает ли ВЫРАЗИТЬ КАК СТРОКА в СКД и динамических списках?

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

Итог

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

В запросе примитивные поля приводятся оператором ВЫРАЗИТЬ(Поле КАК СТРОКА(N)) с обязательной длиной; ссылки к строке в запросе не приводятся. В коде тип проверяют через ТипЗнч() и Тип(), представление получают через Строка() или Формат(), а строковый идентификатор ссылки — только через УникальныйИдентификатор().