При разработке отчетов в Системе компоновки данных (СКД) программисты часто сталкиваются с необходимостью вывести данные в специфическом текстовом формате. Типичный пример: вместо двух отдельных колонок с датами нужно вывести одну строку вида «С 2018 по 2019» или «Период с 01.01.2023 по 31.12.2023». Попытка сделать это напрямую в тексте запроса через обычное сложение строк (конкатенацию) приводит к ошибке синтаксиса, так как язык запросов 1С строго типизирован и не умеет автоматически преобразовывать дату в строку.
В этой статье мы подробно разберем, почему не получается объединить данные в запросе, и рассмотрим несколько эффективных способов решения этой задачи средствами СКД.
Давайте проанализируем ситуацию. В языке запросов 1С конкатенация строк возможна только для строковых типов данных. Если мы попытаемся написать в конструкторе запроса конструкцию:
"С " + ТЧ.ДатаНачала + " по " + ТЧ.ДатаОкончания
Система выдаст ошибку, так как она не знает, как сложить строку "С " и объект типа Дата. В отличие от некоторых других языков программирования, в запросах 1С нет встроенной функции типа ToString() или ПреобразоватьВСтроку(). Поэтому нам необходимо использовать механизмы, которые предоставляет сама Система компоновки данных на уровне обработки результата запроса.
Наиболее гибкий и распространенный метод — это создание Вычисляемого поля. В языке выражений СКД (который отличается от языка запросов) доступно гораздо больше функций, включая функции форматирования.
Разберем по шагам, как это реализовать:
ПериодСтрокой.ПериодДляПечати).Если нам нужно вывести только годы, как в вопросе автора, выражение будет выглядеть так:
"С " + Формат(ДатаНачала, "ДФ=гггг") + " по " + Формат(ДатаОкончания, "ДФ=гггг")
Разберем функции, которые мы использовали. Функция Формат() в СКД работает аналогично одноименной функции в языке 1С. Параметр "ДФ=гггг" указывает системе, что из даты нужно извлечь только четырехзначный год. Если вы хотите вывести полную дату, используйте формат "ДФ=dd.MM.yyyy".
Важный нюанс: при работе с вычисляемыми полями всегда стоит помнить о пустых значениях. Проанализируем ситуацию, когда одна из дат не заполнена. В этом случае результат может выглядеть некрасиво. Чтобы этого избежать, используем условие:
Выбор
Когда ЗначениеЗаполнено(ДатаНачала) И ЗначениеЗаполнено(ДатаОкончания)
Тогда "С " + Формат(ДатаНачала, "ДФ=гггг") + " по " + Формат(ДатаОкончания, "ДФ=гггг")
Иначе "Период не определен"
Конец
Если вы не хотите создавать лишние поля в наборе данных и вам нужно лишь визуально оформить вывод, можно воспользоваться Шаблонами в макетах СКД. Этот способ считается «чище» с точки зрения архитектуры данных, так как мы не меняем структуру полей, а только способ их отображения.
Рассмотрим порядок действий:
С [ДатаНачала] по [ДатаОкончания].ДФ=гггг).Этот метод удобен тем, что СКД сама подставит значения в текст и отформатирует их согласно вашим настройкам, не требуя написания сложного кода конкатенации.
Бывают ситуации, когда нам нужно, чтобы поле в отчете по-прежнему оставалось датой (для корректной сортировки по хронологии), но пользователь видел его как текст. Для этого в СКД существует свойство «Выражение представления».
Выясним, как это работает. На закладке «Наборы данных» выберите ваше поле даты. В колонке «Выражение представления» напишите конструкцию, аналогичную вычисляемому полю:
"Год: " + Формат(ДатаНачала, "ДФ=гггг")
Теперь в самом отчете пользователь увидит текст «Год: 2018», но если он захочет применить фильтр «Больше» или «Меньше», система будет сравнивать это поле именно как дату, а не как строку. Это критически важно для обеспечения правильной логики работы отчета.
Если отчет уже готов, а пользователь просит добавить такое поле «здесь и сейчас» без изменения конфигурации, мы можем воспользоваться Пользовательскими полями.
Разберем алгоритм действий пользователя в режиме «1С:Предприятие»:
"С " + Формат(ДатаНачала, "ДФ=гггг") + " по " + Формат(ДатаОкончания, "ДФ=гггг").Это поле появится в списке доступных полей, и его можно будет вывести в отчет наравне со стандартными реквизитами.
Мы рассмотрели несколько подходов к решению задачи. Выбор конкретного метода зависит от ваших целей:
Помните, что использование Формат() внутри выражений СКД — это самый надежный способ избежать ошибок типов и получить предсказуемый результат при объединении текста и дат.