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