Разработка и Конфигурация · 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Получите значение реквизита и обрежьте пробелы через СокрЛП()
- 2Вычислите длину функцией СтрДлина()
- 3Сравните длину с допустимым диапазоном (минимум и максимум)
- 4При нарушении выведите сообщение пользователю и установите Отказ = Истина
- 5После исправления повторно запишите объект и убедитесь, что данные сохранились корректно
Подсчёт длины многострочного текста и особенности переносов
Если строка содержит переносы строк, СтрДлина() посчитает и их. При этом перенос строки в 1С обычно представлен комбинацией символов CR+LF (возврат каретки и перевод строки), то есть один видимый перенос добавляет к длине 2 символа. При выгрузке текста во внешние системы это может давать расхождения с ожидаемой длиной.
Если нужно узнать количество строк в многострочном тексте, а не общее число символов, используйте СтрЧислоСтрок(Текст). А для получения конкретной строки по номеру — СтрПолучитьСтроку(Текст, НомерСтроки). Эти функции не заменяют СтрДлина, а решают смежную задачу.
Текст = "Первая строка
|Вторая строка";
ДлинаВСимволах = СтрДлина(Текст); // учтёт символы переноса
КоличествоСтрок = СтрЧислоСтрок(Текст); // результат: 2
При сравнении длины текста с ограничением внешней системы (например, поле в формате обмена) проверяйте, как именно принимающая сторона считает переносы. Иногда надёжнее предварительно заменить переносы на пробелы: СтрЗаменить(Текст, Символы.ПС, " "), а затем уже измерять длину.
Заполнение строки до нужной длины и обрезка
Обратная задача — привести строку к точной длине. Для дополнения пробелами или другими символами слева/справа в типовых конфигурациях есть функции общих модулей (например, СтроковыеФункцииКлиентСервер.ДополнитьСтроку() в БСП). В собственных разработках дополнение реализуют циклом с проверкой текущей длины через СтрДлина.
// Дополнение артикула нулями слева до 10 символов
Пока СтрДлина(Артикул) < 10 Цикл
Артикул = "0" + Артикул;
КонецЦикла;
Для обрезки слишком длинной строки используйте Лев(Текст, МаксимальнаяДлина). Перед обрезкой полезно проверить длину, чтобы не выполнять лишнюю операцию и, при необходимости, залогировать факт усечения данных — потерянные символы могут быть критичны, например в адресах или наименованиях.
Проверка длины в запросах и на форме
В языке запросов 1С доступна функция ДЛИНАСТРОКИ(<Поле>, <Длина>), но она работает иначе: это не измерение длины, а приведение значения к строке заданной длины (с обрезкой или дополнением пробелами). Непосредственно отфильтровать записи по количеству символов в запросе штатными средствами нельзя — обычно выбирают данные и проверяют длину уже в коде при обходе выборки.
На управляемой форме длину введённого текста можно контролировать интерактивно: в обработчике ПриИзменении поля ввода вычисляйте СтрДлина() и выводите подсказку, например «осталось N символов». Для жёсткого ограничения проще установить свойство «Максимальная длина» у поля ввода или ограничить длину реквизита в метаданных — тогда платформа сама не даст ввести лишнее.
Как выбрать способ проверки
Как убедиться, что проверка работает правильно
После внедрения проверки протестируйте её на граничных значениях: пустая строка, строка из пробелов, значение ровно на минимальной и максимальной границе, значение на один символ больше и меньше. Именно на границах чаще всего обнаруживаются ошибки в условиях вида > вместо >=.
Проверьте поведение с многострочным текстом и с символами, вставленными через буфер обмена из внешних программ: там могут оказаться неразрывные пробелы и служебные символы, которые увеличивают длину незаметно для пользователя. При необходимости очищайте строку перед проверкой, заменяя такие символы на обычные пробелы.
Как проверить результат
Обе корректно отклоняются проверкой заполнения
Строка из пробелов проходит как заполненная
Принимается без сообщения об ошибке
Отклоняется из-за неточного условия сравнения
Выводится понятное сообщение с фактической длиной
Данные молча обрезаются или ошибка не информативна
Длина соответствует ожиданиям с учётом CR+LF
Расхождение с длиной во внешней системе
Для отладки удобно временно выводить фактическую длину в сообщениях: Сообщить("Длина: " + СтрДлина(Текст)). Это помогает быстро понять, какие именно символы учитываются, и локализовать расхождения между ожидаемым и реальным значением.
Что важно запомнить
СтрДлина() возвращает число символов с учётом пробелов и переносов. Для проверки пустоты надёжнее ПустаяСтрока(), перед валидацией обрезайте пробелы через СокрЛП(), а для ограничений в байтах и подсчёта строк используйте другие механизмы.
Частые вопросы о проверке длины строки в 1С
Чем СтрДлина отличается от ПустаяСтрока?
СтрДлина возвращает точное число символов, включая пробелы, поэтому строка из одних пробелов имеет ненулевую длину. ПустаяСтрока возвращает Истина и для строки из незначащих символов. Для проверки пользовательского ввода чаще подходит ПустаяСтрока, для точного измерения — СтрДлина.
Считает ли СтрДлина пробелы и переносы строк?
Да, все символы учитываются: пробелы, табуляции, переносы строк. Перенос строки обычно состоит из двух символов (CR и LF) и добавляет 2 к длине. Если пробелы по краям не нужны, предварительно примените СокрЛП().
Как проверить, что строка содержит ровно 10 цифр, например ИНН?
Проверьте длину: СтрДлина(СокрЛП(ИНН)) = 10, а затем убедитесь, что все символы — цифры, перебрав строку в цикле и сравнивая каждый символ с диапазоном «0»–«9». Одной проверки длины недостаточно, так как строка может содержать буквы.
Можно ли ограничить длину ввода без программирования?
Да. У реквизита в конфигураторе задаётся длина строки, а у поля ввода на форме есть свойство максимальной длины. Платформа не позволит ввести больше символов, но при превышении длины реквизита данные могут обрезаться без предупреждения, поэтому для важных полей добавляйте явную проверку с сообщением.
Как узнать количество строк в многострочном тексте?
Используйте функцию СтрЧислоСтрок(Текст) — она возвращает число строк по разделителям. Для извлечения конкретной строки по номеру применяется СтрПолучитьСтроку(Текст, Номер). СтрДлина для этой задачи не подходит, так как считает символы, а не строки.
Почему длина строки не совпадает с размером при выгрузке в файл?
СтрДлина считает символы, а файл занимает байты. В кодировке UTF-8 кириллический символ занимает 2 байта, латинский — 1. Если внешняя система ограничивает размер в байтах, измеряйте данные через потоки с указанием кодировки, а не через СтрДлина.