Разработка и Конфигурация · 11 мин
ТипЗначения в 1С: как выразить значение как строка
Как работать с ТипЗначения и оператором ВЫРАЗИТЬ КАК СТРОКА в запросах 1С: синтаксис, примеры кода, типичные ошибки и проверка результата.
Задача «выразить значение как строку» в 1С возникает в двух типовых ситуациях: в языке запросов, когда нужно привести поле к строковому типу для сравнения, соединения или группировки, и во встроенном языке, когда требуется получить тип значения через ТипЗнч() и сравнить его с типом, заданным строкой. Обе задачи решаются штатными средствами платформы, но у каждого подхода есть ограничения, о которых нужно знать заранее.
Ключевые инструменты — оператор ВЫРАЗИТЬ в языке запросов и функции ТипЗнч(), Тип(), Строка() во встроенном языке. Ошибки здесь обычно связаны не с синтаксисом, а с непониманием того, как платформа хранит составные типы и что именно возвращает преобразование: например, приведение ссылки к строке в запросе невозможно напрямую, а Строка(Ссылка) в коде возвращает представление, а не уникальный идентификатор.
Ниже разобраны оба сценария с готовыми примерами кода, условиями выбора подхода, способами проверки результата и типичными ошибками, которые приводят к пустым выборкам и некорректным сравнениям.
Как устроены типы значений в 1С и зачем их приводить к строке
Каждое значение в 1С имеет тип: примитивный (Строка, Число, Дата, Булево), ссылочный (СправочникСсылка, ДокументСсылка и т.д.) или составной, когда реквизит может хранить значения нескольких типов. Составной тип — частый источник проблем: в запросе такое поле нельзя напрямую сравнить со строкой или использовать в соединении, пока оно не приведено к конкретному типу.
Приведение к строке нужно в трёх практических случаях. Первый — сравнение или поиск подстроки в поле составного типа через ПОДОБНО. Второй — соединение таблиц по полям разных типов. Третий — получение текстового представления значения в коде для логирования, сообщений пользователю или формирования наименований.
Важно различать две операции, которые часто путают. ВЫРАЗИТЬ КАК СТРОКА в запросе — это приведение типа на уровне СУБД, работающее только с примитивными типами. Строка(Значение) в коде — это получение представления, которое для ссылки вернёт наименование или номер документа, а не идентификатор и не «тип» значения.
Приведение к строке в запросе: оператор ВЫРАЗИТЬ
В языке запросов приведение выполняется конструкцией ВЫРАЗИТЬ(Поле КАК СТРОКА(Длина)). Длина указывается обязательно; если реальное значение длиннее, оно будет усечено. Типичный пример — поиск по комментарию или строковому реквизиту составного типа:
ВЫБРАТЬ
ВЫРАЗИТЬ(Документы.Комментарий КАК СТРОКА(200)) КАК КомментарийСтрока
ИЗ
Документ.РеализацияТоваровУслуг КАК Документы
ГДЕ
ВЫРАЗИТЬ(Документы.Комментарий КАК СТРОКА(200)) ПОДОБНО "%оплата%"
Оператор ВЫРАЗИТЬ работает и для сужения составного типа до ссылочного: ВЫРАЗИТЬ(Поле КАК Справочник.Номенклатура). Это не приведение к строке, но та же механика — часто именно она нужна, когда разработчик ищет «тип значения выразить как строка», а на деле требуется отфильтровать составное поле по конкретному типу ссылки.
Ограничение: ссылку нельзя выразить как строку
Попытка написать ВЫРАЗИТЬ(Ссылка КАК СТРОКА(36)) для получения GUID завершится ошибкой запроса. Платформа не поддерживает приведение ссылочных типов к строке в языке запросов. Если нужен текстовый идентификатор ссылки, это делается в коде после выполнения запроса — через Строка(Ссылка.УникальныйИдентификатор()).
Обходной вариант для соединений по строковому представлению — использовать в запросе поля-представления (например, Ссылка.Наименование) и приводить уже их. Но такое соединение ненадёжно: наименования могут совпадать или меняться, поэтому для связи таблиц всегда предпочтительнее соединение по ссылке.
Получение типа значения в коде: ТипЗнч и Тип
Во встроенном языке тип значения определяется связкой ТипЗнч() и Тип(). Первая функция возвращает тип конкретного значения, вторая — тип по его строковому имени. Сравнение выглядит так:
Если ТипЗнч(Значение) = Тип("СправочникСсылка.Номенклатура") Тогда
// обработка ссылки на номенклатуру
ИначеЕсли ТипЗнч(Значение) = Тип("Строка") Тогда
// значение уже строка
КонецЕсли;
Имя типа для ссылочных объектов строится по шаблону СправочникСсылка.ИмяСправочника, ДокументСсылка.ИмяДокумента, ПеречислениеСсылка.ИмяПеречисления. Ошибка в имени (например, «Справочники» вместо «СправочникСсылка») приведёт к исключению в момент вызова Тип(), поэтому имена удобно проверять через конфигуратор.
Для проверки принадлежности значения целой группе типов удобнее метод Метаданные.НайтиПоТипу() или проверка через Справочники.ТипВсеСсылки() и функцию СодержитТип() описания типов, если работа идёт с реквизитом составного типа.
Если ТипЗнч(Значение) = Тип("Строка") Тогда
Результат = Значение;
Иначе
Результат = Строка(Значение);
КонецЕсли;Преобразование значения в строку во встроенном языке
Функция Строка(Значение) возвращает строковое представление: для чисел — текст числа с учётом форматирования по умолчанию, для дат — дату в формате по умолчанию, для ссылок — представление объекта (наименование или «Реализация товаров 0001 от …»). Это удобно для сообщений и логов, но не для машинной обработки.
Если нужен управляемый формат, используйте Формат(Значение, ФорматнаяСтрока). Например, Формат(Сумма, "ЧДЦ=2; ЧРД=.") даст число с двумя знаками и точкой-разделителем, а Формат(Дата, "ДФ=yyyy-MM-dd") — дату в ISO-виде. Это предпочтительнее, чем Строка(), когда строка идёт в файл обмена, запрос к веб-сервису или печатную форму.
Для уникального идентификатора ссылки есть отдельный путь: Строка(Ссылка.УникальныйИдентификатор()). Обратное преобразование — через Новый УникальныйИдентификатор(СтрокаGUID) и МенеджерОбъекта.ПолучитьСсылку(). Помните, что Строка(Ссылка) без УникальныйИдентификатор() вернёт представление, и восстановить ссылку из него невозможно.
Сравнение вариантов
Подходит для отбора и вывода примитивных полей. Не работает со ссылками, требует явной длины, усекает значение.
Универсально, но для ссылок возвращает представление — не подходит для идентификации и обратного преобразования.
Даёт управляемый формат чисел и дат. Нужен, когда строка передаётся во внешние системы или файлы.
Единственный надёжный способ получить строковый ID ссылки для обмена данными между базами.
Типичные сценарии: выбор подхода
Выбор инструмента зависит от того, где выполняется обработка и что является результатом. Если отбор делается в запросе и поле примитивное — используйте ВЫРАЗИТЬ. Если нужно понять, что лежит в составном поле, — либо ВЫРАЗИТЬ к ссылочному типу в запросе, либо ТипЗнч в коде после выборки.
Как выбрать действие
Отдельный сценарий — работа с описанием типов реквизита. У объекта метаданных есть свойство Тип (объект ОписаниеТипов), у которого метод СодержитТип() проверяет, допускает ли реквизит конкретный тип. Это правильный способ анализа составных полей при универсальных обработках, когда имена типов заранее неизвестны.
Проверка результата и типичные ошибки
После применения ВЫРАЗИТЬ в запросе проверьте три вещи: не усечено ли значение из-за малой длины строки, не стали ли строки пустыми из-за несовпадения типа (при приведении к ссылочному типу несовпадающие значения дают NULL), и не пропали ли записи из-за условия по NULL. Быстрая проверка — вывести приведённое поле в результат запроса и просмотреть выборку в консоли запросов.
При работе с ТипЗнч в цикле по большой выборке учитывайте производительность: сама проверка типа недорогая, но если внутри ветки выполняются обращения к базе (например, получение реквизитов ссылки), лучше сначала сгруппировать значения по типам и обработать каждую группу отдельным запросом.
Как проверить результат
Значения выводятся полностью, без обрезанных хвостов
Строки обрезаны на длине, указанной в операторе
Подходящие значения — ссылки, остальные — NULL
Все значения NULL: имя типа указано неверно
Условие срабатывает на тестовом значении нужного типа
Исключение «Неверное имя типа» при вызове Тип()
Строка из 36 символов вида GUID
Получено наименование или номер — использована Строка(Ссылка) вместо УникальныйИдентификатор()
FAQ
Можно ли в запросе 1С получить GUID ссылки строкой?
Напрямую — нет, оператор ВЫРАЗИТЬ не приводит ссылки к строке. Нужный GUID получают в коде после выполнения запроса: Строка(Ссылка.УникальныйИдентификатор()). Если идентификатор нужен регулярно, его иногда хранят в отдельном строковом реквизите, заполняемом при записи объекта.
Чем ТипЗнч отличается от Тип в 1С?
ТипЗнч(Значение) возвращает тип конкретного переданного значения, а Тип("ИмяТипа") создаёт объект типа по строковому имени. Их используют в паре для сравнения: ТипЗнч(Значение) = Тип("Строка").
Почему после ВЫРАЗИТЬ КАК СТРОКА часть значений стала пустой?
Если поле составного типа и приведение выполняется к типу, которого нет в конкретном значении, результатом будет NULL. Проверьте условие: для сохранения таких записей используйте ЕСТЬ NULL или приведение к строке вместо ссылочного типа, если значения примитивные.
Как проверить, что значение — любая ссылка, а не примитивный тип?
Используйте Метаданные.НайтиПоТипу(ТипЗнч(Значение)): для ссылочных типов метод вернёт объект метаданных, для примитивных — Неопределено. Альтернатива — проверка через Справочники.ТипВсеСсылки().СодержитТип() и аналогичные методы для документов.
Строка(Число) добавляет пробелы-разделители групп. Как убрать?
Используйте Формат(Число, "ЧГ=0") — параметр ЧГ=0 отключает группировку разрядов. Для дробных чисел дополнительно задайте разделитель, например "ЧДЦ=2; ЧРД=.; ЧГ=0".
Работает ли ВЫРАЗИТЬ КАК СТРОКА в СКД и динамических списках?
Да, оператор доступен в тексте запроса набора данных СКД и в произвольном запросе динамического списка с теми же ограничениями: только примитивные типы и обязательная длина строки. В вычисляемых полях СКД вместо него применяется функция языка выражений.
Что важно запомнить
В запросе примитивные поля приводятся оператором ВЫРАЗИТЬ(Поле КАК СТРОКА(N)) с обязательной длиной; ссылки к строке в запросе не приводятся. В коде тип проверяют через ТипЗнч() и Тип(), представление получают через Строка() или Формат(), а строковый идентификатор ссылки — только через УникальныйИдентификатор().