Разработка и Конфигурация · 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Значение().
Для хранения произвольных значений (включая таблицы значений) в строковых реквизитах базы. Только внутри 1С, не для обмена с внешними системами.
ЗначениеВСтрокуВнутр(): сериализация для хранения в базе
Когда нужно сохранить в строковый реквизит сложное значение — таблицу значений, структуру, список значений — используется ЗначениеВСтрокуВнутр(Значение). Она возвращает внутреннее строковое представление платформы, а обратное преобразование выполняет ЗначениеИзСтрокиВнутр(Строка).
СтруктураНастроек = Новый Структура("Период, Склад", Период, Склад);
СтрокаДляХранения = ЗначениеВСтрокуВнутр(СтруктураНастроек);
// ... позже:
ВосстановленныеНастройки = ЗначениеИзСтрокиВнутр(СтрокаДляХранения);
Типичный сценарий — хранение настроек отчётов, параметров обработок и отборов в хранилище значений или строковых реквизитах справочников. Впрочем, для сложных данных чаще применяют ХранилищеЗначения с сериализацией через Новый ХранилищеЗначения(Значение) — это компактнее и безопаснее.
Ограничение: формат внутреннего представления принадлежит платформе и не предназначен для разбора внешними инструментами. Не выгружайте такие строки в файлы для сторонних систем — используйте JSON или XML.
Перевод в строку в запросах и СКД
В языке запросов 1С нет функции произвольного преобразования в строку. Есть только специальные операторы: ПРЕДСТАВЛЕНИЕ(Ссылка) для получения представления ссылки и ПРЕДСТАВЛЕНИЕССЫЛКИ(). Прямого аналога Строка() для чисел и дат в запросе не существует.
// В тексте запроса:
ВЫБРАТЬ
ПРЕДСТАВЛЕНИЕ(Продажи.Номенклатура) КАК ТоварПредставление,
Продажи.Количество КАК Количество
ИЗ РегистрНакопления.Продажи КАК Продажи
Если нужно склеить строку из полей в запросе, приходится использовать оператор + только между строковыми полями, а числа и даты предварительно обрабатывать — либо в СКД через вычисляемые поля на встроенном языке, либо уже после выполнения запроса при обходе выборки. В СКД для вычисляемых выражений доступны и Формат(), и Строка().
- 1Определите потребителя строки: человек или программа.
- 2Для человека — используйте Строка() или Формат() с нужной форматной строкой.
- 3Для программы (файл, обмен, сравнение) — используйте XMLСтрока().
- 4Для хранения сложного значения в реквизите базы — ЗначениеВСтрокуВнутр() или ХранилищеЗначения.
- 5Проверьте результат на тестовом значении: число с дробной частью, дата со временем, пустое значение.
Типичные ошибки и как их избежать
Первая распространённая проблема — использование Строка() для формирования файлов обмена. На сервере с английской локалью число превратится в "1,234.56" или "1234.56", на русской — в "1 234,56". Внешняя система распарсит только один вариант, и интеграция начнёт падать непредсказуемо после смены настроек сервера.
Вторая ошибка — сравнение значений через их строковые представления: Если Строка(Дата1) = Строка(Дата2) Тогда. Такое сравнение ломается при разных региональных настройках и работает медленнее прямого сравнения значений. Сравнивать нужно сами значения, а не строки.
Третья группа проблем — неявные преобразования в шаблонах строк и сообщениях, когда разработчик забывает про неразрывные пробелы в группировке разрядов. Строка "1 234" не равна строке "1234", и поиск подстроки даёт ложноотрицательный результат.
Проверка результата и отладка
После выбора способа преобразования проверьте его на граничных значениях: пустая дата, ноль, отрицательное число, очень длинная строка, ссылка с незаполненным представлением. Именно на таких данных всплывают расхождения между ожидаемым и фактическим результатом.
Для отладки удобно выводить тип и значение одновременно: Сообщить(ТипЗнч(Значение).Имя + " = " + Значение). В конфигураторе при остановке по точке останова используйте окно «Вычислить выражение» — там можно сразу сравнить Строка(Значение), Формат(Значение, ...) и 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Строка() — для программ и обмена, Формат() — когда нужен контроль над видом числа или даты, ЗначениеВСтрокуВнутр() — только для хранения внутри базы. Никогда не сравнивайте значения через строковые представления и всегда отключайте группировку разрядов при выгрузке чисел.