Строка в 1С: как узнать тип значения, найти и обработать
Содержание
Чтобы в коде определить, что значение — строка, пишут ТипЗнч(Знач) = Тип("Строка"). В отладчике тип видно в окне Табло и по команде Вычислить выражение. В запросе тип составного поля проверяют функцией ТИПЗНАЧЕНИЯ().
Но «определить строку 1С» — это ещё и опознать строковый реквизит в конфигурации, отличить пустую строку от NULL и Неопределено, правильно склеить и сравнить текст. Ниже разберём каждый случай: встроенный язык, конфигуратор, запросы и систему компоновки данных.
Что на самом деле стоит за задачей
За одной формулировкой прячется несколько разных задач. От того, какая именно ваша, зависит и способ.
- 🔍 Проверить тип значения в коде — значение в переменной строковое или нет.
- 🧩 Опознать реквизит — какой тип у поля справочника, документа, регистра.
- 🧮 Определить тип поля в запросе или СКД — когда поле составного типа.
- ✂️ Разобрать строку — найти подстроку, длину, отрезать часть.
- ⚖️ Сравнить строки — учесть регистр, концевые пробелы, пустые значения.
Дальше — по порядку, от встроенного языка к запросам.
Как в коде проверить, что значение строковое
Основной инструмент — функция ТипЗнч(). Она возвращает тип значения, который сравнивают с эталоном Тип("Строка").
Если ТипЗнч(Значение) = Тип("Строка") Тогда
Сообщить(СтрШаблон("Это строка длиной %1", СтрДлина(Значение)));
КонецЕсли;
Обратите внимание: длину (число) не склеиваем со строкой через +, а подставляем через СтрШаблон — так вывод предсказуем.
Когда типов несколько, эталоны удобно вычислить заранее и сравнивать с ними:
ТипСтрока = Тип("Строка");
ТипЧисло = Тип("Число");
Если ТипЗнч(Значение) = ТипСтрока Тогда
ОбработатьТекст(Значение);
ИначеЕсли ТипЗнч(Значение) = ТипЧисло Тогда
ОбработатьЧисло(Значение);
КонецЕсли;
ТипЗнч вернёт Тип("Строка") для любой строки — и неограниченной, и фиксированной длины. Длина на результат проверки типа не влияет.
Нужно не узнать тип, а убедиться, что в строке есть содержимое? Для этого есть ПустаяСтрока(Значение) — вернёт Истина, если строка пустая или состоит только из пробелов.
Если тип заранее неизвестен, а текстовое представление нужно в любом случае, подойдёт функция Строка(Значение). Она приводит к строке число, дату, булево, ссылку — по правилам представления. Но для проверки «а это точно строка?» она не годится: Строка(5) вернёт "5", и исходный тип вы потеряете.
Длина, поиск и разбор строки
Когда со строкой уже работаете, набор функций небольшой и стабильный.
СтрДлина(Строка)— количество символов.СтрНайти(Строка, Подстрока)— позиция первого вхождения,0если не найдено.Лев(Строка, Кол),Прав(Строка, Кол),Сред(Строка, Начало, Длина)— отрезать часть.СтрЗаменить(Строка, Что, НаЧто)— замена всех вхождений.СокрЛП(Строка)— убрать пробелы слева и справа.ВРег,НРег,ТРег— верхний, нижний регистр и регистр заголовка.
Функции СтрНайти, СтрРазделить, СтрСоединить, СтрШаблон и СтрЧислоВхождений появились в платформе 8.3.6. На более ранних версиях вместо СтрНайти работает глобальная Найти(Строка, Подстрока). Функции СтрНачинаетсяС и СтрЗаканчиваетсяНа доступны в платформе 8.3.9 и новее.
Сводка по основным функциям:
| Функция | Что делает | Результат |
|---|---|---|
СтрДлина | число символов | Число |
СтрНайти | позиция подстроки | Число (0, если нет) |
СтрЧислоВхождений | сколько раз встречается подстрока | Число |
СтрНачинаетсяС | начинается ли строка с подстроки | Булево |
ПустаяСтрока | пустая или только пробелы | Булево |
СтрСравнить | сравнение без учёта регистра | -1, 0 или 1 |
Строка | представление значения текстом | Строка |
Пример — вытащить домен из адреса почты:
Почта = "ivanov@example.com";
Позиция = СтрНайти(Почта, "@");
Если Позиция > 0 Тогда
Домен = Сред(Почта, Позиция + 1);
Сообщить(Домен); // example.com
КонецЕсли;
Разбить строку по разделителю и собрать обратно:
Части = СтрРазделить("10;20;30", ";"); // массив из трёх элементов
Строка = СтрСоединить(Части, " + "); // "10 + 20 + 30"
СтрНайти различает регистр. Чтобы искать без учёта регистра, приведите обе строки к одному: СтрНайти(НРег(Текст), НРег(Образец)).
Когда строки нужно именно сравнить, а не искать подстроку, пригодится СтрСравнить. Она сравнивает без учёта регистра и возвращает 0, если строки равны:
Если СтрСравнить(ВведённыйКод, ЭталонныйКод) = 0 Тогда
// коды совпадают, регистр не важен
КонецЕсли;
Проверить, с чего строка начинается или чем заканчивается, удобно отдельными функциями — они возвращают булево и читаются понятнее, чем проверка позиции:
Если СтрНачинаетсяС(Телефон, "+7") Тогда
// российский номер
КонецЕсли;
Как получить строку из числа и даты
Отдельная частая задача — не проверить тип, а наоборот: собрать строку из значений других типов. Простое Строка(Значение) даёт представление по умолчанию, но для чисел и дат вид лучше задавать явно функцией Формат.
Числа:
Формат(1234567, "ЧГ=0"); // "1234567" — без разделителей разрядов
Формат(12.5, "ЧДЦ=2"); // "12,50" — ровно два знака после запятой
Здесь ЧГ=0 отключает группировку тысяч, а ЧДЦ задаёт число дробных знаков. Без этого число в строке может прийти с неразрывными пробелами-разделителями — и потом «не сойтись» при сравнении.
Даты:
Формат(ТекущаяДата(), "ДФ=dd.MM.yyyy"); // "07.10.2026"
Формат(ТекущаяДата(), "ДЛФ=D"); // длинный формат с названием месяца
Параметр ДФ задаёт формат датой-строкой, ДЛФ=D — стандартный длинный формат. Простое Строка(Дата) тоже сработает, но вид будет зависеть от региональных настроек, а время добавится, только если оно в дате не нулевое. Когда формат важен — задавайте его явно.
Как увидеть тип строки в конфигураторе и отладчике
Если вопрос в том, строковый ли реквизит объекта, ответ — в конфигураторе.
Откройте карточку реквизита справочника, документа или измерения/ресурса регистра. У строкового реквизита в свойстве Тип стоит Строка, а ниже задаётся Длина (число символов) и Допустимая длина:
Переменная— хранится столько символов, сколько ввели (до указанного предела).Фиксированная— строка всегда дополняется пробелами до заданной длины.- Длина
0означает строку неограниченной длины — её хранят отдельно и в запросах с ней есть ограничения (об этом ниже).
Чтобы посмотреть тип значения прямо во время выполнения, пользуйтесь отладчиком.
- Поставьте точку останова на нужной строке кода (
F9). - Запустите в режиме отладки и дождитесь остановки.
- Наведите курсор на переменную — всплывёт её значение.
- Выделите выражение и нажмите
Shift+F9(Вычислить выражение) — увидите значение и тип. - Добавьте переменную в окно
Табло, чтобы следить за ней на каждом шаге.
В окне Вычислить выражение можно прямо проверить тип: наберите ТипЗнч(Перем) и выполните — вернётся имя типа. Это быстрее, чем дописывать Сообщить в код и перезапускать. В окно Табло тоже можно вписать не только имя переменной, но и выражение — например СтрДлина(Перем), чтобы на каждом шаге видеть, не изменилась ли длина строки.
Если проблема возникает только на определённом значении, поставьте условную точку останова: щёлкните по уже заданной точке правой кнопкой и задайте условие, например Перем = "нужное значение". Тогда выполнение остановится не на каждом проходе, а только там, где строка совпала с ожидаемой. Это экономит время при переборе больших списков, когда сбоит одна запись из тысячи.
Строки в запросах и системе компоновки данных
В языке запросов строковый тип обозначается литералом ТИП(СТРОКА). Для поля составного типа (например, значение в регистре дополнительных сведений) тип проверяют функцией ТИПЗНАЧЕНИЯ:
ВЫБРАТЬ
Данные.Значение
ИЗ
РегистрСведений.ДополнительныеСведения КАК Данные
ГДЕ
ТИПЗНАЧЕНИЯ(Данные.Значение) = ТИП(СТРОКА)
Привести поле к строке и ограничить длину помогает ВЫРАЗИТЬ:
ВЫБРАТЬ
ВЫРАЗИТЬ(Контрагенты.Комментарий КАК СТРОКА(200)) КАК Комментарий
ИЗ
Справочник.Контрагенты КАК Контрагенты
Это не просто формальность. Строку неограниченной длины нельзя использовать в условиях ГДЕ, в УПОРЯДОЧИТЬ ПО, в группировках и соединениях. Если поле такое — оберните его в ВЫРАЗИТЬ(Поле КАК СТРОКА(N)), иначе запрос выдаст ошибку.
Из полезного по строкам в запросах:
ПОДСТРОКА(Строка, Позиция, Длина)— отрезать часть.ЕСТЬNULL(Поле, "")— заменитьNULLна пустую строку после соединения таблиц.- Литерал строки в тексте запроса пишут в двойных кавычках:
"Проведён". ПОДОБНО— поиск по шаблону:%заменяет любое число символов,_— ровно один.
Поиск всех контрагентов, чьё наименование начинается на «ООО», выглядит так:
ВЫБРАТЬ
Контрагенты.Наименование
ИЗ
Справочник.Контрагенты КАК Контрагенты
ГДЕ
Контрагенты.Наименование ПОДОБНО "ООО%"
Учтите, что чувствительность сравнения строк к регистру в запросе задаётся настройками базы данных, а не самим запросом. Если результат зависит от регистра критично — приводите строки к одному регистру заранее, на стороне кода.
В системе компоновки данных тип поля берётся из набора данных автоматически. Для строкового поля в отборе доступны операторы Содержит, Начинается с, В списке. Если поле составное, укажите в настройках нужный тип значения — тогда СКД покажет подходящие варианты сравнения.
Литералы, константы и перечисления
Строковый литерал во встроенном языке — это текст в двойных кавычках. Чтобы вставить кавычку внутрь, её удваивают:
Текст = "Он сказал ""да"" и подписал договор";
Многострочный текст (чаще всего — текст запроса) переносят вертикальной чертой в начале каждой строки:
Запрос.Текст =
"ВЫБРАТЬ
| Товары.Наименование
|ИЗ
| Справочник.Номенклатура КАК Товары";
Константы. В конфигураторе константа может иметь тип Строка — так хранят, например, название организации или строку подключения. Прочитать её значение можно через менеджер: Константы.ИмяКонстанты.Получить() вернёт строку.
Перечисления — это не строки, хотя их часто путают. Значение перечисления — отдельный тип, а не текст. Сравнивать его надо по значению, а не по названию:
Если Контакт.Вид = Перечисления.ВидыКонтактнойИнформации.Адрес Тогда
// верно
КонецЕсли;
Если нужна именно строка — текст для вывода пользователю — берите представление:
Представление = Строка(Перечисления.ВидыКонтактнойИнформации.Адрес);
Сравнивать перечисление со строкой-литералом (Контакт.Вид = "Адрес") нельзя: типы разные, условие никогда не сработает так, как вы ждёте.
Частые ошибки со строками и как их отладить
Большинство проблем со строками — это неявное приведение типов и невидимые символы. Вот как связать симптом с причиной.
"Итого " + Сумма число приводится к строке с группировкой разрядов. Используйте Формат(Сумма, "ЧГ=0") или СтрШаблон("Итого %1", Сумма).+ (Сумма + "руб") либо вы сравниваете строку с числом. Приведите число к строке через Строка() или собирайте текст через СтрШаблон.СокрЛП() к обеим строкам, а для регистронезависимого сравнения — НРег().NULL, а не пустая строка. В запросе оберните его в ЕСТЬNULL(Поле, ""), в коде проверяйте ПустаяСтрока(Строка(Значение)).ГДЕ, группировку или сортировку. Оберните его: ВЫРАЗИТЬ(Поле КАК СТРОКА(150)).Для разбора таких ситуаций в отладчике удобно в окне Вычислить выражение проверять не только значение, но и СтрДлина() — расхождение длины на один-два символа обычно указывает на скрытые пробелы или неразрывный пробел.
Частые вопросы
Чем `Тип("Строка")` отличается от `ТипЗнч(Знач)`?
Тип("Строка") — это эталонное значение типа, которое вы создаёте сами. ТипЗнч(Знач) возвращает тип конкретного значения. Определение сводится к сравнению этих двух: ТипЗнч(Знач) = Тип("Строка").Как проверить, что строка пустая?
ПустаяСтрока(Знач) — она вернёт Истина и для пустой строки, и для строки из одних пробелов. Сравнение Знач = "" пробелы не учтёт.Можно ли узнать тип поля запроса прямо в запросе?
ТИПЗНАЧЕНИЯ(Поле) = ТИП(СТРОКА). Для поля заведомо строкового типа это не нужно — он известен из метаданных.Почему строка и перечисление не сравниваются?
Строка(Перечисления...).Что вернёт `СтрНайти`, если подстроки нет?
Если СтрНайти(...) > 0 Тогда.Чем отличаются пустая строка, `NULL` и `Неопределено`?
"" — это значение строкового типа без символов. NULL приходит из запроса, когда в соединении нет связанной записи. Неопределено — отдельный тип для «значение не задано». Это три разных типа, и сравнивать их между собой напрямую нельзя.