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

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

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

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

Анализ типичных ошибок: почему не работают стандартные конструкции

Рассмотрим две ключевые проблемы, с которыми сталкиваются при попытке вырезать подстроку:

  1. Использование функции Прав() в СКД. В языке выражений системы компоновки данных отсутствует встроенная функция Прав(), привычная по встроенному языку 1С. Попытка вызвать ее в вычисляемом поле приведет к ошибке «Функция не найдена "Прав"».
  2. Попытка преобразовать строку в число через Выразить(). В языке запросов и выражениях СКД конструкция Выразить(...) предназначена исключительно для выделения конкретного ссылочного типа из составного типа данных либо для ограничения длины строк и точности чисел. Она не выполняет конвертацию типа Строка в Число.
  3. Неверный подсчет позиции и разделитель дробной части. Символы разделителей (запятая или точка) также входят в длину строки. Например, в значении 1,18 содержится четыре символа, а не три. При взятии 3 символов получится ,18, что приведет к ошибке парсинга.
  4. Ограничения языка запросов. Функция ПОДСТРОКА() в тексте запроса принимает только фиксированные числовые константы в качестве начальной позиции и длины. Рассчитать динамическую позицию от конца строки непосредственно в тексте запроса нельзя — эту задачу следует решать на уровне вычисляемых полей СКД.

Способ 1. Получение подстроки через функции языка выражений СКД

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

Посмотрим на формулу расчета начальной позиции. Нумерация символов в 1С начинается с единицы. Чтобы получить последние N символов из строки, начальная позиция вычисляется как ДлинаСтроки(Поле) - N + 1. Если требуется вырезать 4 символа (например, 1,18), формула позиции будет: ДлинаСтроки(Поле) - 4 + 1, что равно ДлинаСтроки(Поле) - 3.

Разберем по шагам настройку вычисляемого поля в схеме компоновки данных:

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

Подстрока(Номенклатура.Наименование, ДлинаСтроки(Номенклатура.Наименование) - 3, 4)

Способ 2. Преобразование полученной подстроки в число

Если извлеченное значение требуется использовать для суммирования, сортировки или сравнения как числовое поле, его необходимо привести к типу Число. Для этого в языке выражений СКД предусмотрена функция Число().

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

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


Выбор 
    Когда ДлинаСтроки(Номенклатура.Наименование) >= 4 
        Тогда Число(СтрЗаменить(Подстрока(Номенклатура.Наименование, ДлинаСтроки(Номенклатура.Наименование) - 3, 4), ",", "."))
    Иначе 0 
Конец

Способ 3. Использование экспортных функций общих модулей

Если логика извлечения числа сложная (например, длина числа может меняться от 3 до 6 знаков или перед числом стоят разные префиксы), строковые функции СКД могут стать слишком громоздкими. В этом случае целесообразно вынести логику во встроенный язык 1С.

Язык выражений СКД позволяет вызывать экспортные функции неглобальных серверных общих модулей. Разберем реализацию:

  1. Создадим или используем существующий неглобальный общий модуль с установленными флажками Сервер и Внешнее соединение (например, СтроковыеФункцииКлиентСервер или специализированный модуль отчета).
  2. Напишем экспортную функцию обработки строки:

Функция ИзвлечьЧислоИзКонцаСтроки(Знач ИсходныйТекст, Знач КоличествоСимволов) Экспорт
    
    Если СтрДлина(ИсходныйТекст) < КоличествоСимволов Тогда
        Возврат 0;
    КонецЕсли;
    
    СтрокаЧисла = Прав(ИсходныйТекст, КоличествоСимволов);
    СтрокаЧисла = СтрЗаменить(СтрокаЧисла, ",", ".");
    
    Попытка
        Возврат Число(СтрокаЧисла);
    Исключение
        Возврат 0;
    КонецПопытки;
    
КонецФункции
  1. В схеме компоновки данных на вкладке Вычисляемые поля вызовем эту функцию в поле Выражение:

МойОбщийМодуль.ИзвлечьЧислоИзКонцаСтроки(Номенклатура.Наименование, 4)

Архитектурная рекомендация

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

  1. Использовать механизм Дополнительных реквизитов и сведений (ПВХ ДополнительныеРеквизитыИСведения) для хранения числовых характеристик номенклатуры в явном виде.
  2. Использовать стандартный механизм Характеристик номенклатуры, если значение параметра влияет на складской или финансовый учет.
← На главную