Как удалить последние два символа из наименования или строки в 1С

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

В процессе разработки в среде 1С:Предприятие программисты регулярно сталкиваются с необходимостью манипулирования текстовыми строками. Типичный пример такой задачи — очистка наименования номенклатуры от лишней информации в конце строки. Например, когда нам нужно преобразовать строку вида "Тапочники 39" в чистое наименование "Тапочки" (убрав размер или код в конце строки), либо просто отсечь фиксированное количество символов справа.

В этой статье мы подробно разберем, как решить данную задачу наиболее эффективными и безопасными способами, проанализируем возможные критические ошибки стандартных подходов и изучим современные альтернативы с использованием Библиотеки Стандартных Подсистем (БСП).

Способ 1. Классический вариант с использованием встроенных функций Лев() и СтрДлина()

Разберем базовую логику решения этой задачи. Чтобы удалить из строки N символов справа, нам необходимо выполнить два простых шага:

  1. Вычислить общую длину исходной строки с помощью функции СтрДлина().
  2. Взять левую часть строки длиной, равной общей длине минус количество удаляемых символов, с помощью функции Лев().

Проанализируем пример кода, который решает эту задачу "в лоб":


ИсходноеНаименование = ТекСтрокаПродукция.Номенклатура.Наименование; // Пример: "Тапочники 39"
КоличествоСимволовДляУдаления = 2;

// Вычисляем длину новой строки
ДлинаНовойСтроки = СтрДлина(ИсходноеНаименование) - КоличествоСимволовДляУдаления;

// Получаем обрезанную строку
Шапка.Параметры.Номенклатура = Лев(ИсходноеНаименование, ДлинаНовойСтроки);

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

Способ 2. Защита от критической ошибки (Проверка длины строки)

Выясним причину потенциального падения программы при использовании первого способа. Если исходная строка окажется пустой или ее длина будет меньше, чем количество удаляемых символов (например, наименование состоит всего из одного символа "А", а мы пытаемся удалить 2 символа), выражение СтрДлина(Строка) - 2 вернет отрицательное число (в данном случае -1).

Передача отрицательного числа во второй параметр встроенной функции Лев() гарантированно вызовет системное исключение: «Недопустимое значение параметра (параметр номер '2')». Программа аварийно прекратит выполнение текущей операции.

Чтобы защитить наш код от подобных сбоев, мы должны гарантировать, что передаваемая в функцию Лев() длина будет не меньше нуля. Рассмотрим два варианта безопасной реализации.

Вариант с использованием функции Макс():

Функция Макс() сравнивает полученную разность с нулем и возвращает наибольшее значение. Если разность уходит в минус, функция вернет 0, что абсолютно безопасно для функции Лев().


Наименование = ТекСтрокаПродукция.Номенклатура.Наименование;
Длина = СтрДлина(Наименование);
СимволовДляУдаления = 2;

// Гарантируем, что значение второго параметра будет >= 0
Шапка.Параметры.Номенклатура = Лев(Наименование, Макс(Длина - СимволовДляУдаления, 0));

Вариант с использованием тернарного оператора ?():

Мы можем явно проверить условие превышения длины строки над количеством удаляемых символов с помощью конструкции сокращенного условия.


Наименование = ТекСтрокаПродукция.Номенклатура.Наименование;
Длина = СтрДлина(Наименование);
СимволовДляУдаления = 2;

// Если строка длиннее удаляемой части, обрезаем ее, иначе возвращаем пустую строку
Шапка.Параметры.Номенклатура = ?(Длина > СимволовДляУдаления, Лев(Наименование, Длина - СимволовДляУдаления), "");

Способ 3. Борьба с невидимыми концевыми пробелами

Посмотрим на ситуацию глубже. Очень часто при ручном вводе данных пользователями или некорректном импорте номенклатуры из файлов Excel на конце строк остаются незаметные пробелы. Например, в базе записана строка "Тапочки 39 " (с пробелом в самом конце).

Если мы применим стандартный алгоритм обрезки двух символов к этой строке, система честно отрежет концевой пробел и девятку. В результате мы получим нежелательный результат: "Тапочки 3" вместо ожидаемого "Тапочки".

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


// Очищаем строку от невидимых пробелов на концах
НаименованиеОчищенное = СокрЛП(ТекСтрокаПродукция.Номенклатура.Наименование); 
Длина = СтрДлина(НаименованиеОчищенное);
СимволовДляУдаления = 2;

Шапка.Параметры.Номенклатура = Лев(НаименованиеОчищенное, Макс(Длина - СимволовДляУдаления, 0));

Способ 4. Использование готовых функций БСП (Библиотеки Стандартных Подсистем)

Если вы ведете разработку в современной типовой конфигурации 1С (такой как 1С:ERP, Управление торговлей, Бухгалтерия предприятия, Комплексная автоматизация или ЗУП), то в вашей системе гарантированно присутствует БСП. Разработчики фирмы 1С уже позаботились о безопасности строковых операций и создали готовые модули.

Для нашей задачи идеально подходит готовая функция из общего модуля СтроковыеФункцииКлиентСервер. Она берет на себя все проверки длины строки и делает код лаконичным и легко читаемым.

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


Наименование = ТекСтрокаПродукция.Номенклатура.Наименование;

// Безопасное удаление двух последних символов без ручных расчетов длины
НаименованиеБезХвоста = СтроковыеФункцииКлиентСервер.УдалитьПоследнийСимволВСтроке(Наименование, 2); 

Шапка.Параметры.Номенклатура = НаименованиеБезХвоста;

Использование функций БСП считается хорошим тоном при разработке в среде 1С, так как снижает вероятность написания избыточного кода и минимизирует количество ошибок.

Важное ограничение: Обрезка строк в запросах 1С

Часто у разработчиков возникает желание оптимизировать код и произвести обрезку последних символов непосредственно на уровне базы данных — внутри текста запроса 1С. Однако здесь мы сталкиваемся с серьезным ограничением платформы.

В языке запросов 1С отсутствуют прямые аналоги функций Лев() и СтрДлина(). Единственная доступная функция для работы с частями строк в запросах — это ПОДСТРОКА(). Ее синтаксис выглядит следующим образом: ПОДСТРОКА(Строка, НачальнаяПозиция, Длина).

Главная сложность заключается в том, что третий параметр этой функции (длина выбираемой подстроки) обязательно должен быть жестко заданной константой (числом). Мы не можем динамически передать туда конструкцию вычисления длины строки. По этой причине решить задачу динамической обрезки символов с конца строки внутри запроса стандартными средствами невозможно. Подобные манипуляции со строками всегда следует переносить на этап пост-обработки полученной выборки запроса в коде на встроенном языке.

← На главную