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

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

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

Метод 1: Использование стандартных функций языка выражений СКД

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

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

Пример выражения для поля:


ВЫБОР
    КОГДА СтрНайти(ВашаСтрока, "-") > 0 ТОГДА
        Лев(ВашаСтрока, СтрНайти(ВашаСтрока, "-") - 1)
    ИНАЧЕ
        ВашаСтрока
КОНЕЦ

Почему это важно: Мы всегда используем конструкцию ВЫБОР КОГДА. Это необходимо для того, чтобы избежать ошибок в случаях, когда искомый символ в строке отсутствует. Если функция СтрНайти не обнаружит символ, она вернет 0, и попытка вычислить 0 - 1 в функции Лев может привести к ошибке или некорректному результату.

Метод 2: Вызов функций из общего модуля

Если логика обработки сложнее, чем простая обрезка по символу, либо вам требуется выполнять многошаговые преобразования, лучше вынести эту логику в общий серверный модуль. Это обеспечит чистоту кода и легкость его отладки.

  1. Создайте функцию в общем модуле (например, МойМодульСтрок.ОбрезатьСтроку(ИсходнаяСтрока)).
  2. Убедитесь, что для модуля установлены флаги «Сервер» и «Вызов сервера».
  3. В СКД в разделе «Вычисляемые поля» в поле «Выражение» пропишите вызов вашей функции: МойМодульСтрок.ОбрезатьСтроку(ВашаСтрока).

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

Важные нюансы работы с СКД и производительностью

При выборе метода реализации всегда держите в уме два сценария обработки данных:

1. Обработка на уровне СУБД (Запрос):

Современные версии платформы 1С умеют «транслировать» многие строковые функции (такие как Лев, Прав, СтрНайти, ДлинаСтроки) напрямую в SQL-запросы к базе данных. Это оптимальный вариант. Если система видит, что функцию можно выполнить на стороне SQL, отчет отработает максимально быстро, так как фильтрация и обработка строк произойдут еще до получения данных в 1С.

2. Обработка на стороне процессора компоновки (память сервера 1С):

Если вы используете сложные вычисления, специфичные функции или вызовы общих модулей, СКД вынуждена сначала «вытащить» данные из базы, а затем проводить их постобработку в оперативной памяти сервера. Это приводит к росту потребления ресурсов и увеличению времени ожидания пользователя.

Режим совместимости:

Обратите внимание на режим совместимости вашей конфигурации. Некоторые строковые функции получили расширенную поддержку в запросах начиная с версии 8.3.20. Если у вас более ранняя версия (например, 8.3.14 или 8.3.19), поведение функций в отборах или вычисляемых полях может различаться. Всегда проверяйте актуальность режима совместимости, если столкнулись с ошибкой «Поле не найдено» при попытке использования строковых функций в отборах СКД.

Заключение: что выбрать?

Для стандартных задач (обрезать до пробела, запятой, тире) используйте комбинацию функций в вычисляемом поле — это эффективно, читаемо и позволяет платформе оптимизировать запрос. К вызову общих модулей прибегайте только тогда, когда логика обработки строк требует сложного алгоритмического анализа, который невозможно уложить в компактное выражение ВЫБОР КОГДА.

← На главную