Как получить длину строки в 1С и быстро заменить её первый символ?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

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

Часть 1. Как получить длину строки в 1С (Ответ на заголовок темы)

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

Давайте разберем синтаксис этой функции:

Результат = СтрДлина(Строка);

Функция принимает один параметр — анализируемую строку — и возвращает целое число. Однако при работе с ней важно учитывать несколько практических нюансов:

  1. Учет невидимых символов: Функция СтрДлина() считает абсолютно все символы, включая пробелы в начале и в конце строки, а также управляющие символы (переносы строк Символы.ПС, табуляцию Символы.Таб и т.д.).
  2. Очистка пробелов: Если вам нужно узнать длину «полезного» текста без учета случайных концевых пробелов, предварительно очистите строку с помощью функции СокрЛП().

Посмотрим на практический пример использования этой функции:


// Пример подсчета символов с очисткой пробелов
ИсходныйТекст = "  Привет, мир!   ";
ДлинаСПробелами = СтрДлина(ИсходныйТекст); // Вернет 17

ОчищенныйТекст = СокрЛП(ИсходныйТекст);
РеальнаяДлина = СтрДлина(ОчищенныйТекст); // Вернет 12

Сообщить("Длина без пробелов: " + РеальнаяДлина);

Часть 2. Как правильно заменить первый символ строки в 1С

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

В сообщении 5 предложен самый лаконичный и производительный вариант решения этой задачи для классической платформы «1С:Предприятие»:

Нов = НовСимвол + Сред(Стр, 2);

Давайте подробно проанализируем, как работает эта конструкция и почему она является оптимальной:

  1. Индексация в 1С: В отличие от большинства языков программирования, в платформе «1С:Предприятие» индексация символов в строке начинается с 1, а не со значения 0. Это значит, что второй символ строки находится именно на позиции 2.
  2. Особенности функции Сред(): Функция Сред(Строка, НачальнаяПозиция, [КоличествоСимволов]) предназначена для выделения подстроки. Если мы опускаем третий параметр (количество символов), функция автоматически возвращает всю оставшуюся часть строки, начиная со стартовой позиции и до самого конца. Таким образом, конструкция Сред(Стр, 2) идеально отсекает первый символ, оставляя остальную часть текста нетронутой.
  3. Простое сложение: Мы просто конкатенируем (складываем) наш новый символ и полученный хвост строки.

Однако при написании боевого кода всегда нужно закладывать обработку исключительных ситуаций. Что произойдет, если исходная строка окажется пустой или будет состоять всего из одного символа? Выясним это.

Давайте посмотрим на пример безопасного и надежного кода с проверкой заполнения:


// Безопасный алгоритм замены первого символа
ИсходнаяСтрока = Объект.ПолеВводаСтроки; // Получаем значение из реквизита формы
НовыйСимвол = "Z";

Если ЗначениеЗаполнено(ИсходнаяСтрока) Тогда
    // Заменяем первый символ и перезаписываем переменную
    ИсходнаяСтрока = НовыйСимвол + Сред(ИсходнаяСтрока, 2);
Иначе
    Предупреждение("Поле ввода пустое, замена невозможна!");
КонецЕсли;

Часть 3. Альтернативный способ через функцию Прав()

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

Нов = НовСимвол + Прав(Стр, СтрДлина(Стр) - 1);

Давайте разберем по шагам, почему этот вариант гораздо хуже и его не рекомендуется использовать на практике:

  1. Избыточность вычислений: Платформе приходится выполнять дополнительную операцию — вычисление длины строки с помощью СтрДлина(), что снижает общую производительность кода при обработке больших массивов данных.
  2. Опасность падения в ошибку: Если переменная Стр окажется пустой, то СтрДлина(Стр) вернет 0. Выражение СтрДлина(Стр) - 1 превратится в -1. Передача отрицательного числа во второй параметр функции Прав() приведет к ошибке выполнения кода на сервере или клиенте. Чтобы этого избежать, придется писать громоздкие условия.

Таким образом, использование связки с функцией Сред() без указания длины является стандартом разработки в 1С.

Часть 4. Как эта задача решается в современном «1С:Предприятие.Элемент»

Технологии 1С не стоят на месте, и в новой объектно-ориентированной технологии разработки «1С:Предприятие.Элемент» работа с текстовыми данными кардинально изменилась. Давайте посмотрим на ключевые отличия:

  1. Объектный подход: Строковые переменные теперь являются полноценными объектами, которые имеют собственные методы встроенного языка. Больше нет необходимости вызывать глобальные функции.
  2. Нулевой индекс: В «1С:Предприятие.Элемент» индексация символов, как и в большинстве современных языков программирования, начинается с 0. Первый символ строки теперь имеет индекс 0, второй — индекс 1. К символам строки можно обращаться напрямую через квадратные скобки: Символ = МояСтрока[0];.
  3. Метод Подстрока(): Вместо глобальной функции Сред() у строкового объекта появился метод .Подстрока().

С учетом этих нововведений, код замены первого символа в среде «1С:Предприятие.Элемент» выглядит невероятно просто, элегантно и современно:


// Код для новой платформы 1С:Предприятие.Элемент
пер ИсходнаяСтрока = "A12345"
пер НовСимвол = "B"

// Метод Подстрока(1) возвращает всё, начиная с индекса 1 (второй символ)
пер Результат = НовСимвол + ИсходнаяСтрока.Подстрока(1)

// Результат примет значение "B12345"

Резюме

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

← На главную