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

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

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

Как перевести число, дату, булево и ссылку в строку в 1С: функции Строка(), Формат(), XMLСтрока, ЗначениеВСтрокуВнутр. Примеры кода, ошибки и FAQ.

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

Главная ошибка новичков — считать, что эти функции взаимозаменяемы. На практике Строка() возвращает представление, зависящее от региональных настроек, Формат() позволяет управлять выводом через форматную строку, а XMLСтрока() даёт каноническое представление для обмена данными. Выбор неправильного варианта приводит к ошибкам сравнения, неверным датам в выгрузках и «битым» числам в файлах.

Функция Строка(): базовый способ преобразования

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

Число = 1234.56;

Сообщить(Строка(Число)); // "1 234,56" — зависит от региональных настроек

Сообщить(Строка(ТекущаяДата())); // "25.01.2026 10:30:00" или другой формат

Сообщить(Строка(Истина)); // "Да"

Сообщить(Строка(СсылкаНаДокумент)); // "Реализация товаров 000001 от 25.01.2026"

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

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

Неявное преобразование через конкатенацию

Оператор сложения строк автоматически приводит правый операнд к строке, если левый — строка. Это удобно для быстрого формирования сообщений, но требует внимательности с порядком операндов.

Текст = "Остаток: " + КоличествоОстаток + " шт."; // работает

Текст = КоличествоОстаток + " шт."; // тоже работает, число приводится к строке

Подводный камень — сложение нескольких чисел впереди строки. Пока все операнды числовые, выполняется арифметическое сложение, а не склейка:

// "Итого: 30" — сначала 10+20, потом конкатенация

Текст = "Итого: " + 10 + 20;

// "Итого: 1020" — строка уже слева, числа склеиваются

Текст = "Итого: " + (10) + (20);

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

Формат(): управляемое преобразование через форматную строку

Функция Формат(Значение, ФорматнаяСтрока) — основной инструмент, когда нужен контроль над тем, как значение будет выглядеть. Она применяется к числам, датам и булевым значениям и принимает форматную строку с параметрами.

Форматирование чисел

Формат(1234.5, "ЧЦ=10; ЧДЦ=2");       // "    1 234,50"

Формат(1234.5, "ЧЦ=10; ЧДЦ=2; ЧРД=."); // "1 234.50" — точка как разделитель

Формат(0, "ЧН=0,00"); // "0,00" — представление нуля

Формат(1234567, "ЧГ=0"); // "1234567" — без группировки разрядов

Параметр ЧГ=0 особенно важен при выгрузке чисел в файлы: по умолчанию 1С группирует разряды пробелами (неразрывными), и внешняя система не сможет распарсить такое значение. Для машиночитаемых выгрузок всегда отключайте группировку.

Форматирование дат

Формат(ТекущаяДата(), "ДЛФ=D");            // "25.01.2026"

Формат(ТекущаяДата(), "ДЛФ=DD"); // "25 января 2026 г."

Формат(ТекущаяДата(), "ДФ=yyyy-MM-dd"); // "2026-01-25" — для файлов и SQL

Формат(ТекущаяДата(), "ДФ='yyyy-MM-dd HH:mm:ss'"); // дата со временем

Формат(ПустаяДата, "ДФ=dd.MM.yyyy; ДП='не указана'"); // подстановка для пустой даты

Формат ДФ=yyyy-MM-dd — стандарт де-факто для обмена датами с внешними системами: он не зависит от локали и однозначно сортируется как строка. Параметр ДП задаёт представление пустой даты, что избавляет от отдельных проверок.

XMLСтрока(): каноническое представление для обмена

Функция XMLСтрока(Значение) преобразует значение в строку по правилам XML-схемы, независимо от региональных настроек. Числа получают точку как разделитель, даты — формат ISO, булево — true/false, ссылки — уникальный идентификатор.

XMLСтрока(1234.56);             // "1234.56"

XMLСтрока(ТекущаяДата()); // "2026-01-25T10:30:00"

XMLСтрока(Истина); // "true"

XMLСтрока(СсылкаНаДокумент); // "a1b2c3d4-..." — GUID ссылки

Обратная функция — XMLЗначение(Тип, Строка) — восстанавливает значение из канонической строки. Эта пара образует надёжный механизм сериализации простых типов: выгрузили через XMLСтрока(), загрузили через XMLЗначение(), и значение гарантированно совпадёт.

Используйте XMLСтрока() везде, где строка будет читаться программой: в файлах обмена, при передаче через HTTP-сервисы, при формировании ключей кэша и в строковых сравнениях. Для показа пользователю она не подходит — формат ISO выглядит непривычно.

Сравнение способов преобразования

Строка()

Для сообщений пользователю и отладки. Зависит от региональных настроек, не подходит для обмена и сравнения.

Формат()

Для управляемого вывода чисел и дат: печатные формы, файлы с заданным форматом, представление пустых значений.

XMLСтрока()

Для обмена данными, хранения ключей и программного сравнения. Не зависит от локали, обратима через XMLЗначение().

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

Для хранения произвольных значений (включая таблицы значений) в строковых реквизитах базы. Только внутри 1С, не для обмена с внешними системами.

ЗначениеВСтрокуВнутр(): сериализация для хранения в базе

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

СтруктураНастроек = Новый Структура("Период, Склад", Период, Склад);

СтрокаДляХранения = ЗначениеВСтрокуВнутр(СтруктураНастроек);

// ... позже:

ВосстановленныеНастройки = ЗначениеИзСтрокиВнутр(СтрокаДляХранения);

Типичный сценарий — хранение настроек отчётов, параметров обработок и отборов в хранилище значений или строковых реквизитах справочников. Впрочем, для сложных данных чаще применяют ХранилищеЗначения с сериализацией через Новый ХранилищеЗначения(Значение) — это компактнее и безопаснее.

Ограничение: формат внутреннего представления принадлежит платформе и не предназначен для разбора внешними инструментами. Не выгружайте такие строки в файлы для сторонних систем — используйте JSON или XML.

Перевод в строку в запросах и СКД

В языке запросов 1С нет функции произвольного преобразования в строку. Есть только специальные операторы: ПРЕДСТАВЛЕНИЕ(Ссылка) для получения представления ссылки и ПРЕДСТАВЛЕНИЕССЫЛКИ(). Прямого аналога Строка() для чисел и дат в запросе не существует.

// В тексте запроса:

ВЫБРАТЬ

ПРЕДСТАВЛЕНИЕ(Продажи.Номенклатура) КАК ТоварПредставление,

Продажи.Количество КАК Количество

ИЗ РегистрНакопления.Продажи КАК Продажи

Если нужно склеить строку из полей в запросе, приходится использовать оператор + только между строковыми полями, а числа и даты предварительно обрабатывать — либо в СКД через вычисляемые поля на встроенном языке, либо уже после выполнения запроса при обходе выборки. В СКД для вычисляемых выражений доступны и Формат(), и Строка().

Как выбрать способ перевода в строку
  1. 1
    Определите потребителя строки: человек или программа.
  2. 2
    Для человека — используйте Строка() или Формат() с нужной форматной строкой.
  3. 3
    Для программы (файл, обмен, сравнение) — используйте XMLСтрока().
  4. 4
    Для хранения сложного значения в реквизите базы — ЗначениеВСтрокуВнутр() или ХранилищеЗначения.
  5. 5
    Проверьте результат на тестовом значении: число с дробной частью, дата со временем, пустое значение.

Типичные ошибки и как их избежать

Первая распространённая проблема — использование Строка() для формирования файлов обмена. На сервере с английской локалью число превратится в "1,234.56" или "1234.56", на русской — в "1 234,56". Внешняя система распарсит только один вариант, и интеграция начнёт падать непредсказуемо после смены настроек сервера.

Вторая ошибка — сравнение значений через их строковые представления: Если Строка(Дата1) = Строка(Дата2) Тогда. Такое сравнение ломается при разных региональных настройках и работает медленнее прямого сравнения значений. Сравнивать нужно сами значения, а не строки.

Третья группа проблем — неявные преобразования в шаблонах строк и сообщениях, когда разработчик забывает про неразрывные пробелы в группировке разрядов. Строка "1 234" не равна строке "1234", и поиск подстроки даёт ложноотрицательный результат.

Типичные ошибки
01
Строка() в файлах обмена — результат зависит от региональных настроек сервера, интеграция ломается после их смены.
02
Сравнение значений через строковые представления — медленно и ненадёжно; сравнивайте сами значения.
03
Забытый ЧГ=0 в Формат() — числа выгружаются с неразрывными пробелами, внешняя система не может их распарсить.
04
Ожидание, что Строка(Ссылка) вернёт GUID — она возвращает представление пользователя; для GUID используйте XMLСтрока() или Ссылка.УникальныйИдентификатор().
05
Сложение чисел перед конкатенацией со строкой — 10 + 20 + ' шт.' даёт сначала арифметику, а не склейку.

Проверка результата и отладка

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

Для отладки удобно выводить тип и значение одновременно: Сообщить(ТипЗнч(Значение).Имя + " = " + Значение). В конфигураторе при остановке по точке останова используйте окно «Вычислить выражение» — там можно сразу сравнить Строка(Значение), Формат(Значение, ...) и XMLСтрока(Значение) для одного и того же объекта.

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

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

Число в файле обмена
Норма

Точка как разделитель, без пробелов между разрядами

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

Запятая или неразрывные пробелы — внешняя система не распарсит

Дата в строке для интеграции
Норма

Формат ISO: 2026-01-25 или 2026-01-25T10:30:00

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

25.01.2026 — зависит от локали и неоднозначно

Представление пустой даты
Норма

Задан параметр ДП или явная проверка на пустоту

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

В сообщении выводится 01.01.0001

Идентификация ссылки
Норма

Используется УникальныйИдентификатор() или XMLСтрока()

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

Сравнение по Строка(Ссылка) — представление не уникально

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

Как перевести число в строку без пробелов между разрядами?

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

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

Два способа: XMLСтрока(Ссылка) или Строка(Ссылка.УникальныйИдентификатор()). Оба вернут строку вида «a1b2c3d4-e5f6-...». Функция Строка(Ссылка) для этого не подходит — она возвращает пользовательское представление объекта.

Чем отличается Строка() от Формат()?

Строка() просто возвращает представление значения по умолчанию с учётом региональных настроек. Формат() дополнительно принимает форматную строку, позволяя задать длину, точность, разделители, представление нуля и пустой даты. Для управляемого вывода всегда предпочтительнее Формат().

Как преобразовать дату в строку формата ГГГГ-ММ-ДД?

Примените Формат(Дата, "ДФ=yyyy-MM-dd"). Если нужна дата со временем — Формат(Дата, "ДФ='yyyy-MM-dd HH:mm:ss'"). Для обмена данными можно также использовать XMLСтрока(Дата), которая вернёт формат ISO 8601.

Можно ли перевести в строку таблицу значений или структуру?

Функции Строка() и XMLСтрока() с этими типами не работают осмысленно. Для хранения внутри базы используйте ЗначениеВСтрокуВнутр() или ХранилищеЗначения. Для обмена с внешними системами сериализуйте данные в JSON через ЗаписьJSON или в XML.

Почему Строка(Булево) возвращает «Да»/«Нет», а в файле нужно true/false?

Строка() возвращает локализованное представление булева значения для пользователя. Для машиночитаемого формата используйте XMLСтрока(Значение) — она вернёт канонические true или false независимо от языка сеанса.

Итог

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

Строка() — для пользователя, XMLСтрока() — для программ и обмена, Формат() — когда нужен контроль над видом числа или даты, ЗначениеВСтрокуВнутр() — только для хранения внутри базы. Никогда не сравнивайте значения через строковые представления и всегда отключайте группировку разрядов при выгрузке чисел.