Разработка и Конфигурация · 11 мин
Как проверить количество символов в 1С
Как проверить количество символов в 1С: функция СтрДлина, учёт пробелов и переносов строк, проверка длины в запросах, формах и типовые ошибки разработчиков.
Задача узнать количество символов в строке возникает в 1С постоянно: при проверке заполнения реквизитов, валидации ИНН и телефонов, обрезке длинных наименований перед записью в базу, контроле ограничений при обмене данными. Во встроенном языке для этого есть штатная функция, но у неё есть нюансы, которые важно понимать, чтобы не получить неожиданный результат.
Основной инструмент — функция СтрДлина() (в английском синтаксисе — StrLen()). Она принимает строку и возвращает число — количество символов в ней. Функция доступна везде: на сервере, на клиенте, в тонком и веб-клиенте, во внешних обработках. Дополнительные способы проверки длины существуют в языке запросов и в средствах отладки.
Ниже разобраны синтаксис функции, особенности подсчёта пробелов и переносов строк, проверка длины в запросах и формах, а также типичные ошибки, из-за которых подсчёт даёт не тот результат, который ожидал разработчик.
Функция СтрДлина: синтаксис и базовые примеры
Функция вызывается с одним параметром — строкой, длину которой нужно определить. Результат — число типа «Число». Если передать пустую строку, вернётся 0.
Наименование = "ООО Ромашка";
Длина = СтрДлина(Наименование); // 12
Пустая = "";
ДлинаПустой = СтрДлина(Пустая); // 0
Типичный сценарий — проверка реквизита перед записью объекта. Например, ИНН юридического лица должен содержать 10 цифр, а ИНН физического лица — 12. Проверка через СтрДлина() позволяет отсечь заведомо некорректные значения до обращения к базе:
Если СтрДлина(СокрЛП(ИНН)) <> 10 И СтрДлина(СокрЛП(ИНН)) <> 12 Тогда
Сообщить("ИНН должен содержать 10 или 12 символов");
Возврат;
КонецЕсли;
Обратите внимание на СокрЛП() в примере: перед подсчётом длины почти всегда стоит убрать начальные и конечные пробелы, иначе случайный пробел в конце строки увеличит счётчик и сломает проверку.
Длина = СтрДлина(СокрЛП(СтрокаДляПроверки));Что именно считает СтрДлина: пробелы, переносы, спецсимволы
Функция считает каждый символ строки, включая непечатаемые. Пробел внутри и по краям строки — это символ. Табуляция — символ. Перенос строки — тоже символ, причём в зависимости от того, как строка сформирована, перенос может занимать один символ (Символы.ПС) или два (комбинация возврата каретки и перевода строки, Символы.ВК + Символы.ПС).
Из-за этого многострочный текст, скопированный из разных источников, может давать разную длину при визуально одинаковом содержимом. Если текст пришёл из файла или веб-сервиса, перед сравнением длин имеет смысл нормализовать переносы строк:
Текст = СтрЗаменить(Текст, Символы.ВК + Символы.ПС, Символы.ПС);
Текст = СтрЗаменить(Текст, Символы.ВК, Символы.ПС);
Длина = СтрДлина(Текст);
Ещё один нюанс — неразрывные пробелы (символ с кодом 160), которые часто попадают в строки при копировании из браузера или Word. Функция СокрЛП() их не удаляет, а СтрДлина() их учитывает. Если проверка «не срабатывает» на вроде бы чистой строке, проверьте наличие таких символов через КодСимвола().
Проверка длины строки в запросах
В языке запросов 1С есть своя функция — ДЛИНАСТРОКИ() (английский синтаксис — STRINGLENGTH). Она применяется к строковым полям и возвращает число. Это удобно, когда нужно отобрать записи, где реквизит заполнен слишком коротко или подозрительно длинно, не выгружая данные в код.
ВЫБРАТЬ
Контрагенты.Ссылка,
Контрагенты.ИНН
ИЗ
Справочник.Контрагенты КАК Контрагенты
ГДЕ
ДЛИНАСТРОКИ(Контрагенты.ИНН) <> 10
И ДЛИНАСТРОКИ(Контрагенты.ИНН) <> 12
Такой запрос быстро находит контрагентов с некорректной длиной ИНН — это стандартный приём при чистке данных перед отчётностью или миграцией. Аналогично проверяют КПП (9 символов), ОГРН (13 или 15), номера телефонов в нормализованном формате.
Важное ограничение: ДЛИНАСТРОКИ() не применяется к полям неограниченной длины в некоторых контекстах и не работает с полями типа «ХранилищеЗначения». Для строк неограниченной длины функция обычно доступна, но при сложных типах поля проверяйте поведение на тестовой копии базы.
Проверка длины при вводе: формы и реквизиты
Часто длину нужно контролировать не в коде, а прямо при вводе пользователем. Первый уровень защиты — сама конфигурация: у строкового реквизита в метаданных задаётся длина (фиксированная или переменная). Если пользователь введёт строку длиннее допустимой, платформа при записи отсечёт лишнее или выдаст ошибку — в зависимости от настроек. Полагаться только на это не стоит: тихое усечение строки портит данные без предупреждения.
Для явного контроля используйте обработчики формы. В управляемой форме удобно проверять длину в обработчике ПриИзменении поля ввода или перед записью:
&НаКлиенте
Процедура КомментарийПриИзменении(Элемент)
Если СтрДлина(Объект.Комментарий) > 500 Тогда
ПоказатьПредупреждение(, "Комментарий не должен превышать 500 символов");
КонецЕсли;
КонецПроцедуры
Если нужно показать пользователю счётчик символов «вживую», вычисляйте СтрДлина() в том же обработчике и выводите результат в декорацию формы. Учитывайте, что обработчик срабатывает при завершении изменения, а не на каждое нажатие клавиши, — для мгновенного счётчика потребуется обработчик ИзменениеТекстаРедактирования.
- 1Определите, где нужна проверка: в коде, в запросе или в форме
- 2Для кода используйте СтрДлина(), предварительно применив СокрЛП()
- 3Для запроса примените ДЛИНАСТРОКИ() в условии ГДЕ
- 4Для формы добавьте проверку в обработчик ПриИзменении или ПередЗаписью
- 5Проверьте результат на строках с пробелами, переносами и спецсимволами
Как быстро проверить длину строки при отладке
Во время разработки длину строки проще всего посмотреть в конфигураторе через отладку. Поставьте точку останова после формирования строки, запустите отладку и в окне «Вычислить выражение» (Ctrl+F9 или через меню) введите СтрДлина(ИмяПеременной). Результат появится сразу, без изменения кода и перезапуска.
Там же удобно проверить посимвольный состав строки: выражение КодСимвола(Строка, 1) покажет код первого символа, что помогает обнаружить неразрывные пробелы и невидимые управляющие символы. Для просмотра всей строки с явными служебными символами используйте табло (Shift+F9) — длинные строки в нём видны целиком.
Если конфигуратор недоступен, а проверить нужно в работающей базе, используйте внешнюю обработку «Консоль кода» или аналогичный инструмент, если он есть в вашей конфигурации. В типовых решениях на БСП часто доступны встроенные средства разработчика, позволяющие выполнить произвольный код.
Как проверить результат
СтрДлина возвращает 0
Возвращает больше 0 — в строке есть невидимые символы
Длина совпадает с ожидаемой
Длина больше — внутри есть неразрывные пробелы или табуляции
Длина предсказуема после нормализации переносов
Длина «плавает» между одинаковыми текстами — разные комбинации ВК+ПС
Частые ошибки при подсчёте символов
Самая распространённая ошибка — подсчёт длины без предварительной обрезки пробелов. Строка « 12345 » имеет длину 7, а не 5, и проверка на равенство пяти символам не пройдёт. Всегда применяйте СокрЛП(), если пробелы по краям не несут смысла.
Вторая ошибка — использование СтрДлина() для проверки, заполнена ли строка. Сравнение СтрДлина(Строка) = 0 работает, но штатное средство для этой задачи — функция ПустаяСтрока(): она считает пустой и строку, состоящую только из пробелов и переносов, что обычно и требуется. Кроме того, она читается лучше и работает быстрее на смысловом уровне.
Третья группа ошибок — смешение контекстов: попытка использовать ДЛИНАСТРОКИ() в коде модуля или СтрДлина() в тексте запроса. Платформа выдаст синтаксическую ошибку, но начинающие разработчики тратят время на поиск причины. Запомните простое правило: запрос — свой язык, код — свой.
Альтернативные и вспомогательные приёмы
Если нужно не просто узнать длину, а ограничить строку, используйте Лев(Строка, N) — функция вернёт первые N символов. Перед обрезкой полезно проверить СтрДлина(), чтобы не обрезать короткие строки без нужды или, наоборот, зафиксировать факт усечения в журнале.
Для подсчёта количества строк в многострочном тексте (а не символов) применяется СтрЧислоСтрок(), для числа вхождений подстроки — комбинация СтрНайти() в цикле или подсчёт через СтрРазделить() и размер массива. Эти задачи часто путают с подсчётом символов, но решаются они другими функциями.
При обмене данными с внешними системами учитывайте, что длина строки в символах и её размер в байтах при кодировке UTF-8 — разные величины: кириллические символы занимают по два байта. Если внешняя система ограничивает размер поля в байтах, проверки через СтрДлина() недостаточно — нужен пересчёт через ПолучитьДвоичныеДанныеИзСтроки() и размер результата.
При валидации ИНН, КПП и подобных кодов проверяйте не только длину, но и то, что строка состоит только из цифр. Длина 10 у строки с буквой «О» вместо нуля пройдёт проверку, но данные будут испорчены.
Сравнение способов проверки
Код встроенного языка, любые строки. Требует предварительной очистки от лишних пробелов
Только в запросах. Подходит для массовой проверки данных в базе без выборки в код
Проверка заполненности, а не длины. Считает пустой строку из пробелов
Защита на уровне структуры данных, но может молча усечь строку без предупреждения
Частые вопросы
Чем отличается СтрДлина от ПустаяСтрока?
СтрДлина возвращает точное число символов, включая пробелы. ПустаяСтрока отвечает на вопрос «есть ли в строке значимое содержимое» и считает пустой строку, состоящую только из пробелов, табуляций и переносов. Для проверки заполненности реквизита используйте ПустаяСтроку, для контроля формата — СтрДлину.
Почему СтрДлина показывает больше символов, чем видно в строке?
Чаще всего в строке есть невидимые символы: неразрывные пробелы (код 160) из скопированного текста, табуляции или переносы строк. Проверьте коды символов через КодСимвола() в отладчике и очистите строку функциями СокрЛП() и СтрЗаменить().
Можно ли посчитать длину строки в запросе без выгрузки в код?
Да, для этого есть функция языка запросов ДЛИНАСТРОКИ(). Она работает в секциях ВЫБРАТЬ и ГДЕ и позволяет, например, отобрать все записи, где длина ИНН не равна 10 или 12 символам.
Как ограничить ввод слишком длинной строки пользователем?
Базовый уровень — длина реквизита в метаданных, но платформа может молча усечь лишнее. Для явного контроля добавьте проверку СтрДлина() в обработчик ПриИзменении или ПередЗаписью формы и покажите пользователю предупреждение с указанием лимита.
Одинаково ли считается длина на клиенте и на сервере?
Да, СтрДлина работает одинаково в любом контексте исполнения. Различия возможны только из-за самих данных: например, если строка формируется по-разному на клиенте и сервере или приходит из внешнего источника с другими переносами строк.
Как проверить, что строка состоит только из цифр нужной длины?
Сначала проверьте длину через СтрДлина(СокрЛП(Строка)), затем пройдите по символам в цикле и убедитесь, что каждый код символа лежит в диапазоне цифр, либо используйте штатные функции проверки из БСП, если она есть в конфигурации.
Что важно запомнить
Длина строки в коде — СтрДлина(), в запросе — ДЛИНАСТРОКИ(). Перед подсчётом очищайте строку от лишних пробелов и нормализуйте переносы. Для проверки заполненности используйте ПустаяСтроку(), а длину реквизитов дополнительно контролируйте на уровне метаданных и форм.