Разработка и Конфигурация · 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, исключения не будет
Дополнительное преимущество — квалификаторы. Описание типов сразу обрежет число до заданной точности, а строку — до указанной длины, что удобно при записи в реквизиты с ограничениями. Также ПривестиЗначение() умеет приводить ссылки: если передать строку, совпадающую с представлением, к составному типу, платформа попытается найти подходящее значение.
Тот же приём работает при установке значений в реквизиты объекта через произвольный код: вместо прямого присваивания с риском несовпадения типов получайте описание типа из метаданных реквизита и приводите значение через него.
ОписаниеТипа = Метаданные.Справочники.Номенклатура.Реквизиты.Код.Тип;
БезопасноеЗначение = ОписаниеТипа.ПривестиЗначение(ВходноеЗначение);Приведение ссылок и работа с XML-типами
Ссылочные типы не приводятся функциями-конструкторами. Чтобы получить ссылку из строкового GUID, используется конструктор через Новый или методы менеджера объекта:
УИД = Новый УникальныйИдентификатор(СтрокаGUID);
Ссылка = Справочники.Номенклатура.ПолучитьСсылку(УИД);
Для обмена через XML, веб-сервисы и форматы типа EnterpriseData применяются функции XMLЗначение() и XMLСтрока(). Они работают с каноническими представлениями: дата в формате ISO 8601, булево как true/false, число с точкой. Это устраняет зависимость от локали, но требует, чтобы входная строка строго соответствовала формату XML Schema.
Д = XMLЗначение(Тип("Дата"), "2026-02-01T15:30:00");
СтрокаДляОбмена = XMLСтрока(ТекущаяДатаСеанса());
Для сериализации произвольных значений (включая ссылки) внутри одной информационной базы существуют ЗначениеВСтрокуВнутр() и ЗначениеИзСтрокиВнутр(). Их нельзя использовать для обмена между разными базами с различающимися конфигурациями — внутренний формат жёстко привязан к структуре метаданных.
Выбор способа приведения
Быстро и просто, но при некорректных данных выбрасывают исключение. Подходят, когда входные данные гарантированно валидны.
Не вызывает исключений, применяет квалификаторы длины и точности. Лучший выбор для загрузки внешних данных.
Канонические форматы без зависимости от локали. Для обмена между системами и веб-сервисов.
Сериализация любых значений, но только внутри одной конфигурации. Не для межсистемного обмена.
Проверка результата и типичные ошибки
После приведения результат стоит проверить, особенно если данные пришли извне. Контрольные точки просты: число не должно молча стать нулём, если ноль недопустим по смыслу; дата не должна быть пустой ('00010101'); строка после приведения через квалификаторы не должна обрезаться неожиданно.
Как проверить результат приведения
Значение соответствует входным данным с учётом точности
Получен 0 при непустой входной строке — данные не распознаны
Год, месяц и день совпадают с источником
Дата '0001.01.01' или перепутаны день и месяц
Ссылка.ПолучитьОбъект() или запрос возвращают объект
Битая ссылка: объекта с таким GUID в базе нет
Ещё одна частая ситуация — приведение в запросах. В языке запросов есть оператор ВЫРАЗИТЬ(... КАК ...), который приводит тип поля, и функция ЕСТЬNULL() для замены NULL. Помните, что ВЫРАЗИТЬ для чисел и строк работает как ограничение квалификаторов, а не как преобразование произвольной строки в число — нечисловые строки в запросе так не превратить.
Как выбрать способ
Подводя итог: в большинстве прикладных задач достаточно четырёх функций-конструкторов и ОписаниеТипов для безопасных случаев. Главное — не доверять входным данным и проверять результат там, где молчаливое неверное преобразование опаснее явной ошибки.
Что важно запомнить
Примитивные типы приводятся функциями Число(), Строка(), Дата(), Булево(); безопасное приведение без исключений — через ОписаниеТипов.ПривестиЗначение(); для обмена — XMLЗначение() и XMLСтрока(). Всегда проверяйте входные данные и помните о зависимости разбора строк от региональных настроек сервера.
Частые вопросы
Как привести строку к числу без ошибки, если строка может быть пустой?
Используйте ОписаниеТипов: Новый ОписаниеТипов("Число") и метод ПривестиЗначение() — для пустой или некорректной строки он вернёт 0 без исключения. Либо оберните вызов Число() в конструкцию Попытка...Исключение и задайте значение по умолчанию в ветке Исключение.
Как узнать фактический тип значения переменной?
Функцией ТипЗнч(Значение), а результат сравнивают с Тип("ИмяТипа"), например Тип("Число") или Тип("СправочникСсылка.Номенклатура"). Это стандартный способ ветвления логики по типу входного параметра.
Почему дата из строки получается с перепутанными днём и месяцем?
Функция Дата(Строка) разбирает строку по региональным настройкам сеанса, а в клиент-серверном режиме — по настройкам сервера. Решение: передавать дату в формате ГГГГММДДччммсс без разделителей, собирать дату из компонентов Дата(Год, Месяц, День) или использовать XMLЗначение с форматом ISO.
Как получить ссылку на элемент справочника по строке с GUID?
Создайте объект уникального идентификатора: Новый УникальныйИдентификатор(СтрокаGUID), затем вызовите Справочники.ИмяСправочника.ПолучитьСсылку(УИД). После этого проверьте, что объект существует, иначе получите битую ссылку.
Чем ЕСТЬNULL в запросе отличается от приведения типа?
ЕСТЬNULL заменяет значение NULL указанным значением, но не меняет тип поля. Приведение типа в запросе выполняет оператор ВЫРАЗИТЬ(Поле КАК Число(15,2)), который также используется для сужения составного типа и задания квалификаторов.
Можно ли привести значение к перечислению по имени?
Да: Перечисления.ИмяПеречисления[ИмяЗначения] вернёт значение по его имени в метаданных. По синониму (представлению) придётся перебирать значения и сравнивать Строка(ЗначениеПеречисления) с искомой строкой.