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

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

Как привести значение к нужному типу в 1С

Как привести значение к типу в 1С: Число, Строка, Дата, Булево, XMLЗначение, ОписаниеТипов. Примеры кода, ошибки преобразования и проверка результата.

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

В 1С нет единого универсального оператора приведения, как в некоторых языках. Для разных типов используются разные механизмы: функции-конструкторы Число(), Строка(), Дата(), Булево(), методы XMLЗначение() и ЗначениеИзСтрокиВнутр(), а также объект ОписаниеТипов с методом ПривестиЗначение(). Выбор зависит от того, какой тип нужен на выходе и насколько строго нужно контролировать ошибки.

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

Как привести строку к числу и обратно

Функция Число() преобразует строку, дату или булево в число. Строка должна содержать корректное числовое представление: допускаются пробелы по краям, знак минус, десятичный разделитель. Если строка не является числом, платформа выбрасывает исключение, поэтому при обработке внешних данных вызов стоит оборачивать в попытку.

Значение = Число("123,45");        // 123,45

Попытка

Результат = Число(СтрокаИзФайла);

Исключение

Результат = 0;

// записать в журнал регистрации

КонецПопытки;

Обратная операция — Строка() — работает практически с любым значением и никогда не вызывает исключения. Для ссылочных типов она возвращает представление объекта, поэтому для получения GUID ссылки используется Строка(Ссылка.УникальныйИдентификатор()).

Важный нюанс: Число() при разборе строки учитывает региональные настройки сеанса. Если файл приходит с точкой в качестве разделителя, а сеанс настроен на запятую, лучше предварительно заменить разделитель через СтрЗаменить(), чем ловить ошибки.

Приведение к дате: форматы и подводные камни

Функция Дата() принимает либо компоненты даты (год, месяц, день, и опционально время), либо строку в формате, соответствующем региональным настройкам. Практика показывает, что строковый вариант — источник большинства ошибок, потому что формат «01.02.2026» в разных локалях трактуется по-разному.

Д1 = Дата(2026, 2, 1);              // надёжно: из компонентов

Д2 = Дата("20260201153000"); // строка ГГГГММДДччммсс

Д3 = Дата("01.02.2026 15:30:00"); // зависит от локали сеанса

Наиболее надёжный способ при загрузке из файлов — строковый формат ГГГГММДДччммсс без разделителей: он не зависит от региональных настроек. Если источник отдаёт дату в другом виде, разберите строку вручную через СтрРазделить() и соберите дату из компонентов.

Булево и Неопределено: неочевидные правила

Функция Булево() приводит число по правилу: 0 — Ложь, любое другое число — Истина. Строка преобразуется по региональным представлениям «Истина»/«Ложь», поэтому надёжнее сравнивать строку явно: НРег(СокрЛП(Значение)) = "истина" или проверять на "1"/"0".

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

Если Значение = Неопределено Или Не ЗначениеЗаполнено(Значение) Тогда

Результат = 0;

Иначе

Результат = Число(Значение);

КонецЕсли;

Проверка фактического типа значения выполняется функцией ТипЗнч() в паре с Тип():

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

// безопасно работаем как со строкой

КонецЕсли;

Безопасное приведение через ОписаниеТипов

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

ОписаниеЧисла = Новый ОписаниеТипов("Число",

Новый КвалификаторыЧисла(15, 2, ДопустимыйЗнак.Любой));

Результат = ОписаниеЧисла.ПривестиЗначение(СтрокаИзФайла);

// при ошибке вернёт 0, исключения не будет

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

Тот же приём работает при установке значений в реквизиты объекта через произвольный код: вместо прямого присваивания с риском несовпадения типов получайте описание типа из метаданных реквизита и приводите значение через него.

1c
ОписаниеТипа = Метаданные.Справочники.Номенклатура.Реквизиты.Код.Тип;
БезопасноеЗначение = ОписаниеТипа.ПривестиЗначение(ВходноеЗначение);

Приведение ссылок и работа с XML-типами

Ссылочные типы не приводятся функциями-конструкторами. Чтобы получить ссылку из строкового GUID, используется конструктор через Новый или методы менеджера объекта:

УИД = Новый УникальныйИдентификатор(СтрокаGUID);

Ссылка = Справочники.Номенклатура.ПолучитьСсылку(УИД);

Для обмена через XML, веб-сервисы и форматы типа EnterpriseData применяются функции XMLЗначение() и XMLСтрока(). Они работают с каноническими представлениями: дата в формате ISO 8601, булево как true/false, число с точкой. Это устраняет зависимость от локали, но требует, чтобы входная строка строго соответствовала формату XML Schema.

Д = XMLЗначение(Тип("Дата"), "2026-02-01T15:30:00");

СтрокаДляОбмена = XMLСтрока(ТекущаяДатаСеанса());

Для сериализации произвольных значений (включая ссылки) внутри одной информационной базы существуют ЗначениеВСтрокуВнутр() и ЗначениеИзСтрокиВнутр(). Их нельзя использовать для обмена между разными базами с различающимися конфигурациями — внутренний формат жёстко привязан к структуре метаданных.

Выбор способа приведения

Число(), Строка(), Дата()

Быстро и просто, но при некорректных данных выбрасывают исключение. Подходят, когда входные данные гарантированно валидны.

ОписаниеТипов.ПривестиЗначение()

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

XMLЗначение() / XMLСтрока()

Канонические форматы без зависимости от локали. Для обмена между системами и веб-сервисов.

ЗначениеВСтрокуВнутр()

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

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

После приведения результат стоит проверить, особенно если данные пришли извне. Контрольные точки просты: число не должно молча стать нулём, если ноль недопустим по смыслу; дата не должна быть пустой ('00010101'); строка после приведения через квалификаторы не должна обрезаться неожиданно.

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

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

Число после ПривестиЗначение
Норма

Значение соответствует входным данным с учётом точности

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

Получен 0 при непустой входной строке — данные не распознаны

Дата после Дата() или XMLЗначение
Норма

Год, месяц и день совпадают с источником

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

Дата '0001.01.01' или перепутаны день и месяц

Ссылка после ПолучитьСсылку
Норма

Ссылка.ПолучитьОбъект() или запрос возвращают объект

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

Битая ссылка: объекта с таким GUID в базе нет

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

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

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

Как выбрать способ

Данные гарантированно корректны (внутренние механизмы)Используйте Число(), Строка(), Дата() напрямую
Данные из файла, формы или внешней системыИспользуйте ОписаниеТипов.ПривестиЗначение() или оберните вызов в Попытку
Обмен через XML или веб-сервисИспользуйте XMLЗначение() и XMLСтрока() с каноническими форматами
Нужно получить ссылку по GUIDНовый УникальныйИдентификатор() + МенеджерОбъекта.ПолучитьСсылку()

Подводя итог: в большинстве прикладных задач достаточно четырёх функций-конструкторов и ОписаниеТипов для безопасных случаев. Главное — не доверять входным данным и проверять результат там, где молчаливое неверное преобразование опаснее явной ошибки.

Итог

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

Примитивные типы приводятся функциями Число(), Строка(), Дата(), Булево(); безопасное приведение без исключений — через ОписаниеТипов.ПривестиЗначение(); для обмена — XMLЗначение() и XMLСтрока(). Всегда проверяйте входные данные и помните о зависимости разбора строк от региональных настроек сервера.

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

Как привести строку к числу без ошибки, если строка может быть пустой?

Используйте ОписаниеТипов: Новый ОписаниеТипов("Число") и метод ПривестиЗначение() — для пустой или некорректной строки он вернёт 0 без исключения. Либо оберните вызов Число() в конструкцию Попытка...Исключение и задайте значение по умолчанию в ветке Исключение.

Как узнать фактический тип значения переменной?

Функцией ТипЗнч(Значение), а результат сравнивают с Тип("ИмяТипа"), например Тип("Число") или Тип("СправочникСсылка.Номенклатура"). Это стандартный способ ветвления логики по типу входного параметра.

Почему дата из строки получается с перепутанными днём и месяцем?

Функция Дата(Строка) разбирает строку по региональным настройкам сеанса, а в клиент-серверном режиме — по настройкам сервера. Решение: передавать дату в формате ГГГГММДДччммсс без разделителей, собирать дату из компонентов Дата(Год, Месяц, День) или использовать XMLЗначение с форматом ISO.

Как получить ссылку на элемент справочника по строке с GUID?

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

Чем ЕСТЬNULL в запросе отличается от приведения типа?

ЕСТЬNULL заменяет значение NULL указанным значением, но не меняет тип поля. Приведение типа в запросе выполняет оператор ВЫРАЗИТЬ(Поле КАК Число(15,2)), который также используется для сужения составного типа и задания квалификаторов.

Можно ли привести значение к перечислению по имени?

Да: Перечисления.ИмяПеречисления[ИмяЗначения] вернёт значение по его имени в метаданных. По синониму (представлению) придётся перебирать значения и сравнивать Строка(ЗначениеПеречисления) с искомой строкой.