Разработка и Конфигурация · 12 мин
Как в 1С преобразовать значение в строку
Способы преобразования в строку в 1С: функция Строка(), Формат() с форматной строкой, XMLСтрока, ЗначениеВСтрокуВнутр. Примеры кода, ошибки и FAQ.
Преобразование значения в строку — одна из самых частых операций при разработке на встроенном языке 1С. Она нужна при формировании сообщений пользователю, выводе в журнал регистрации, конкатенации текстов, передаче данных во внешние системы и отладке. Платформа предлагает несколько механизмов, и выбор зависит от типа исходного значения и от того, как должен выглядеть результат.
Основные инструменты — функция Строка(), универсальная функция Формат(), а для сериализации — XMLСтрока() и ЗначениеВСтрокуВнутр(). У каждого варианта свои ограничения: например, Строка() для ссылочных типов возвращает представление, зависящее от настроек объекта, а Формат() позволяет точно управлять выводом чисел и дат.
Ниже разобраны все практические способы с примерами кода, типичными ошибками и критериями выбора. Примеры применимы как для тонкого и веб-клиента, так и для серверного кода — синтаксис встроенного языка одинаков.
Функция Строка(): базовый способ преобразования
Функция Строка() — самый простой способ. Она принимает значение практически любого типа и возвращает его строковое представление. Для чисел и дат результат зависит от региональных настроек сеанса, что важно учитывать при обмене данными между системами.
Для ссылочных типов (справочников, документов) Строка() возвращает представление ссылки — то, что пользователь видит в интерфейсе. Представление формируется по правилам конфигурации: обычно это наименование для справочников и «номер от даты» для документов.
Число = 1234.56;
Сообщить(Строка(Число)); // "1 234,56" — зависит от региональных настроек
ДатаДок = ТекущаяДатаСеанса();
Сообщить(Строка(ДатаДок)); // например, "15.03.2026 10:30:00"
Ссылка = Справочники.Номенклатура.НайтиПоКоду("000000001");
Сообщить(Строка(Ссылка)); // наименование элемента, например "Кабель ВВГ 3х2,5"
Неявное преобразование тоже работает: при конкатенации со строкой платформа сама вызовет аналог Строка(). Однако явный вызов читается лучше и снижает риск неожиданного результата, особенно в сложных выражениях.
Функция Формат(): точное управление выводом чисел, дат и булево
Когда результат Строка() не устраивает — например, нужно вывести число без разделителей групп или дату в формате ISO — используется функция Формат(Значение, ФорматнаяСтрока). Второй параметр задаёт шаблон вывода и не зависит от региональных настроек сеанса.
Форматирование чисел
Для чисел ключевые параметры форматной строки: ЧРД (разделитель дробной части), ЧРГ (разделитель групп), ЧН (представление нуля), ЧЦ и ЧДЦ (общая длина и число знаков после запятой).
Сумма = 1234567.891;
// Без разделителя групп, две цифры после запятой
Стр = Формат(Сумма, "ЧРД=.; ЧРГ=; ЧДЦ=2"); // "1234567.89"
// С ведущими нулями до 10 знаков
Стр = Формат(42, "ЧЦ=10; ЧН=; ЧВН="); // "0000000042"
// Ноль выводить как пустую строку
Стр = Формат(0, "ЧН="); // ""
Форматирование дат
Для дат удобны конструкции ДФ (шаблон даты) и ДЛФ (локальный формат). Шаблон ДФ=yyyy-MM-dd даёт формат ISO, который корректно сортируется как строка и принимается большинством внешних систем.
Д = ТекущаяДатаСеанса();
Стр = Формат(Д, "ДФ=yyyy-MM-dd"); // "2026-03-15"
Стр = Формат(Д, "ДФ='dd.MM.yyyy HH:mm:ss'"); // "15.03.2026 10:30:00"
Стр = Формат(Д, "ДЛФ=DD"); // длинный формат даты по локали
Стр = Формат(Д, "ДЛФ=T"); // только время
Форматирование булево
Для типа Булево параметр БЛ/БИ задаёт текст для «Ложь» и «Истина». По умолчанию Формат(Истина) вернёт «Да», что не всегда подходит для обмена — в JSON и веб-сервисах обычно нужны «true»/«false».
Стр = Формат(Истина, "БЛ=false; БИ=true"); // "true"
// Универсальный пример: строка для имени файла с датой
ИмяФайла = "Выгрузка_" + Формат(ТекущаяДатаСеанса(), "ДФ=yyyy-MM-dd_HH-mm-ss") + ".xml";Конкатенация и неявное преобразование
Оператор «+» со строкой слева автоматически преобразует правый операнд в строку. Это удобно для быстрого формирования сообщений, но у неявного преобразования те же ограничения, что у Строка(): результат зависит от региональных настроек и представления объекта.
Текст = "Документ № " + Документ.Номер + " от " + Формат(Документ.Дата, "ДЛФ=D");
Сообщить(Текст);
Для сложных текстов с несколькими подстановками читабельнее функция СтрШаблон(): она подставляет значения вместо маркеров %1, %2 и так далее, автоматически преобразуя их в строки. Это также правильный путь для сообщений, которые могут локализоваться.
Текст = СтрШаблон("Недостаточно товара ""%1"": требуется %2, доступно %3",
Строка(Номенклатура),
Формат(Требуется, "ЧДЦ=3"),
Формат(Доступно, "ЧДЦ=3"));
Сериализация: XMLСтрока, ЗначениеВСтрокуВнутр, JSON
Когда строка нужна не для показа пользователю, а для хранения или передачи, используются механизмы сериализации. Они дают однозначный, обратимый результат, не зависящий от локали.
XMLСтрока и XMLЗначение
Функция XMLСтрока() преобразует примитивные типы и ссылки в строку формата XML. Обратное преобразование — XMLЗначение() с указанием типа. Для ссылок результат содержит тип объекта и GUID, что позволяет однозначно восстановить ссылку.
Стр = XMLСтрока(Ссылка);
// "b8c5f4a2-..." с указанием типа, например:
// "CatalogRef.Номенклатура:b8c5f4a2-..."
СтрДата = XMLСтрока(ТекущаяДатаСеанса()); // "2026-03-15T10:30:00"
Восстановленная = XMLЗначение(Тип("Дата"), СтрДата);
ЗначениеВСтрокуВнутр
Функция ЗначениеВСтрокуВнутр() сериализует значение во внутренний формат платформы — включая таблицы значений, структуры и другие сложные объекты. Обратное действие — ЗначениеИзСтрокиВнутр(). Важное ограничение: формат внутренний, его не гарантируется читать другими системами или другими версиями платформы, поэтому для долгосрочного хранения и обмена предпочтительнее XML или JSON.
JSON
Для интеграций стандарт де-факто — JSON. Платформа предоставляет объекты ЗаписьJSON/ЧтениеJSON, а примитивные значения сериализуются автоматически. Даты по умолчанию пишутся в формате ISO.
Запись = Новый ЗаписьJSON;
Запись.УстановитьСтроку();
ЗаписатьJSON(Запись, Новый Структура("Сумма, Дата", 100.5, ТекущаяДатаСеанса()));
Стр = Запись.Закрыть(); // {"Сумма":100.5,"Дата":"2026-03-15T10:30:00"}
Сравнение способов преобразования
Быстро и просто, но результат зависит от локали и представления объекта. Подходит для сообщений пользователю.
Полный контроль над видом чисел, дат и булево. Подходит для печатных форм, имён файлов, обмена.
Однозначная обратимая сериализация примитивов и ссылок. Подходит для хранения и обмена.
Сериализует любые объекты, включая таблицы значений. Только внутри платформы, не для внешних систем.
Стандарт для веб-интеграций. Требует ручной обработки ссылок и сложных типов.
Особые случаи: ссылки, перечисления, типы и Неопределено
Некоторые типы ведут себя неочевидно. Значение Неопределено функция Строка() преобразует в пустую строку, NULL — тоже в пустую строку. Это удобно, но может маскировать ошибку: пустая строка в сообщении не скажет, было ли значение вообще.
Перечисления преобразуются в своё представление (синоним значения). Если нужно имя значения, как оно задано в конфигураторе, используйте XMLСтрока(ПеречислениеСсылка) или обращение через метаданные.
Для получения строкового имени типа значения применяется связка XMLТипЗнч(Значение).ИмяТипа — это надёжнее, чем разбор строки от Строка(ТипЗнч(Значение)), которая возвращает локализованное представление типа.
ИмяТипа = XMLТипЗнч(Значение).ИмяТипа; // "CatalogRef.Номенклатура"
// Имя значения перечисления как в конфигураторе
ИмяЗначения = XMLСтрока(Перечисления.СтавкиНДС.НДС20); // "НДС20"
Как проверить результат преобразования
После преобразования полезно убедиться, что строка соответствует ожиданиям, особенно если она уходит во внешнюю систему. Минимальная проверка — длина строки и соответствие шаблону через СтрПодобнаПоРегулярномуВыражению() или простые функции работы со строками.
Для обратимых преобразований (XMLСтрока, JSON) лучший тест — выполнить обратное преобразование и сравнить с исходным значением. Если восстановленное значение равно исходному, сериализация корректна.
Стр = XMLСтрока(ДатаИсходная);
Если XMLЗначение(Тип("Дата"), Стр) = ДатаИсходная Тогда
// Преобразование обратимо
КонецЕсли;
Как проверить результат
Разделитель дробной части — точка, нет пробелов-разделителей групп
Запятая или неразрывные пробелы в строке
Формат ISO: yyyy-MM-dd или yyyy-MM-ddTHH:mm:ss
Локальный формат dd.MM.yyyy
GUID или XMLСтрока с типом
Только наименование объекта
Обратное преобразование даёт исходное значение
Ошибка разбора или потеря данных
Практические рекомендации по выбору способа
Для сообщений пользователю и журнала регистрации достаточно Строка() или СтрШаблон() — здесь локализованное представление даже предпочтительнее. Для печатных форм, имён файлов и любых строк, которые будут обрабатываться программно, всегда используйте Формат() с явной форматной строкой.
Для интеграций и хранения выбирайте сериализацию: JSON для REST и веб-сервисов, XMLСтрока для одиночных значений внутри платформы, XDTO-сериализацию для сложных объектов при обмене между информационными базами. Избегайте ЗначениеВСтрокуВнутр() для данных, которые должны пережить обновление платформы.
Отдельное правило: никогда не собирайте строки запросов к базе или тексты программного кода через конкатенацию с преобразованными значениями без контроля — это путь к ошибкам и уязвимостям. Для запросов используйте параметры, для кода — шаблоны.
Как выбрать способ
Что важно запомнить
Строка() — для интерфейса, Формат() — для контролируемого вывода, XMLСтрока и JSON — для хранения и обмена. Не полагайтесь на локаль в строках, которые читают программы, и не используйте представление ссылки как идентификатор.
Частые вопросы
Чем отличается Строка() от Формат()?
Строка() возвращает представление значения по умолчанию с учётом региональных настроек сеанса и не позволяет управлять результатом. Формат() принимает форматную строку, которая задаёт точный вид числа, даты или булево независимо от локали. Для любого машиночитаемого вывода используйте Формат().
Как преобразовать число в строку без пробелов между разрядами?
Используйте Формат с пустым разделителем групп: Формат(Число, "ЧРГ="). Если нужен и разделитель дробной части «точка», добавьте ЧРД=.: Формат(Число, "ЧРД=.; ЧРГ=").
Как получить GUID ссылки в виде строки?
Вызовите Строка(Ссылка.УникальныйИдентификатор()) — получите строку вида "b8c5f4a2-1d3e-4f5a-9b8c-7d6e5f4a3b2c". Альтернатива — XMLСтрока(Ссылка), которая дополнительно включает тип объекта и позволяет восстановить ссылку через XMLЗначение().
Почему Строка(Дата) в разных базах даёт разный результат?
Формат вывода даты функцией Строка() определяется региональными настройками сеанса (код локализации информационной базы или сеанса). Чтобы получить одинаковый результат везде, используйте Формат(Дата, "ДФ=yyyy-MM-dd") или XMLСтрока(Дата).
Как преобразовать таблицу значений в строку?
Напрямую Строка() для таблицы значений не даёт полезного результата. Используйте ЗначениеВСтрокуВнутр(Таблица) для внутреннего хранения или сериализацию в JSON через ЗаписьJSON для обмена. Для восстановления — ЗначениеИзСтрокиВнутр() или ЧтениеJSON соответственно.
Что вернёт Строка() для значения Неопределено?
Пустую строку. То же произойдёт с NULL. Если важно различать «пусто» и «значение отсутствует», проверяйте значение перед преобразованием: Значение = Неопределено или ЗначениеЗаполнено().