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

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

1С: как выразить несовместимые типы как строку

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

Встроенный язык 1С строго типизирован: операция «+» между строкой и числом, датой или ссылкой вызовет ошибку «Операции сравнения на больше-меньше допустимы только для значений совпадающих примитивных типов» или «Несоответствие типов (параметр номер N)». Чтобы объединить значения разных типов в одну строку — для сообщения пользователю, записи в журнал регистрации, формирования имени файла или текста запроса — нужно явно привести каждое значение к строковому типу.

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

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

Почему возникает ошибка несовместимых типов

Ошибка появляется, когда в одном выражении смешиваются типы без явного приведения. Классический пример — конкатенация строки с числом или датой: Текст = "Остаток: " + Остаток + " шт.";, где Остаток имеет тип Число. Платформа не выполняет неявное преобразование и прерывает выполнение с сообщением о несоответствии типов.

Та же проблема возникает при сравнении значений разных примитивных типов операторами «больше/меньше», при передаче ссылки туда, где ожидается строка (например, в некоторые параметры методов работы с файлами), и при попытке сложить строку с булевым значением. Признак ситуации — текст ошибки «Несоответствие типов» с указанием номера параметра или «Преобразование значения к типу ... не может быть выполнено».

Важно понимать: приведение к строке решает задачу представления, но не задачу логики. Если число нужно для арифметики, его нельзя «чинить» переводом в строку — нужно исправлять тип самого значения. Строковое приведение уместно только там, где результат действительно должен быть текстом.

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

Функция Строка(Значение) — самый универсальный инструмент. Она принимает значение практически любого типа: число, дату, булево, ссылку на объект базы, перечисление, Неопределено, NULL — и возвращает строковое представление. Пример: Текст = "Документ: " + Строка(ДокументСсылка); — в результате получится что-то вроде «Документ: Реализация товаров и услуг 0000-000123 от 12.03.2026».

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

Ограничение: Строка() не подходит, когда нужен строго определённый формат. Число 1234.5 может вывестись как «1 234,5» с неразрывным пробелом в качестве разделителя групп — такой текст нельзя обратно преобразовать функцией Число() без предварительной очистки. Для машинно-читаемых строк используйте Формат() или XMLСтрока().

Остаток = 1234.5;

ТекстСообщения = "Остаток на складе: " + Строка(Остаток) + " шт.";

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

СсылкаНаДокумент = Документы.РеализацияТоваровУслуг.НайтиПоНомеру(1, ТекущаяДатаСеанса());

Сообщить("Найден документ: " + Строка(СсылкаНаДокумент));

Форматированный вывод: функция Формат()

Когда строка должна иметь точный вид — без разделителей групп, с фиксированным числом знаков после запятой, с датой в формате ISO — используется Формат(Значение, ФорматнаяСтрока). Например, Формат(Сумма, "ЧГ=0; ЧРД=.; ЧН=0") выдаст число без группировки разрядов, с точкой как разделителем дробной части и нулём вместо пустой строки — такое значение корректно парсится обратно.

Для дат форматная строка задаётся через конструкции вида ДФ=yyyy-MM-dd: Формат(ТекущаяДатаСеанса(), "ДФ=yyyy-MM-dd_HH-mm-ss") удобно для имён файлов выгрузок. Для булева доступны варианты БЛ=Нет; БИ=Да или свои произвольные подписи. Полный синтаксис форматной строки описан в синтакс-помощнике по ключевому слову «Формат».

bsl
Сумма = 1234.5;
СтрокаБезГрупп = Формат(Сумма, "ЧГ=0; ЧРД=.; ЧН=0"); // "1234.5"
ДатаСтрокой = Формат(ТекущаяДатаСеанса(), "ДФ=yyyy-MM-dd"); // "2026-03-12"
Признак = Формат(Истина, "БЛ=Нет; БИ=Да"); // "Да"

Частая ошибка — забыть параметр ЧГ=0 при выгрузке чисел в файлы обмена. Внешняя система получает «1 234,5» с неразрывным пробелом и не может распарсить значение. Всегда проверяйте результат функцией Число() на обратное преобразование, если строка предназначена для машинной обработки.

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

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

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

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

Сравнение способов приведения к строке

Строка()

Любой тип, человекочитаемый вид. Не подходит для машинного парсинга и обратного преобразования.

Формат()

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

XMLСтрока()

Примитивы и ссылки с возможностью восстановления. Для сложных объектов не применима.

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

Почти любые значения, включая коллекции. Формат внутренний, только для обмена внутри 1С.

СтрШаблон()

Сборка сообщения из нескольких значений с автоматическим приведением. Не даёт контроля над форматом каждого параметра.

Сборка сообщений через СтрШаблон()

Когда нужно объединить несколько значений разных типов в одну фразу, удобнее всего СтрШаблон(Шаблон, П1, П2, ...): СтрШаблон("Документ %1 на сумму %2 не проведён", ДокументСсылка, СуммаДокумента). Параметры приводятся к строке автоматически — фактически тем же механизмом, что и Строка(), поэтому явное преобразование не требуется и ошибки несовместимости не возникает.

Ограничение то же, что у Строка(): формат подстановки не контролируется. Если сумма должна выводиться с двумя знаками и без разделителей групп, параметр нужно предварительно обернуть в Формат(): СтрШаблон("Сумма: %1", Формат(Сумма, "ЧДЦ=2; ЧГ=0")). Для записи в журнал регистрации и пользовательских сообщений это стандартная практика.

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

Специальные случаи: Неопределено, NULL, типы и коллекции

Значение Неопределено функция Строка() превращает в пустую строку — это частая причина «пропавших» данных в сообщениях. Если нужно явно показать отсутствие значения, используйте тернарную проверку: ?(Значение = Неопределено, "<не задано>", Строка(Значение)). Значение NULL (результат запроса) в Строка() передавать нельзя — будет ошибка; сначала проверяйте Если Значение = NULL Тогда или используйте ЕСТЬNULL() в запросе.

Значение типа Тип (например, Тип("СправочникСсылка.Номенклатура")) приводится к строке вида «Справочник ссылка: Номенклатура» — это удобно для диагностических сообщений об ошибках типизации. Массивы, структуры и таблицы значений Строка() не преобразует осмысленно: получите либо ошибку, либо техническое описание. Для них нужна сериализация через ЗаписьJSON, ЗначениеВСтрокуВнутр() или ручной обход коллекции со сборкой строки.

Типичные ошибки
01
Складывать строку с числом без Строка() или СтрШаблон() — ошибка «Несоответствие типов» в момент выполнения.
02
Выгружать число через Строка() в файл обмена — внешняя система не парсит «1 234,5» из-за неразрывного пробела; нужен Формат() с ЧГ=0.
03
Передавать NULL из запроса в Строка() — ошибка преобразования; сначала проверка на NULL или ЕСТЬNULL() в запросе.
04
Ожидать, что Строка(Ссылка) вернёт GUID — возвращается представление; для GUID используйте XMLСтрока() или Ссылка.УникальныйИдентификатор().
05
Пытаться восстановить значение из Строка() — обратного преобразования нет; для сериализации нужны XMLСтрока() или ЗначениеВСтрокуВнутр().

Проверка результата и границы применения

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

Отдельно проверяйте поведение на граничных значениях: пустая дата (01.01.0001), ноль, Неопределено, пустая ссылка. Пустая ссылка через Строка() даст пустое представление или служебный текст в зависимости от типа — в сообщениях это выглядит как «дырка». Для пустых ссылок добавляйте проверку Ссылка.Пустая() и подставляйте осмысленную заглушку.

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

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

Строка для пользователя
Норма

Текст читается естественно, без служебных символов и пустых мест

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

В тексте «дырки» от Неопределено, нечитаемые представления объектов

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

Число(СтрокаРезультата) возвращает исходное значение без ошибки

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

Ошибка преобразования из-за разделителей групп или запятой

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

XMLСтрока(Ссылка) даёт GUID, обратное получение ссылки работает

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

Использовано представление ссылки, которое меняется при переименовании

Граничные значения
Норма

Неопределено, NULL и пустые ссылки обработаны отдельными проверками

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

Падение на NULL или пустые подстроки в сообщениях

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

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

Используйте Строка(Ссылка) или СтрШаблон("Документ %1 не проведён", Ссылка) — получится привычное представление вида «Реализация товаров и услуг 000123 от 12.03.2026». Перед этим проверьте Ссылка.Пустая(), чтобы не вывести пустую подстроку.

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

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

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

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

Почему Формат() выдаёт пустую строку для числа?

Так работает формат по умолчанию для нуля в некоторых форматных строках — добавьте параметр ЧН=0, чтобы ноль выводился явно. Также проверьте, что в функцию не передано Неопределено вместо числа.

Можно ли сложить строку с датой без ошибки?

Напрямую нельзя — будет ошибка несоответствия типов. Оберните дату в Строка() или Формат(): "Отчёт за " + Формат(Период, "ДЛФ=D"). Либо используйте СтрШаблон("Отчёт за %1", Период), который приведёт дату автоматически.

Как из строки GUID получить ссылку на объект?

Через менеджер объекта: Документы.РеализацияТоваровУслуг.ПолучитьСсылку(Новый УникальныйИдентификатор(СтрокаГУИД)). Учтите, что если объект удалён, вы получите «битую» ссылку — проверяйте её существование запросом или через ПолучитьОбъект() с обработкой результата.

Итог

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

Ошибка несовместимых типов решается явным приведением: Строка() — для пользовательских сообщений, Формат() — для чисел и дат с точным форматом, XMLСтрока() — для GUID ссылок и интеграций, СтрШаблон() — для сборки фраз из нескольких значений. NULL и Неопределено обрабатывайте отдельными проверками, а машиночитаемые строки всегда проверяйте обратным преобразованием.