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

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

Что такое строка (текст) в 1С и как с ней работать

Что такое строка (текст) в 1С: тип данных «Строка», операции, функции СтрДлина, СтрНайти, многострочные литералы, типичные ошибки и примеры кода.

В запросах пользователей и начинающих разработчиков часто встречается формулировка «текстрока в 1С». За ней скрывается базовый тип данных встроенного языка 1С — Строка, то есть текстовое значение. Именно строками представлены наименования товаров, адреса контрагентов, комментарии в документах, номера счетов и большинство реквизитов, которые пользователь вводит с клавиатуры.

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

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

Что такое тип «Строка» в 1С

Строка — примитивный тип данных встроенного языка 1С, предназначенный для хранения произвольного текста: символов, цифр, пробелов и знаков препинания. В коде строковый литерал записывается в двойных кавычках: Имя = "Иванов";. Если внутри текста нужна сама кавычка, она удваивается: "Корпус ""А""".

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

Длина строки и настройка реквизитов в конфигураторе

Когда разработчик добавляет строковый реквизит к объекту метаданных, он задаёт его длину в палитре свойств. Доступны два режима: фиксированная длина — значение дополняется пробелами справа до указанного размера, и переменная — хранится ровно столько символов, сколько введено. На практике почти всегда выбирают переменную длину.

Отдельный случай — неограниченная длина. Такой реквизит позволяет сохранить текст любого размера, но имеет ограничения: по нему нельзя строить индексы, использовать в некоторых сравнениях запроса и в критериях отбора. Поэтому неограниченную строку применяют только там, где это действительно нужно — для многострочных комментариев, описаний, хранения XML или JSON.

Если пользователь жалуется, что программа «обрезает» введённый текст, причина почти всегда в заданной длине реквизита. Увеличить её может только разработчик в конфигураторе с последующим обновлением конфигурации базы данных. Самостоятельно пользователю это ограничение не обойти — данные сверх лимита просто не сохранятся.

Основные операции над строками

Главная операция — конкатенация, то есть соединение строк оператором «+». Например: ПолноеИмя = Фамилия + " " + Имя;. Число сначала приводят к строке функцией Строка(Число) или форматируют через Формат().

Сравнение строк выполняется операторами «=» и «<>», при этом сравнение идёт посимвольно с учётом регистра. Строки "Аванс" и "аванс" для платформы различны. Для сравнения без учёта регистра обе строки приводят к одному регистру функциями ВРег() или НРег().

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

bsl
Наименование = СокрЛП(Наименование);
Если ВРег(Наименование) = ВРег("Услуга доставки") Тогда
  Сообщить("Найдено совпадение");
КонецЕсли;

Встроенные функции работы со строками

Платформа предоставляет набор функций для разбора и преобразования текста. Знание этих функций покрывает большинство практических задач: проверку заполненности, поиск подстроки, извлечение части текста, замену символов.

ФункцияНазначениеПример результата
СтрДлина(Строка)Количество символовСтрДлина("1С") → 2
Лев(Строка, N)Первые N символовЛев("Артикул", 3) → "Арт"
Прав(Строка, N)Последние N символовПрав("Артикул", 3) → "кул"
Сред(Строка, Нач, N)Подстрока с позицииСред("Артикул", 4, 3) → "ику"
СтрНайти(Строка, Подстрока)Позиция вхождения или 0СтрНайти("а-б", "-") → 2
СтрЗаменить(Строка, Что, НаЧто)Замена всех вхожденийзамена пробелов на "-"
СокрЛП(Строка)Удаление пробелов по краям" текст " → "текст"
ПустаяСтрока(Строка)Проверка на пустотуистина, если только пробелы
СтрЧислоСтрок(Строка)Число строк в многострочном текстепо количеству переводов строк

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

Многострочные строки и переносы

Длинный текст в коде записывают несколькими способами. Первый — продолжение литерала на следующей строке с помощью вертикальной черты: каждая новая строка литерала начинается с символа |. Второй — сложение частей через оператор «+» с явным добавлением символа переноса Символы.ПС (перевод строки) или Символы.ВК + Символы.ПС для Windows-формата.

Для обработки многострочного текста — например, загруженного из файла — применяют связку СтрЧислоСтрок() и СтрПолучитьСтроку(Текст, Номер). Это позволяет пройти по тексту построчно в цикле и разобрать каждую строку отдельно.

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

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

В языке запросов 1С строковые операции ограничены: доступны функция ПОДСТРОКА() и оператор ПОДОБНО для поиска по шаблону с символами «%» (любая последовательность) и «_» (один символ). Сложных преобразований текста в запросе делать не стоит — их выполняют уже после выборки, в коде.

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

На управляемой форме строковый реквизит может отображаться как однострочное поле ввода или как многострочное — это настраивается свойствами элемента формы «МногострочныйРежим» и «РастягиватьПоВертикали». Для комментариев и описаний многострочный режим включают, иначе пользователь увидит только часть текста.

Типичные ошибки
01
Сложение строки с числом без преобразования — ошибка «Преобразование значения к типу Строка не может быть выполнено» или неожиданный результат
02
Сравнение строк без СокрЛП и приведения регистра — «одинаковые» значения не совпадают из-за пробелов и регистра
03
Сравнение с пустой кавычкой вместо ПустаяСтрока() — строка из пробелов считается заполненной
04
Использование неограниченной строки там, где достаточно 150–250 символов, — потеря индексирования и проблемы в запросах
05
Хранение числовых кодов с ведущими нулями как числа — нули теряются безвозвратно

Проверка результата и практические рекомендации

Убедиться, что строковая обработка работает правильно, помогают простые проверки. Выведите промежуточные значения через Сообщить() или посмотрите их в отладчике конфигуратора, поставив точку останова. Обратите внимание на длину результата через СтрДлина() — неожиданные значения указывают на лишние пробелы или непечатаемые символы.

При обмене данными с внешними системами учитывайте кодировку: файлы в UTF-8 и ANSI читаются по-разному, и «битый» текст с непонятными символами — признак неверно выбранной кодировки при чтении через ЧтениеТекста. Кодировку лучше указывать явно, а не полагаться на значение по умолчанию.

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

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

Длина строки после обработки
Норма

Совпадает с ожидаемым числом символов

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

Длина больше ожидаемой — вероятны пробелы или невидимые символы

Сравнение двух значений
Норма

СокрЛП и приведение регистра дают совпадение

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

Значения не равны при визуально одинаковом тексте

Текст из файла
Норма

Символы читаются корректно, кириллица отображается

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

Кракозябры — неверная кодировка чтения

Итог

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

Строка — базовый текстовый тип 1С: складывается оператором «+», обрабатывается функциями СтрДлина, СтрНайти, СокрЛП и другими. Длина реквизита задаётся в конфигураторе; неограниченные строки не индексируются. Перед сравнением строки очищают от пробелов и приводят к одному регистру.

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

Чем строка отличается от числа в 1С и почему нельзя складывать их напрямую?

Это разные типы данных: над числами выполняются арифметические операции, над строками — текстовые. Оператор «+» требует одинаковых типов операндов. Чтобы присоединить число к строке, сначала преобразуйте его функцией Строка(Значение) или Формат(Значение, "ЧГ=0") — последняя уберёт разделители групп разрядов.

Почему поле в документе не даёт ввести больше символов?

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

Как проверить, что строковый реквизит не заполнен?

Используйте функцию ПустаяСтрока(Значение) — она вернёт Истина и для пустой строки, и для строки из одних пробелов. В запросах применяют сравнение с пустой строкой или проверку ПОДСТРОКА(Реквизит, 1, 1) = "".

Как найти подстроку внутри строки?

Функция СтрНайти(Строка, Подстрока) возвращает позицию первого вхождения, начиная с 1, или 0, если вхождения нет. Для поиска без учёта регистра предварительно приведите обе строки функцией ВРег(). В запросах вместо этого используется оператор ПОДОБНО с шаблоном "%текст%".

Что делать, если при чтении текстового файла появляются непонятные символы?

Это признак несовпадения кодировки. При создании объекта ЧтениеТекста укажите кодировку явно — например, КодировкаТекста.UTF8 или КодировкаТекста.ANSI. Если кодировка файла неизвестна, проверьте его в текстовом редакторе, который показывает кодировку, и повторите чтение с правильным параметром.

Когда стоит выбирать неограниченную длину строки?

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