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

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

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

Метод 1. Использование функции ЗАМЕНИТЬ в языке запросов

Разберем самый эффективный с точки зрения производительности метод. Если вам нужно выполнить простую замену символов в строке, лучше всего сделать это на уровне получения данных. В языке запросов 1С поддерживается функция ЗАМЕНИТЬ(), которая транслируется непосредственно в SQL-запрос (REPLACE).

Рассмотрим пример, когда нам нужно убрать пробелы из артикула товара прямо в наборе данных:


ВЫБРАТЬ
    Товары.Ссылка КАК Товар,
    ЗАМЕНИТЬ(Товары.Артикул, " ", "") КАК АртикулБезПробелов
ИЗ
    Справочник.Номенклатура КАК Товары

Преимущества этого подхода:

  1. Скорость: Замена происходит на стороне СУБД, что значительно быстрее обработки каждой строки в памяти после получения результата.
  2. Универсальность: Результат сразу готов для группировок и отборов в СКД.

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

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

Разберем по шагам, как подготовить функцию:

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

Пример кода в общем модуле РаботаСоСтрокамиПолный:


Функция УдалитьСпецСимволы(Значение) Экспорт
    Результат = СтрЗаменить(Значение, "@", "");
    Результат = СтрЗаменить(Результат, "#", "");
    Возврат Результат;
КонецФункции

Теперь в схеме компоновки данных, на вкладке «Вычисляемые поля», мы можем прописать выражение:

РаботаСоСтрокамиПолный.УдалитьСпецСимволы(Наименование)

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

Метод 3. Использование функций БСП

Если ваша конфигурация построена на базе Библиотеки стандартных подсистем (БСП), нам не нужно изобретать велосипед и писать свои «обертки». В составе БСП уже есть мощные инструменты для работы со строками. Выясним, какие функции могут быть нам полезны.

Чаще всего в СКД удобно использовать модуль СтроковыеФункцииКлиентСервер. Например:

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

Метод 4. Удаление пробелов штатными средствами

Рассмотрим случай, упомянутый в обсуждении на форуме: «Обрезка пробелов для вывода». Если ваша задача заключается только в том, чтобы убрать лишние пробелы в начале или в конце строки, создавать обертку для СтрЗаменить не нужно.

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

СокрЛП(Представление(Контрагент))

Метод 5. Условное оформление как визуальная замена

Иногда нам не нужно менять само значение данных, а нужно лишь изменить то, как пользователь видит их в отчете. Для этого проанализируем возможности Условного оформления.

Допустим, если поле имеет значение "Ошибка_404", мы хотим вывести текст "Не найдено". Вместо использования функций замены в запросе или коде, мы можем сделать следующее:

  1. Переходим на вкладку «Настройки» в СКД.
  2. Выбираем вкладку «Условное оформление».
  3. Добавляем новый элемент оформления. В параметре «Текст» пишем "Не найдено".
  4. В условии указываем: ПолеРавно "Ошибка_404".

Этот способ идеален, когда замен немного и они носят чисто декоративный характер.

Важные советы по работе с типами данных

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

Рекомендация: Всегда явно указывайте тип в колонке «Тип значения» вычисляемого поля. Если ваша функция возвращает строку, выберите тип Строка и укажите допустимую длину (или неограниченную).

Подведем итог: несмотря на отсутствие прямой функции СтрЗаменить в СКД, у разработчика есть широкий арсенал средств. Для простых замен используйте ЗАМЕНИТЬ в запросе, для удаления пробелов — СокрЛП, а для сложной обработки — экспортные функции общих модулей или возможности БСП.

← На главную