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

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

Как проверить строку на количество символов в 1С

Как проверить количество символов в строке в 1С: функция СтрДлина, примеры кода, проверка пустых строк, типичные ошибки и ограничения при работе с текстом.

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

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

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

Простейшая проверка длины строки с помощью СтрДлина

Синтаксис функции предельно прост: СтрДлина(<Строка>). В качестве параметра можно передать строковый литерал, переменную, реквизит объекта или результат другого строкового выражения. Возвращаемое значение — целое число от нуля и выше.

Текст = "Привет, 1С!";

Длина = СтрДлина(Текст); // результат: 11

Если СтрДлина(Комментарий) > 100 Тогда

Сообщить("Комментарий слишком длинный, сократите до 100 символов");

КонецЕсли;

Функция работает и на тонком клиенте, и на веб-клиенте, и на сервере — это универсальный инструмент без ограничений по контексту исполнения. Никаких дополнительных объектов создавать не требуется, вызов выполняется мгновенно даже для длинных текстов.

Обратите внимание: при передаче значения нестрокового типа (число, дата) платформа выполнит неявное преобразование в строку, и длина будет посчитана для строкового представления. Например, СтрДлина(123) вернёт 3, а длина даты будет зависеть от формата её представления. Если тип входных данных не гарантирован, лучше явно привести значение через Строка(Значение) или проверить тип заранее.

Проверка на пустую строку: СтрДлина против ПустаяСтрока

Частая задача — убедиться, что строка не пустая. Здесь есть два подхода, и они не полностью эквивалентны. Конструкция СтрДлина(Текст) = 0 истинна только когда строка не содержит ни одного символа. А функция ПустаяСтрока(Текст) дополнительно считает пустой строку, состоящую из одних пробелов и незначащих символов.

Строка1 = "";

Строка2 = " ";

СтрДлина(Строка1) = 0; // Истина

СтрДлина(Строка2) = 0; // Ложь — пробелы тоже символы

ПустаяСтрока(Строка2); // Истина — пробелы игнорируются

Для проверки пользовательского ввода почти всегда правильнее использовать ПустаяСтрока(): пользователь мог случайно ввести пробелы, и формально непустая строка по сути не содержит данных. Если же нужна строгая проверка «хотя бы один видимый символ», комбинируйте: СтрДлина(СокрЛП(Текст)) > 0.

Валидация полей по минимальной и максимальной длине

Типовой сценарий — контроль реквизитов перед записью объекта: ИНН должен содержать 10 или 12 цифр, КПП — 9, номер телефона — не менее определённого количества знаков. Проверку обычно размещают в обработчике ОбработкаПроверкиЗаполнения в модуле объекта или в процедуре ПередЗаписью формы.

Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)

ДлинаИНН = СтрДлина(СокрЛП(ИНН));

Если ДлинаИНН <> 10 И ДлинаИНН <> 12 Тогда

ОбщегоНазначения.СообщитьПользователю(

"ИНН должен содержать 10 или 12 символов, введено: " + ДлинаИНН,

, "ИНН", , Отказ);

КонецЕсли;

КонецПроцедуры

Перед проверкой длины рекомендуется обрезать краевые пробелы через СокрЛП(), иначе пользователь сможет «добить» строку пробелами до нужной длины и обойти валидацию. Если поле должно содержать только цифры, длины недостаточно — дополнительно проверяйте состав символов, например перебором в цикле или регулярными выражениями через COM/VBScript на Windows-клиенте.

Для реквизитов с фиксированной длиной, заданной в метаданных (например, строка длиной 9 для КПП), платформа сама обрежет лишние символы при записи. Но молчаливая обрезка вводит пользователя в заблуждение: он ввёл 15 символов, а сохранилось 9. Явная проверка с понятным сообщением предпочтительнее.

Порядок действий при валидации поля
  1. 1
    Получите значение реквизита и обрежьте пробелы через СокрЛП()
  2. 2
    Вычислите длину функцией СтрДлина()
  3. 3
    Сравните длину с допустимым диапазоном (минимум и максимум)
  4. 4
    При нарушении выведите сообщение пользователю и установите Отказ = Истина
  5. 5
    После исправления повторно запишите объект и убедитесь, что данные сохранились корректно

Подсчёт длины многострочного текста и особенности переносов

Если строка содержит переносы строк, СтрДлина() посчитает и их. При этом перенос строки в 1С обычно представлен комбинацией символов CR+LF (возврат каретки и перевод строки), то есть один видимый перенос добавляет к длине 2 символа. При выгрузке текста во внешние системы это может давать расхождения с ожидаемой длиной.

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

Текст = "Первая строка

|Вторая строка";

ДлинаВСимволах = СтрДлина(Текст); // учтёт символы переноса

КоличествоСтрок = СтрЧислоСтрок(Текст); // результат: 2

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

Заполнение строки до нужной длины и обрезка

Обратная задача — привести строку к точной длине. Для дополнения пробелами или другими символами слева/справа в типовых конфигурациях есть функции общих модулей (например, СтроковыеФункцииКлиентСервер.ДополнитьСтроку() в БСП). В собственных разработках дополнение реализуют циклом с проверкой текущей длины через СтрДлина.

// Дополнение артикула нулями слева до 10 символов

Пока СтрДлина(Артикул) < 10 Цикл

Артикул = "0" + Артикул;

КонецЦикла;

Для обрезки слишком длинной строки используйте Лев(Текст, МаксимальнаяДлина). Перед обрезкой полезно проверить длину, чтобы не выполнять лишнюю операцию и, при необходимости, залогировать факт усечения данных — потерянные символы могут быть критичны, например в адресах или наименованиях.

Типичные ошибки
01
Проверка СтрДлина(Текст) = 0 вместо ПустаяСтрока() — строка из пробелов проходит проверку как непустая
02
Сравнение длины без СокрЛП() — пользователь обходит валидацию, добавляя пробелы в конец
03
Использование СтрДлина для контроля размера в байтах при файловом обмене — кириллица в UTF-8 занимает 2 байта на символ
04
Молчаливая обрезка через Лев() без предупреждения пользователя — данные теряются незаметно
05
Проверка длины числового значения без приведения к строке — результат зависит от неявного форматирования

Проверка длины в запросах и на форме

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

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

Маршрут решения

Как выбрать способ проверки

Нужно просто узнать число символов в строкеИспользуйте СтрДлина(Строка)
Нужно проверить, что пользователь ввёл хоть что-то осмысленноеИспользуйте ПустаяСтрока() или СтрДлина(СокрЛП(Текст)) > 0
Нужно ограничить ввод на форме без кодаЗадайте максимальную длину реквизита или свойство поля ввода
Нужно посчитать строки в многострочном текстеИспользуйте СтрЧислоСтрок(), а не СтрДлина()
Контролируется размер для файлового обмена в байтахИзмеряйте размер через потоки с учётом кодировки, а не СтрДлина

Как убедиться, что проверка работает правильно

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

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

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

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

Пустая строка и строка из пробелов
Норма

Обе корректно отклоняются проверкой заполнения

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

Строка из пробелов проходит как заполненная

Значение точно на границе допустимой длины
Норма

Принимается без сообщения об ошибке

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

Отклоняется из-за неточного условия сравнения

Значение на один символ длиннее лимита
Норма

Выводится понятное сообщение с фактической длиной

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

Данные молча обрезаются или ошибка не информативна

Текст с переносами строк
Норма

Длина соответствует ожиданиям с учётом CR+LF

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

Расхождение с длиной во внешней системе

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

Итог

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

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

Частые вопросы о проверке длины строки в 1С

Чем СтрДлина отличается от ПустаяСтрока?

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

Считает ли СтрДлина пробелы и переносы строк?

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

Как проверить, что строка содержит ровно 10 цифр, например ИНН?

Проверьте длину: СтрДлина(СокрЛП(ИНН)) = 10, а затем убедитесь, что все символы — цифры, перебрав строку в цикле и сравнивая каждый символ с диапазоном «0»–«9». Одной проверки длины недостаточно, так как строка может содержать буквы.

Можно ли ограничить длину ввода без программирования?

Да. У реквизита в конфигураторе задаётся длина строки, а у поля ввода на форме есть свойство максимальной длины. Платформа не позволит ввести больше символов, но при превышении длины реквизита данные могут обрезаться без предупреждения, поэтому для важных полей добавляйте явную проверку с сообщением.

Как узнать количество строк в многострочном тексте?

Используйте функцию СтрЧислоСтрок(Текст) — она возвращает число строк по разделителям. Для извлечения конкретной строки по номеру применяется СтрПолучитьСтроку(Текст, Номер). СтрДлина для этой задачи не подходит, так как считает символы, а не строки.

Почему длина строки не совпадает с размером при выгрузке в файл?

СтрДлина считает символы, а файл занимает байты. В кодировке UTF-8 кириллический символ занимает 2 байта, латинский — 1. Если внешняя система ограничивает размер в байтах, измеряйте данные через потоки с указанием кодировки, а не через СтрДлина.