Разработка и Конфигурация · 11 мин
Что такое строка (текст) в 1С и как с ней работать
Что такое строка (текст) в 1С: тип данных «Строка», операции, функции СтрДлина, СтрНайти, многострочные литералы, типичные ошибки и примеры кода.
В запросах пользователей и начинающих разработчиков часто встречается формулировка «текстрока в 1С». За ней скрывается базовый тип данных встроенного языка 1С — Строка, то есть текстовое значение. Именно строками представлены наименования товаров, адреса контрагентов, комментарии в документах, номера счетов и большинство реквизитов, которые пользователь вводит с клавиатуры.
Понимание того, как устроен этот тип, важно и для разработчика, и для пользователя, который сталкивается с ограничениями вроде «поле не даёт ввести больше символов». В конфигураторе у каждого строкового реквизита задана длина — фиксированная или переменная, ограниченная или неограниченная. От этого зависит, сколько текста можно сохранить и как база будет хранить данные.
Ниже разберём, что представляет собой тип «Строка», какие операции и функции доступны во встроенном языке, как работать с многострочным текстом и каких ошибок стоит избегать при сравнении и обработке строк.
Что такое тип «Строка» в 1С
Строка — примитивный тип данных встроенного языка 1С, предназначенный для хранения произвольного текста: символов, цифр, пробелов и знаков препинания. В коде строковый литерал записывается в двойных кавычках: Имя = "Иванов";. Если внутри текста нужна сама кавычка, она удваивается: "Корпус ""А""".
Строки встречаются везде: в реквизитах справочников и документов, в параметрах запросов, в сообщениях пользователю, в именах файлов при обмене данными. Даже числовые на первый взгляд данные — номер телефона, ИНН, артикул — правильно хранить именно как строки, потому что над ними не выполняются арифметические действия, а ведущие нули в числе теряются.
Длина строки и настройка реквизитов в конфигураторе
Когда разработчик добавляет строковый реквизит к объекту метаданных, он задаёт его длину в палитре свойств. Доступны два режима: фиксированная длина — значение дополняется пробелами справа до указанного размера, и переменная — хранится ровно столько символов, сколько введено. На практике почти всегда выбирают переменную длину.
Отдельный случай — неограниченная длина. Такой реквизит позволяет сохранить текст любого размера, но имеет ограничения: по нему нельзя строить индексы, использовать в некоторых сравнениях запроса и в критериях отбора. Поэтому неограниченную строку применяют только там, где это действительно нужно — для многострочных комментариев, описаний, хранения XML или JSON.
Если пользователь жалуется, что программа «обрезает» введённый текст, причина почти всегда в заданной длине реквизита. Увеличить её может только разработчик в конфигураторе с последующим обновлением конфигурации базы данных. Самостоятельно пользователю это ограничение не обойти — данные сверх лимита просто не сохранятся.
Основные операции над строками
Главная операция — конкатенация, то есть соединение строк оператором «+». Например: ПолноеИмя = Фамилия + " " + Имя;. Число сначала приводят к строке функцией Строка(Число) или форматируют через Формат().
Сравнение строк выполняется операторами «=» и «<>», при этом сравнение идёт посимвольно с учётом регистра. Строки "Аванс" и "аванс" для платформы различны. Для сравнения без учёта регистра обе строки приводят к одному регистру функциями ВРег() или НРег().
Отдельная ловушка — пробелы. Пользовательский ввод часто содержит лишние пробелы в начале и конце, поэтому перед сравнением или поиском строку обрабатывают функцией СокрЛП(), удаляющей незначащие символы с обеих сторон.
Наименование = СокрЛП(Наименование);
Если ВРег(Наименование) = ВРег("Услуга доставки") Тогда
Сообщить("Найдено совпадение");
КонецЕсли;Встроенные функции работы со строками
Платформа предоставляет набор функций для разбора и преобразования текста. Знание этих функций покрывает большинство практических задач: проверку заполненности, поиск подстроки, извлечение части текста, замену символов.
| Функция | Назначение | Пример результата |
|---|---|---|
СтрДлина(Строка) | Количество символов | СтрДлина("1С") → 2 |
Лев(Строка, N) | Первые N символов | Лев("Артикул", 3) → "Арт" |
Прав(Строка, N) | Последние N символов | Прав("Артикул", 3) → "кул" |
Сред(Строка, Нач, N) | Подстрока с позиции | Сред("Артикул", 4, 3) → "ику" |
СтрНайти(Строка, Подстрока) | Позиция вхождения или 0 | СтрНайти("а-б", "-") → 2 |
СтрЗаменить(Строка, Что, НаЧто) | Замена всех вхождений | замена пробелов на "-" |
СокрЛП(Строка) | Удаление пробелов по краям | " текст " → "текст" |
ПустаяСтрока(Строка) | Проверка на пустоту | истина, если только пробелы |
СтрЧислоСтрок(Строка) | Число строк в многострочном тексте | по количеству переводов строк |
Для проверки заполненности реквизита используйте ПустаяСтрока(), а не сравнение с пустой кавычкой: функция считает пустой и строку, состоящую только из пробелов и непечатаемых символов, что точнее отражает пользовательский ввод.
Многострочные строки и переносы
Длинный текст в коде записывают несколькими способами. Первый — продолжение литерала на следующей строке с помощью вертикальной черты: каждая новая строка литерала начинается с символа |. Второй — сложение частей через оператор «+» с явным добавлением символа переноса Символы.ПС (перевод строки) или Символы.ВК + Символы.ПС для Windows-формата.
Для обработки многострочного текста — например, загруженного из файла — применяют связку СтрЧислоСтрок() и СтрПолучитьСтроку(Текст, Номер). Это позволяет пройти по тексту построчно в цикле и разобрать каждую строку отдельно.
- 1Поместите многострочный текст в переменную или получите его из файла
- 2Определите число строк функцией СтрЧислоСтрок(Текст)
- 3Организуйте цикл от 1 до числа строк
- 4Получайте каждую строку через СтрПолучитьСтроку(Текст, НомерСтроки)
- 5Обработайте строку: СокрЛП, проверка ПустаяСтрока, разбор через СтрНайти
Строки в запросах и на форме
В языке запросов 1С строковые операции ограничены: доступны функция ПОДСТРОКА() и оператор ПОДОБНО для поиска по шаблону с символами «%» (любая последовательность) и «_» (один символ). Сложных преобразований текста в запросе делать не стоит — их выполняют уже после выборки, в коде.
Нюанс с реквизитами неограниченной длины: в запросе их нельзя сравнивать напрямую и использовать в группировках. Если такое сравнение необходимо, применяют конструкцию ВЫРАЗИТЬ(Реквизит КАК СТРОКА(200)), приводящую значение к строке фиксированной длины — за счёт возможного усечения текста.
На управляемой форме строковый реквизит может отображаться как однострочное поле ввода или как многострочное — это настраивается свойствами элемента формы «МногострочныйРежим» и «РастягиватьПоВертикали». Для комментариев и описаний многострочный режим включают, иначе пользователь увидит только часть текста.
Проверка результата и практические рекомендации
Убедиться, что строковая обработка работает правильно, помогают простые проверки. Выведите промежуточные значения через Сообщить() или посмотрите их в отладчике конфигуратора, поставив точку останова. Обратите внимание на длину результата через СтрДлина() — неожиданные значения указывают на лишние пробелы или непечатаемые символы.
При обмене данными с внешними системами учитывайте кодировку: файлы в UTF-8 и ANSI читаются по-разному, и «битый» текст с непонятными символами — признак неверно выбранной кодировки при чтении через ЧтениеТекста. Кодировку лучше указывать явно, а не полагаться на значение по умолчанию.
Как проверить результат
Совпадает с ожидаемым числом символов
Длина больше ожидаемой — вероятны пробелы или невидимые символы
СокрЛП и приведение регистра дают совпадение
Значения не равны при визуально одинаковом тексте
Символы читаются корректно, кириллица отображается
Кракозябры — неверная кодировка чтения
Что важно запомнить
Строка — базовый текстовый тип 1С: складывается оператором «+», обрабатывается функциями СтрДлина, СтрНайти, СокрЛП и другими. Длина реквизита задаётся в конфигураторе; неограниченные строки не индексируются. Перед сравнением строки очищают от пробелов и приводят к одному регистру.
Частые вопросы
Чем строка отличается от числа в 1С и почему нельзя складывать их напрямую?
Это разные типы данных: над числами выполняются арифметические операции, над строками — текстовые. Оператор «+» требует одинаковых типов операндов. Чтобы присоединить число к строке, сначала преобразуйте его функцией Строка(Значение) или Формат(Значение, "ЧГ=0") — последняя уберёт разделители групп разрядов.
Почему поле в документе не даёт ввести больше символов?
У реквизита в конфигураторе задана ограниченная длина, и платформа обрезает ввод по этому пределу. Изменить ограничение может только разработчик: он увеличивает длину в свойствах реквизита и обновляет конфигурацию базы данных. Если реквизит типовой, доработку делают через расширение, чтобы не снимать конфигурацию с поддержки.
Как проверить, что строковый реквизит не заполнен?
Используйте функцию ПустаяСтрока(Значение) — она вернёт Истина и для пустой строки, и для строки из одних пробелов. В запросах применяют сравнение с пустой строкой или проверку ПОДСТРОКА(Реквизит, 1, 1) = "".
Как найти подстроку внутри строки?
Функция СтрНайти(Строка, Подстрока) возвращает позицию первого вхождения, начиная с 1, или 0, если вхождения нет. Для поиска без учёта регистра предварительно приведите обе строки функцией ВРег(). В запросах вместо этого используется оператор ПОДОБНО с шаблоном "%текст%".
Что делать, если при чтении текстового файла появляются непонятные символы?
Это признак несовпадения кодировки. При создании объекта ЧтениеТекста укажите кодировку явно — например, КодировкаТекста.UTF8 или КодировкаТекста.ANSI. Если кодировка файла неизвестна, проверьте его в текстовом редакторе, который показывает кодировку, и повторите чтение с правильным параметром.
Когда стоит выбирать неограниченную длину строки?
Только когда объём текста заранее непредсказуем: многострочные комментарии, описания, хранимые XML или JSON. Для наименований, номеров, адресов лучше задать разумный предел — такие поля индексируются, корректно работают в отборах и сравнениях запросов и занимают меньше места.