При формировании отчетов в системе компоновки данных (СКД) нередко возникает необходимость распарсить текстовую строку — например, вырезать из наименования номенклатуры артикул, плотность, объем или размерность, расположенные в самом конце названия. При попытке решить эту задачу разработчики часто сталкиваются с ошибками синтаксиса или некорректной работой функций приведения типов.
Разберем типичные ошибки, проанализируем доступные механизмы платформы 1С:Предприятие и рассмотрим по шагам, как правильно извлечь подстроку с конца текстового поля и преобразовать ее в числовое значение.
Рассмотрим две ключевые проблемы, с которыми сталкиваются при попытке вырезать подстроку:
Прав() в СКД. В языке выражений системы компоновки данных отсутствует встроенная функция Прав(), привычная по встроенному языку 1С. Попытка вызвать ее в вычисляемом поле приведет к ошибке «Функция не найдена "Прав"».Выразить(). В языке запросов и выражениях СКД конструкция Выразить(...) предназначена исключительно для выделения конкретного ссылочного типа из составного типа данных либо для ограничения длины строк и точности чисел. Она не выполняет конвертацию типа Строка в Число.1,18 содержится четыре символа, а не три. При взятии 3 символов получится ,18, что приведет к ошибке парсинга.ПОДСТРОКА() в тексте запроса принимает только фиксированные числовые константы в качестве начальной позиции и длины. Рассчитать динамическую позицию от конца строки непосредственно в тексте запроса нельзя — эту задачу следует решать на уровне вычисляемых полей СКД.В языке выражений СКД присутствуют функции Подстрока() и ДлинаСтроки(), которые позволяют динамически вычислить индекс начального символа относительно конца строки.
Посмотрим на формулу расчета начальной позиции. Нумерация символов в 1С начинается с единицы. Чтобы получить последние N символов из строки, начальная позиция вычисляется как ДлинаСтроки(Поле) - N + 1. Если требуется вырезать 4 символа (например, 1,18), формула позиции будет: ДлинаСтроки(Поле) - 4 + 1, что равно ДлинаСтроки(Поле) - 3.
Разберем по шагам настройку вычисляемого поля в схеме компоновки данных:
ПлотностьСтрокой).
Подстрока(Номенклатура.Наименование, ДлинаСтроки(Номенклатура.Наименование) - 3, 4)
Если извлеченное значение требуется использовать для суммирования, сортировки или сравнения как числовое поле, его необходимо привести к типу Число. Для этого в языке выражений СКД предусмотрена функция Число().
Обратите внимание: если в строке используется запятая, ее предварительно необходимо заменить на точку с помощью функции СтрЗаменить(), чтобы строковое представление корректно распознавалось платформой.
Также важно предусмотреть защиту от пустых значений или строк недостаточной длины, чтобы избежать ошибок при отрицательной позиции символа. Итоговое выражение для вычисляемого поля будет выглядеть следующим образом:
Выбор
Когда ДлинаСтроки(Номенклатура.Наименование) >= 4
Тогда Число(СтрЗаменить(Подстрока(Номенклатура.Наименование, ДлинаСтроки(Номенклатура.Наименование) - 3, 4), ",", "."))
Иначе 0
Конец
Если логика извлечения числа сложная (например, длина числа может меняться от 3 до 6 знаков или перед числом стоят разные префиксы), строковые функции СКД могут стать слишком громоздкими. В этом случае целесообразно вынести логику во встроенный язык 1С.
Язык выражений СКД позволяет вызывать экспортные функции неглобальных серверных общих модулей. Разберем реализацию:
СтроковыеФункцииКлиентСервер или специализированный модуль отчета).
Функция ИзвлечьЧислоИзКонцаСтроки(Знач ИсходныйТекст, Знач КоличествоСимволов) Экспорт
Если СтрДлина(ИсходныйТекст) < КоличествоСимволов Тогда
Возврат 0;
КонецЕсли;
СтрокаЧисла = Прав(ИсходныйТекст, КоличествоСимволов);
СтрокаЧисла = СтрЗаменить(СтрокаЧисла, ",", ".");
Попытка
Возврат Число(СтрокаЧисла);
Исключение
Возврат 0;
КонецПопытки;
КонецФункции
МойОбщийМодуль.ИзвлечьЧислоИзКонцаСтроки(Номенклатура.Наименование, 4)
Хранение значимых числовых параметров внутри текстового наименования справочника — ненадежная практика. Любое изменение формата ввода пользователем (лишний пробел, перестановка слов) нарушит работу отчета. В качестве стабильного архитектурного решения рекомендуется:
ДополнительныеРеквизитыИСведения) для хранения числовых характеристик номенклатуры в явном виде.