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

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

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

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

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

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

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

Функция Строка(): универсальное преобразование для отображения

Функция Строка() принимает значение практически любого типа и возвращает его строковое представление. Это самый простой и самый часто используемый способ. Вызов выглядит так:

Количество = 15;

ТекстСообщения = "В документе " + Строка(Количество) + " позиций";

Сообщить(ТекстСообщения);

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

Важно понимать ограничение: результат зависит от региональных установок. Одна и та же дата на сервере с русскими настройками выдаст «01.03.2026 10:30:00», а с английскими — «3/1/2026 10:30:00 AM». Поэтому Строка() нельзя использовать для формирования машиночитаемых данных, XML-пакетов или ключей поиска.

Функция Формат(): точное управление видом чисел, дат и булевых значений

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

Сумма = 1234567.8;

Сообщить(Формат(Сумма, "ЧДЦ=2; ЧРГ=' '")); // "1 234 567,80"

ДатаОтчета = ТекущаяДатаСеанса();

Сообщить(Формат(ДатаОтчета, "ДЛФ=DD")); // длинный формат даты

Сообщить(Формат(ДатаОтчета, "ДФ=yyyy-MM-dd")); // "2026-03-01"

Форматная строка состоит из параметров, разделённых точкой с запятой. Для чисел ключевые параметры: ЧДЦ — число десятичных знаков, ЧРГ — разделитель групп разрядов, ЧН — представление нуля (например, ЧН=0.00, чтобы ноль не выводился пустой строкой). Для дат: ДФ — собственный шаблон, ДЛФ — локальный формат (D, DD, DT и другие).

Для булевых значений параметр БЛ/БИ задаёт текст для Ложь и Истина: Формат(Признак, "БЛ=Нет; БИ=Да"). Это удобно при выгрузке в текстовые файлы, где требуется русскоязычное обозначение.

Типичные ошибки
01
Использование Строка(Дата) для выгрузки в XML или CSV: формат зависит от региональных настроек сервера, и файл, сформированный на одном сервере, может не загрузиться на другом. Решение — Формат(Дата, "ДФ=yyyy-MM-dd") или XMLСтрока().
02
Конкатенация числа со строкой без Формат(): число 1000000 выводится как «1 000 000» с неразрывными пробелами, которые ломают последующий разбор строки или поиск.
03
Попытка преобразовать ссылку в строку через ЗначениеВСтрокуВнутр() и показать её пользователю: человек увидит нечитаемый внутренний идентификатор.

Преобразование ссылок и составных типов

Ссылочные значения — элементы справочников, документы, перечисления — преобразуются в строку через своё представление. Строка(СсылкаНаКонтрагента) вернёт наименование контрагента, а Строка(СсылкаНаДокумент) — что-то вроде «Реализация товаров 000001 от 01.03.2026». Это удобно для сообщений, но не подходит для идентификации.

Если нужно получить уникальный идентификатор ссылки в виде строки (например, для интеграции с внешней системой), используется метод УникальныйИдентификатор():

ИдСтрокой = Строка(СсылкаНаКонтрагента.УникальныйИдентификатор());

// Результат: "a1b2c3d4-e5f6-7890-abcd-ef1234567890"

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

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

Строка()

Для сообщений пользователю и журнала регистрации. Не подходит для обмена данными: результат зависит от региональных настроек.

Формат()

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

XMLСтрока()

Для обмена данными, хранения значений в строковых реквизитах, веб-сервисов. Результат машиночитаемый, обратим через XMLЗначение().

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

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

XMLСтрока() и ЗначениеВСтрокуВнутр(): машиночитаемые представления

Функция XMLСтрока() преобразует значение в строку по правилам XML-сериализации. Дата станет «2026-03-01T10:30:00», булево Истина — «true», число — без разделителей разрядов. Обратное преобразование выполняется функцией XMLЗначение() с указанием типа:

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

ДатаОбратно = XMLЗначение(Тип("Дата"), ДатаСтрокой);

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

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

Преобразование в строку через JSON

Для интеграций с веб-сервисами часто нужно превратить структуру данных в JSON-строку. Встроенный язык предоставляет объекты ЗаписьJSON и ЧтениеJSON:

Структура = Новый Структура;

Структура.Вставить("Контрагент", Строка(СсылкаНаКонтрагента));

Структура.Вставить("Сумма", 1500.5);

ЗаписьJSON = Новый ЗаписьJSON;

ЗаписьJSON.УстановитьСтроку();

ЗаписатьJSON(ЗаписьJSON, Структура);

СтрокаJSON = ЗаписьJSON.Закрыть();

// {"Контрагент":"ООО Ромашка","Сумма":1500.5}

Учтите, что даты и ссылки напрямую в JSON не сериализуются — их нужно предварительно преобразовать: дату через Формат() в ISO-вид, ссылку — через уникальный идентификатор. Это типичное место ошибок при написании интеграций.

Неявное преобразование и конкатенация: где прячутся ошибки

Встроенный язык 1С не выполняет автоматического преобразования числа в строку при сложении. Выражение "Итого: " + 100 вызовет ошибку «Преобразование значения к типу Строка не может быть выполнено» в строгом контексте или неожиданный результат — поэтому явный вызов Строка() или Формат() обязателен.

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

Текст = СтрШаблон("Документ №%1 от %2", НомерДок, Формат(ДатаДок, "ДЛФ=D"));

При выводе чисел через конкатенацию помните про неразрывные пробелы в представлении разрядов: строка «1 000 000» содержит символы, которые визуально неотличимы от пробелов, но ломают числовой разбор и сравнение строк.

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

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

Вывод числа в сообщении
Норма

Число читаемо, разряды и десятичные знаки соответствуют ожиданиям

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

Появились неразрывные пробелы или лишние нули после запятой

Строка даты для обмена
Норма

Формат ISO (yyyy-MM-dd) или XML-представление, стабильный на любом сервере

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

Формат зависит от региональных настроек сеанса

Обратное преобразование
Норма

XMLЗначение() или ЗначениеИзСтрокиВнутр() возвращает исходное значение без потерь

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

Ошибка разбора или потеря дробной части и времени

Пошаговый алгоритм выбора способа

Чтобы не выбирать функцию наугад, пройдите по простой цепочке вопросов. Кто будет читать строку — человек или программа? Если человек — нужно локализованное представление. Если программа — стабильный машинный формат. Нужно ли обратное преобразование? Если да, выбор сужается до пар «сериализация/десериализация».

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

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

Итог

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

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

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

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

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

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

Примените Формат(Дата, "ДФ=yyyyMMdd"). Для варианта с временем добавьте в шаблон часы, минуты и секунды: "ДФ=yyyyMMddHHmmss". Такой формат стабилен и не зависит от региональных настроек сервера, в отличие от Строка(Дата).

Чем отличается Строка() от XMLСтрока() для перечислений?

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

Как преобразовать ссылку справочника в строку для передачи во внешнюю систему?

Получите уникальный идентификатор: Строка(Ссылка.УникальныйИдентификатор()). Это строка вида «a1b2c3d4-...», однозначно идентифицирующая объект. Наименование (результат Строка(Ссылка)) для идентификации не подходит — оно не уникально и может меняться.

Почему «"Итог: " + 100» вызывает ошибку?

Встроенный язык 1С не преобразует число в строку автоматически при операции сложения. Нужно явное преобразование: "Итог: " + Строка(100) или "Итог: " + Формат(100, "ЧГ=0"). Альтернатива — СтрШаблон("Итог: %1", 100), где подстановка выполняется автоматически.

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

Напрямую через Строка() — нет, результат будет служебным. Для хранения внутри системы используйте ЗначениеВСтрокуВнутр(ТаблицаЗначений), для передачи наружу — сериализацию в JSON через ЗаписьJSON или в XML. Учитывайте объём: большая таблица превратится в строку значительного размера.