В языке запросов платформы 1С:Предприятие 8 механизм шаблонов строк (функция ШаблонСтроки или синтаксис ВЫРАЗИТЬ(... КАК СТРОКА ШАБЛОН ...)) является мощным инструментом для формирования текстовых представлений данных прямо на уровне СУБД. Это позволяет перенести логику форматирования строк с клиентского приложения на сервер базы данных, что критически важно для производительности при работе с большими объемами данных.
Базовый синтаксис и принципы работы
Шаблон строки представляет собой выражение, которое вычисляется в строку. Внутри шаблона можно использовать:
- Текстовые константы (в одинарных кавычках).
- Поля таблиц и результаты вычислений.
- Параметры запроса.
- Другие функции языка запросов (например,
ВЫБОР,ЕСТЬNULL,ПОДСТРОКА).
Основной синтаксис (функция ШАБЛОНСТРОКИ):
ШАБЛОНСТРОКИ("Текст [Поле1] Текст [Поле2] ...") Альтернативный синтаксис (ВЫРАЗИТЬ КАК СТРОКА ШАБЛОН):
ВЫРАЗИТЬ(
"Текст [Поле1] Текст [Поле2]"
КАК СТРОКА ШАБЛОН
) Важно: Внутри шаблона имена полей и параметров заключаются в квадратные скобки [ИмяПоля]. Если имя поля содержит пробелы или спецсимволы, оно берется в кавычки внутри скобок: ["Имя поля"].
Практические примеры использования
Пример 1: Формирование ФИО и адреса
Классическая задача — собрать ФИО из отдельных полей справочника ФизическиеЛица.
ВЫБРАТЬ
ФизЛица.Ссылка,
ШАБЛОНСТРОКИ("[Фамилия] [Имя] [Отчество]") КАК ФИО,
ШАБЛОНСТРОКИ("г. [Город], ул. [Улица], д. [Дом], кв. [Квартира]") КАК АдресПроживания
ИЗ
Справочник.ФизическиеЛица КАК ФизЛица Пример 2: Использование параметров и условной логики
Шаблоны отлично работают с параметрами запроса и конструкцией ВЫБОР.
ВЫБРАТЬ
Товары.Ссылка,
ШАБЛОНСТРОКИ(
ВЫБОР
КОГДА Товары.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Товар)
ТОГДА "[Код] ─ [Наименование] (Артикул: [Артикул])"
ИНАЧЕ "[Наименование] (Услуга)"
КОНЕЦ
) КАК ПредставлениеТовара
ИЗ
Справочник.Номенклатура КАК Товары Пример 3: Форматирование чисел и дат внутри шаблона
Часто требуется привести число к строке с разделителями разрядов или дату к определенному формату. Внутри шаблона можно вызывать функции форматирования.
ВЫБРАТЬ
Продажи.Номенклатура,
ШАБЛОНСТРОКИ(
"Продажа: [Номенклатура] | "
+ "Кол-во: " + ВЫРАЗИТЬ(Продажи.Количество КАК СТРОКА(10, 2)) + " | "
+ "Сумма: " + ВЫРАЗИТЬ(Продажи.Сумма КАК СТРОКА(15, 2)) + " руб. | "
+ "Дата: " + ВЫРАЗИТЬ(Продажи.Период КАК СТРОКА(ДФ="dd.MM.yyyy"))
) КАК СтрокаЧека
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК Продажи Особенности работы с NULL и пустыми значениями
Одна из самых частых ошибок — конкатенация (склеивание) строки с NULL. В большинстве СУБД (PostgreSQL, MS SQL, Oracle) результат 'Текст' + NULL дает NULL. Функция ШАБЛОНСТРОКИ ведет себя иначе: она игнорирует поля, равные NULL, и просто не подставляет их в результат, не ломая всю строку.
Однако, если поле имеет пустое значение (пустая строка '', нулевая дата, пустая ссылка), оно подставится как пустота. Для обработки таких случаев внутри шаблона используйте ЕСТЬNULL или ВЫБОР.
Корректная обработка пустых значений:
ШАБЛОНСТРОКИ(
"[Фамилия] "
+ ВЫБОР КОГДА НЕ ЗначениеЗаполнено([Имя]) ТОГДА "" ИНАЧЕ "[Имя] " КОНЕЦ
+ ВЫБОР КОГДА НЕ ЗначениеЗаполнено([Отчество]) ТОГДА "" ИНАЧЕ "[Отчество]" КОНЕЦ
) Производительность и ограничения
Преимущества:
- Снижение трафика: Готовая строка приходит с сервера БД, не нужно передавать 5-10 полей на клиент для склеивания.
- Скорость СКД: В системах компоновки данных (СКД) использование шаблонов в вычисляемых полях набора данных значительно ускоряет построение отчетов по сравнению с вычислением в макете или в процедуре
ПриКомпоновкеРезультата. - Индексация (частично): Некоторые СУБД позволяют создавать функциональные индексы по выражениям, используемым в шаблоне (зависит от конкретной СУБД).
Ограничения и подводные камни:
- Длина строки: Результирующая строка ограничена максимальной длиной строкового типа данных СУБД (обычно 32К или 1Мб в зависимости от настроек и типа поля).
- Сложная логика: Не стоит пихать в шаблон огромные конструкции
ВЫБОРс десятками веток. Это усложняет план запроса и делает код нечитаемым. Лучше вынести логику во временную таблицу или представление. - Типы данных: Поля автоматически приводятся к строке. Для
Число,Дата,Булевоприменяются стандартные правила приведения к строке текущей СУБД (локаль, формат даты). Рекомендуется явно использоватьВЫРАЗИТЬ(... КАК СТРОКА(...))для контроля формата. - Недоступность в некоторых СУБД: Синтаксис
ШАБЛОНСТРОКИ— это абстракция платформы 1С. При выполнении запроса платформа транслирует его в нативный SQL конкретной СУБД (CONCAT,||,FORMAT,CONCAT_WS). В редких случаях на экзотических СУБД поведение может отличаться.
Шаблоны строк в СКД (Система компоновки данных)
В СКД шаблоны строк используются в двух основных местах:
А. Вычисляемые поля набора данных
Самое эффективное место. Поле вычисляется на сервере БД один раз при выборке.
// В схеме компоновки -> Наборы данных -> Поля -> Добавить вычисляемое поле
// Выражение:
ШАБЛОНСТРОКИ("Заказ №[Номер] от [Дата(ДФ='dd.MM.yyyy')] Клиент: [Контрагент]") Б. Оформление условного (в макете)
// В ячейке макета (Параметр шаблона):
[ШаблонСтрокиОформления]
// В коде заполнения (если нужно сгенерировать шаблон динамически):
ПараметрыШаблона = Новый Структура;
ПараметрыШаблона.Вставить("Номер", СтрокаНомер);
ПараметрыШаблона.Вставить("Дата", Формат(СтрокаДата, "ДЛФ=Д"));
// ...
ТекстЯчейки = ПолучитьШаблон("МойШаблон").ПолучитьТекст(ПараметрыШаблона); Отладка и частые ошибки
| Ошибка | Причина | Решение |
|---|---|---|
Результат NULL при наличии данных | Конкатенация через + с полем NULL вне функции ШАБЛОНСТРОКИ. | Использовать ШАБЛОНСТРОКИ или оборачивать поля в ЕСТЬNULL(Поле, ""). |
| Ошибка «Поле не найдено» или «Неверное имя поля» | Имя поля в квадратных скобках не совпадает с псевдонимом в запросе. | Проверять точное совпадение регистра и имени. Использовать псевдонимы (КАК ИмяПоля). |
| Неверный формат даты/числа | Зависит от настроек СУБД/локали сервера. | Явно указывать формат: ВЫРАЗИТЬ(Поле КАК СТРОКА(ДФ="yyyyMMdd")). |
| Превышение длины строки | Результат длиннее лимита СУБД. | Использовать ПОДСТРОКА или ЛЕВ/ПРАВ внутри шаблона. |
Резюме: Best Practices
- Предпочитайте
ШАБЛОНСТРОКИконкатенации через+. Это безопаснее относительноNULLи читаемее. - Выносите форматирование в запрос; Не форматируйте даты и числа в цикле обхода результата запроса на языке 1С.
- Используйте псевдонимы (
КАК) для всех полей, участвующих в шаблоне. Это спасает от ошибок при изменении структуры таблиц. - Для сложных условий используйте
ВЫБОР ... КОНЕЦпрямо внутри аргументаШАБЛОНСТРОКИ. - Тестируйте на целевой СУБД. План запроса и скорость работы строковых функций могут отличаться на MS SQL, PostgreSQL и IBM DB2.
Статья подготовлена на основе документации 1С:Предприятие 8.3 и практики разработки высоконагруженных систем. Примеры кода носят ознакомительный характер. Контакты автора: * (скрыто по правилам безопасности).