При разработке и доработке конфигураций в 1С мы часто сталкиваемся с задачей форматирования строк, кодов справочников или номеров документов. Одна из классических задач — необходимость отрезать определенное количество символов с начала строки или избавиться от ведущих незначащих нулей. Например, у нас есть код карты 000569562, и нам необходимо преобразовать его в 569562. Давайте подробно рассмотрим и проанализируем различные способы решения этой задачи, начиная от самых простых функций и заканчивая регулярными выражениями и стандартными библиотеками.
Если мы точно знаем, что нам нужно убрать ровно первые три символа (или любое другое фиксированное количество), мы можем воспользоваться встроенными функциями для работы со строками. Разберем по шагам доступные варианты.
Использование функции Сред()
Функция Сред() позволяет получить подстроку, начиная с указанного символа. Если мы хотим отрезать первые три символа, нам нужно начать чтение с четвертого.
КодКарты = Сред(КодКарты, 4);
Этот метод работает идеально, если структура данных жестко фиксирована. Однако он подведет нас, если количество нулей или префиксов будет динамическим.
Использование функции Прав()
Посмотрим на пример с другой стороны. Мы можем вычислить общую длину строки и забрать всё с конца, за исключением первых трех символов. В этом нам поможет функция Прав().
КодКарты = Прав(КодКарты, СтрДлина(КодКарты) - 3);
Этот вариант иногда лучше читается, так как явно показывает логику «взять всю строку с конца, кроме нужного количества символов».
Проанализируем ситуацию, когда количество ведущих нулей заранее неизвестно. Их может быть два, три или пять. В таком случае простое отсечение не сработает. Нам необходимо проверять первый символ и удалять его, пока он является нулем.
Простой цикл While (Пока)
Пока Лев(КодКарты, 1) = "0" Цикл
КодКарты = Сред(КодКарты, 2);
КонецЦикла;
Этот код последовательно проверяет крайний левый символ. Если это ноль, он переписывает переменную, отрезая первый символ с помощью функции Сред(), начиная со второй позиции.
Расширенный поиск значащих цифр
Рассмотрим более сложный пример, который обернут в отдельную функцию. Здесь мы ищем первый символ, который входит в строку значащих цифр.
Функция КраткийНомер(ИсходныйНомер) Экспорт
Номер = СокрЛП(ИсходныйНомер);
ЗначащиеЦифры = "123456789";
Пока Найти(ЗначащиеЦифры, Лев(Номер, 1)) = 0 Цикл
Номер = Сред(Номер, 2);
КонецЦикла;
Возврат Номер;
КонецФункции
Такой подход помогает избавиться не только от нулей, но и от любых других префиксов, которые не являются цифрами от 1 до 9.
Один из самых изящных алгоритмических способов избавиться от незначащих нулей — это временно превратить строку в число. При преобразовании в число все ведущие нули отбрасываются автоматически платформой 1С. Посмотрим на примеры реализации.
Использование XMLСтрока()
Номер = XMLСтрока(Число(СокрЛП(Номер)));
Функция XMLСтрока() удобна тем, что конвертирует число обратно в строку без добавления неразрывных пробелов между разрядами (что часто случается при обычном приведении типов).
Использование Формат()
Если мы хотим строго контролировать процесс перевода числа обратно в строку, воспользуемся функцией Формат().
КодКарты = Формат(Число(КодКарты), "ЧГ=0");
Параметр ЧГ=0 является критически важным. Он гарантирует, что число (например, 123456) не превратится в строку «123 456» с пробелом-разделителем.
Важное предупреждение: Выясним причину, по которой этот метод нужно применять с осторожностью. Если в коде справочника попадется буква (например, 000569562А) или случайно введенный спецсимвол, конструкция Число(Код) вызовет критическую ошибку выполнения, и программа прервет работу. Используйте этот метод только тогда, когда есть стопроцентная гарантия наличия исключительно цифр.
Для полноты картины разберем по шагам несколько интересных "хаков", предложенных разработчиками.
Трюк с функцией СтрРазделить()
Код = Сред(Код, СтрДлина(СтрРазделить(Код, "123456789")[0]) + 1);
Этот код делит строку на массив, используя значащие цифры как разделители. Длина первого элемента массива как раз покажет нам, сколько "мусорных" символов находится в начале строки.
Трюк с пробелами и функцией СокрЛ()
КодКарты = СтрЗаменить(СокрЛ(СтрЗаменить(КодКарты, "0", " ")), " ", "0");
Здесь мы сначала заменяем все нули на пробелы. Затем функция СокрЛ() удаляет пробелы слева (те самые бывшие ведущие нули). А после этого мы возвращаем оставшимся пробелам (которые были нулями в середине или конце строки) их исходное значение. Это красивое решение без циклов. Для расширения строковых операций также подойдёт коллекция вспомогательных методов работы со строками в 1С.
В современном программировании на 1С не всегда нужно изобретать велосипед. В большинстве типовых конфигураций (например, ERP, УТ, БП) уже встроена БСП, где есть готовые, оптимизированные функции.
СтроковыеФункцииКлиентСервер.УдалитьВедущиеНули(КодКарты).УТ000569562), применяем специализированный модуль: ПрефиксообразованиеКлиентСервер.УдалитьПрефиксыИзНомераОбъекта().Если задача нестандартная, или требуется массовая обработка десятков тысяч записей с максимальной скоростью без циклов в 1С, рассмотрим использование регулярных выражений через COM-объекты (применимо для Windows-серверов).
RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.IgnoreCase = Истина;
RegExp.Global = Истина;
RegExp.MultiLine = Истина;
RegExp.Pattern = "^0+"; // Ищем один или более нулей в начале строки
КодБезНулей = RegExp.Replace(КодКарты, "");
Этот метод заменяет ведущие нули одной командой, не ломая строку, если внутри присутствуют буквы, и игнорируя нули в середине или конце слова. Это мощный инструмент, который стоит держать в арсенале любого профессионального разработчика. При необходимости работы без привязки к COM-объектам Windows можно использовать подсистему для работы с регулярными выражениями в 1С.