При разработке отчетов на базе Системы компоновки данных (СКД) часто возникает задача обработки строковых значений, например, обрезка строки до или после определенного разделителя. В этой статье мы разберем, какими способами можно реализовать такую задачу, учитывая ограничения платформы и вопросы производительности.
Если задача стоит максимально просто — например, обрезать строку до определенного символа (скажем, до первого пробела или дефиса), мы можем воспользоваться комбинацией стандартных строковых функций прямо в настройках вычисляемого поля. Это наиболее быстрый способ с точки зрения написания кода.
Для решения задачи нам потребуются функции Лев (вырезает символы слева) и СтрНайти (определяет позицию искомого символа). Логика выглядит следующим образом: мы находим позицию разделителя и вырезаем часть строки, которая стоит левее него.
Пример выражения для поля:
ВЫБОР
КОГДА СтрНайти(ВашаСтрока, "-") > 0 ТОГДА
Лев(ВашаСтрока, СтрНайти(ВашаСтрока, "-") - 1)
ИНАЧЕ
ВашаСтрока
КОНЕЦ
Почему это важно: Мы всегда используем конструкцию ВЫБОР КОГДА. Это необходимо для того, чтобы избежать ошибок в случаях, когда искомый символ в строке отсутствует. Если функция СтрНайти не обнаружит символ, она вернет 0, и попытка вычислить 0 - 1 в функции Лев может привести к ошибке или некорректному результату.
Если логика обработки сложнее, чем простая обрезка по символу, либо вам требуется выполнять многошаговые преобразования, лучше вынести эту логику в общий серверный модуль. Это обеспечит чистоту кода и легкость его отладки.
МойМодульСтрок.ОбрезатьСтроку(ИсходнаяСтрока)).МойМодульСтрок.ОбрезатьСтроку(ВашаСтрока).Этот способ является «универсальным солдатом». Он позволяет реализовать любую логику, однако помните о производительности: вызов функции общего модуля для каждой строки выборки может замедлить формирование отчета при обработке больших объемов данных.
При выборе метода реализации всегда держите в уме два сценария обработки данных:
1. Обработка на уровне СУБД (Запрос):
Современные версии платформы 1С умеют «транслировать» многие строковые функции (такие как Лев, Прав, СтрНайти, ДлинаСтроки) напрямую в SQL-запросы к базе данных. Это оптимальный вариант. Если система видит, что функцию можно выполнить на стороне SQL, отчет отработает максимально быстро, так как фильтрация и обработка строк произойдут еще до получения данных в 1С.
2. Обработка на стороне процессора компоновки (память сервера 1С):
Если вы используете сложные вычисления, специфичные функции или вызовы общих модулей, СКД вынуждена сначала «вытащить» данные из базы, а затем проводить их постобработку в оперативной памяти сервера. Это приводит к росту потребления ресурсов и увеличению времени ожидания пользователя.
Режим совместимости:
Обратите внимание на режим совместимости вашей конфигурации. Некоторые строковые функции получили расширенную поддержку в запросах начиная с версии 8.3.20. Если у вас более ранняя версия (например, 8.3.14 или 8.3.19), поведение функций в отборах или вычисляемых полях может различаться. Всегда проверяйте актуальность режима совместимости, если столкнулись с ошибкой «Поле не найдено» при попытке использования строковых функций в отборах СКД.
Для стандартных задач (обрезать до пробела, запятой, тире) используйте комбинацию функций в вычисляемом поле — это эффективно, читаемо и позволяет платформе оптимизировать запрос. К вызову общих модулей прибегайте только тогда, когда логика обработки строк требует сложного алгоритмического анализа, который невозможно уложить в компактное выражение ВЫБОР КОГДА.