Строка в 1С: как узнать тип значения, найти и обработать

· 9 мин

Содержание

Чтобы в коде определить, что значение — строка, пишут ТипЗнч(Знач) = Тип("Строка"). В отладчике тип видно в окне Табло и по команде Вычислить выражение. В запросе тип составного поля проверяют функцией ТИПЗНАЧЕНИЯ().

Но «определить строку 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 означает строку неограниченной длины — её хранят отдельно и в запросах с ней есть ограничения (об этом ниже).

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

  1. Поставьте точку останова на нужной строке кода (F9).
  2. Запустите в режиме отладки и дождитесь остановки.
  3. Наведите курсор на переменную — всплывёт её значение.
  4. Выделите выражение и нажмите Shift+F9 (Вычислить выражение) — увидите значение и тип.
  5. Добавьте переменную в окно Табло, чтобы следить за ней на каждом шаге.

В окне Вычислить выражение можно прямо проверить тип: наберите ТипЗнч(Перем) и выполните — вернётся имя типа. Это быстрее, чем дописывать Сообщить в код и перезапускать. В окно Табло тоже можно вписать не только имя переменной, но и выражение — например СтрДлина(Перем), чтобы на каждом шаге видеть, не изменилась ли длина строки.

Если проблема возникает только на определённом значении, поставьте условную точку останова: щёлкните по уже заданной точке правой кнопкой и задайте условие, например Перем = "нужное значение". Тогда выполнение остановится не на каждом проходе, а только там, где строка совпала с ожидаемой. Это экономит время при переборе больших списков, когда сбоит одна запись из тысячи.

Строки в запросах и системе компоновки данных

В языке запросов строковый тип обозначается литералом ТИП(СТРОКА). Для поля составного типа (например, значение в регистре дополнительных сведений) тип проверяют функцией ТИПЗНАЧЕНИЯ:

ВЫБРАТЬ
    Данные.Значение
ИЗ
    РегистрСведений.ДополнительныеСведения КАК Данные
ГДЕ
    ТИПЗНАЧЕНИЯ(Данные.Значение) = ТИП(СТРОКА)

Привести поле к строке и ограничить длину помогает ВЫРАЗИТЬ:

ВЫБРАТЬ
    ВЫРАЗИТЬ(Контрагенты.Комментарий КАК СТРОКА(200)) КАК Комментарий
ИЗ
    Справочник.Контрагенты КАК Контрагенты

Это не просто формальность. Строку неограниченной длины нельзя использовать в условиях ГДЕ, в УПОРЯДОЧИТЬ ПО, в группировках и соединениях. Если поле такое — оберните его в ВЫРАЗИТЬ(Поле КАК СТРОКА(N)), иначе запрос выдаст ошибку.

Из полезного по строкам в запросах:

  • ПОДСТРОКА(Строка, Позиция, Длина) — отрезать часть.
  • ЕСТЬNULL(Поле, "") — заменить NULL на пустую строку после соединения таблиц.
  • Литерал строки в тексте запроса пишут в двойных кавычках: "Проведён".
  • ПОДОБНО — поиск по шаблону: % заменяет любое число символов, _ — ровно один.

Поиск всех контрагентов, чьё наименование начинается на «ООО», выглядит так:

ВЫБРАТЬ
    Контрагенты.Наименование
ИЗ
    Справочник.Контрагенты КАК Контрагенты
ГДЕ
    Контрагенты.Наименование ПОДОБНО "ООО%"

Учтите, что чувствительность сравнения строк к регистру в запросе задаётся настройками базы данных, а не самим запросом. Если результат зависит от регистра критично — приводите строки к одному регистру заранее, на стороне кода.

В системе компоновки данных тип поля берётся из набора данных автоматически. Для строкового поля в отборе доступны операторы Содержит, Начинается с, В списке. Если поле составное, укажите в настройках нужный тип значения — тогда СКД покажет подходящие варианты сравнения.

Литералы, константы и перечисления

Строковый литерал во встроенном языке — это текст в двойных кавычках. Чтобы вставить кавычку внутрь, её удваивают:

Текст = "Он сказал ""да"" и подписал договор";

Многострочный текст (чаще всего — текст запроса) переносят вертикальной чертой в начале каждой строки:

Запрос.Текст =
    "ВЫБРАТЬ
    |   Товары.Наименование
    |ИЗ
    |   Справочник.Номенклатура КАК Товары";

Константы. В конфигураторе константа может иметь тип Строка — так хранят, например, название организации или строку подключения. Прочитать её значение можно через менеджер: Константы.ИмяКонстанты.Получить() вернёт строку.

Перечисления — это не строки, хотя их часто путают. Значение перечисления — отдельный тип, а не текст. Сравнивать его надо по значению, а не по названию:

Если Контакт.Вид = Перечисления.ВидыКонтактнойИнформации.Адрес Тогда
    // верно
КонецЕсли;

Если нужна именно строка — текст для вывода пользователю — берите представление:

Представление = Строка(Перечисления.ВидыКонтактнойИнформации.Адрес);

Сравнивать перечисление со строкой-литералом (Контакт.Вид = "Адрес") нельзя: типы разные, условие никогда не сработает так, как вы ждёте.

Частые ошибки со строками и как их отладить

Большинство проблем со строками — это неявное приведение типов и невидимые символы. Вот как связать симптом с причиной.

Диагностика: выберите симптом

Для разбора таких ситуаций в отладчике удобно в окне Вычислить выражение проверять не только значение, но и СтрДлина() — расхождение длины на один-два символа обычно указывает на скрытые пробелы или неразрывный пробел.

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

Чем `Тип("Строка")` отличается от `ТипЗнч(Знач)`?
Тип("Строка") — это эталонное значение типа, которое вы создаёте сами. ТипЗнч(Знач) возвращает тип конкретного значения. Определение сводится к сравнению этих двух: ТипЗнч(Знач) = Тип("Строка").
Как проверить, что строка пустая?
Функцией ПустаяСтрока(Знач) — она вернёт Истина и для пустой строки, и для строки из одних пробелов. Сравнение Знач = "" пробелы не учтёт.
Можно ли узнать тип поля запроса прямо в запросе?
Да, для полей составного типа: ТИПЗНАЧЕНИЯ(Поле) = ТИП(СТРОКА). Для поля заведомо строкового типа это не нужно — он известен из метаданных.
Почему строка и перечисление не сравниваются?
Значение перечисления — это отдельный тип, а не текст. Сравнивайте перечисление со значением перечисления; строку для вывода получайте через Строка(Перечисления...).
Что вернёт `СтрНайти`, если подстроки нет?
Ноль. Любой результат больше нуля — это позиция первого вхождения. Поэтому проверка пишется как Если СтрНайти(...) > 0 Тогда.
Чем отличаются пустая строка, `NULL` и `Неопределено`?
Пустая строка "" — это значение строкового типа без символов. NULL приходит из запроса, когда в соединении нет связанной записи. Неопределено — отдельный тип для «значение не задано». Это три разных типа, и сравнивать их между собой напрямую нельзя.