При работе с текстовыми данными в платформе «1С:Предприятие» разработчики регулярно сталкиваются с задачами манипуляции строками. Две наиболее частые операции — это определение общего количества символов в строке и замена конкретного символа (например, первого) на другой. Примечательно, что на технических форумах эти две темы часто пересекаются, хотя заголовок обсуждения не всегда точно отражает суть вопроса.
В этой статье мы подробно и по шагам разберем обе задачи. Мы выясним, как правильно измерять длину строки, рассмотрим наиболее эффективные и безопасные способы замены первого символа в классической платформе 1С, изучим альтернативные варианты и заглянем в будущее — узнаем, как эти механизмы реализованы в современной технологии «1С:Предприятие.Элемент».
Начнем с базового вопроса, который был вынесен в заголовок обсуждения, но остался без внимания участников форума. Для получения количества символов в строке в платформе «1С:Предприятие» предусмотрена стандартная функция глобального контекста СтрДлина().
Давайте разберем синтаксис этой функции:
Результат = СтрДлина(Строка);
Функция принимает один параметр — анализируемую строку — и возвращает целое число. Однако при работе с ней важно учитывать несколько практических нюансов:
СтрДлина() считает абсолютно все символы, включая пробелы в начале и в конце строки, а также управляющие символы (переносы строк Символы.ПС, табуляцию Символы.Таб и т.д.).СокрЛП().Посмотрим на практический пример использования этой функции:
// Пример подсчета символов с очисткой пробелов
ИсходныйТекст = " Привет, мир! ";
ДлинаСПробелами = СтрДлина(ИсходныйТекст); // Вернет 17
ОчищенныйТекст = СокрЛП(ИсходныйТекст);
РеальнаяДлина = СтрДлина(ОчищенныйТекст); // Вернет 12
Сообщить("Длина без пробелов: " + РеальнаяДлина);
Теперь перейдем к основной проблеме, которую озвучил автор темы в сообщении 0: на форме есть поле ввода со строковым значением, и при определенном действии нужно удалить самый первый символ и вставить вместо него свой.
В сообщении 5 предложен самый лаконичный и производительный вариант решения этой задачи для классической платформы «1С:Предприятие»:
Нов = НовСимвол + Сред(Стр, 2);
Давайте подробно проанализируем, как работает эта конструкция и почему она является оптимальной:
Сред(Строка, НачальнаяПозиция, [КоличествоСимволов]) предназначена для выделения подстроки. Если мы опускаем третий параметр (количество символов), функция автоматически возвращает всю оставшуюся часть строки, начиная со стартовой позиции и до самого конца. Таким образом, конструкция Сред(Стр, 2) идеально отсекает первый символ, оставляя остальную часть текста нетронутой.Однако при написании боевого кода всегда нужно закладывать обработку исключительных ситуаций. Что произойдет, если исходная строка окажется пустой или будет состоять всего из одного символа? Выясним это.
""): Функция Сред("", 2) не вызовет критической ошибки платформы. Она корректно вернет пустую строку. В итоге результатом выражения станет одиночный НовСимвол. Если по логике вашего бизнес-процесса заменять первый символ в пустой строке не требуется, необходимо добавить предварительную проверку.Сред() вернет пустую строку, и старый единственный символ успешно заменится новым символом.Давайте посмотрим на пример безопасного и надежного кода с проверкой заполнения:
// Безопасный алгоритм замены первого символа
ИсходнаяСтрока = Объект.ПолеВводаСтроки; // Получаем значение из реквизита формы
НовыйСимвол = "Z";
Если ЗначениеЗаполнено(ИсходнаяСтрока) Тогда
// Заменяем первый символ и перезаписываем переменную
ИсходнаяСтрока = НовыйСимвол + Сред(ИсходнаяСтрока, 2);
Иначе
Предупреждение("Поле ввода пустое, замена невозможна!");
КонецЕсли;
Для полноты картины проанализируем другой способ, который иногда применяют начинающие разработчики. Он заключается в совместном использовании функций Прав() и СтрДлина():
Нов = НовСимвол + Прав(Стр, СтрДлина(Стр) - 1);
Давайте разберем по шагам, почему этот вариант гораздо хуже и его не рекомендуется использовать на практике:
СтрДлина(), что снижает общую производительность кода при обработке больших массивов данных.Стр окажется пустой, то СтрДлина(Стр) вернет 0. Выражение СтрДлина(Стр) - 1 превратится в -1. Передача отрицательного числа во второй параметр функции Прав() приведет к ошибке выполнения кода на сервере или клиенте. Чтобы этого избежать, придется писать громоздкие условия.Таким образом, использование связки с функцией Сред() без указания длины является стандартом разработки в 1С.
Технологии 1С не стоят на месте, и в новой объектно-ориентированной технологии разработки «1С:Предприятие.Элемент» работа с текстовыми данными кардинально изменилась. Давайте посмотрим на ключевые отличия:
Символ = МояСтрока[0];.Сред() у строкового объекта появился метод .Подстрока().С учетом этих нововведений, код замены первого символа в среде «1С:Предприятие.Элемент» выглядит невероятно просто, элегантно и современно:
// Код для новой платформы 1С:Предприятие.Элемент
пер ИсходнаяСтрока = "A12345"
пер НовСимвол = "B"
// Метод Подстрока(1) возвращает всё, начиная с индекса 1 (второй символ)
пер Результат = НовСимвол + ИсходнаяСтрока.Подстрока(1)
// Результат примет значение "B12345"
Мы подробно проанализировали специфику работы со строками в экосистеме 1С. Для быстрого решения повседневных задач программисту достаточно запомнить несколько простых правил:
СтрДлина(), не забывая очищать невидимые пробелы функцией СокрЛП().Сред(Строка, 2) — это самый быстрый, надежный и безопасный способ, защищенный от ошибок при работе с пустыми значениями..Подстрока(1) и помните, что индексация там начинается с нуля.