Как объединить текст и даты в полях отчета СКД 1С?

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

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

В этой статье мы подробно разберем, почему не получается объединить данные в запросе, и рассмотрим несколько эффективных способов решения этой задачи средствами СКД.

Почему нельзя объединить текст и дату в запросе?

Давайте проанализируем ситуацию. В языке запросов 1С конкатенация строк возможна только для строковых типов данных. Если мы попытаемся написать в конструкторе запроса конструкцию:

"С " + ТЧ.ДатаНачала + " по " + ТЧ.ДатаОкончания

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

Способ 1: Использование вычисляемых полей

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

Разберем по шагам, как это реализовать:

  1. Откройте схему компоновки данных и перейдите на закладку «Вычисляемые поля».
  2. Добавьте новое поле. Назовем его, например, ПериодСтрокой.
  3. В колонке «Путь к данным» укажите имя, которое будет отображаться в настройках (например, ПериодДляПечати).
  4. В колонке «Выражение» напишите формулу объединения.

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

"С " + Формат(ДатаНачала, "ДФ=гггг") + " по " + Формат(ДатаОкончания, "ДФ=гггг")

Разберем функции, которые мы использовали. Функция Формат() в СКД работает аналогично одноименной функции в языке 1С. Параметр "ДФ=гггг" указывает системе, что из даты нужно извлечь только четырехзначный год. Если вы хотите вывести полную дату, используйте формат "ДФ=dd.MM.yyyy".

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


Выбор 
    Когда ЗначениеЗаполнено(ДатаНачала) И ЗначениеЗаполнено(ДатаОкончания) 
    Тогда "С " + Формат(ДатаНачала, "ДФ=гггг") + " по " + Формат(ДатаОкончания, "ДФ=гггг")
    Иначе "Период не определен" 
Конец

Способ 2: Использование шаблонов в макетах оформления

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

Рассмотрим порядок действий:

  1. Перейдите на закладку «Макеты».
  2. Нажмите «Добавить макет поля». Выберите поле, которое хотите оформить (или создайте область макета для группировки).
  3. В ячейке макета напишите текст шаблона, заключая имена полей в квадратные скобки: С [ДатаНачала] по [ДатаОкончания].
  4. В свойствах этой ячейки в параметре «Заполнение» выберите значение «Шаблон».
  5. Ниже, в параметрах макета, для каждого поля (ДатаНачала и ДатаОкончания) вы можете отдельно задать формат (например, ДФ=гггг).

Этот метод удобен тем, что СКД сама подставит значения в текст и отформатирует их согласно вашим настройкам, не требуя написания сложного кода конкатенации.

Способ 3: Выражение представления

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

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

"Год: " + Формат(ДатаНачала, "ДФ=гггг")

Теперь в самом отчете пользователь увидит текст «Год: 2018», но если он захочет применить фильтр «Больше» или «Меньше», система будет сравнивать это поле именно как дату, а не как строку. Это критически важно для обеспечения правильной логики работы отчета.

Способ 4: Пользовательские поля (в режиме Предприятие)

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

Разберем алгоритм действий пользователя в режиме «1С:Предприятие»:

  1. Зайдите в настройки отчета (кнопка «Настройки» или «Изменить вариант»).
  2. Перейдите на вкладку «Пользовательские поля».
  3. Нажмите «Добавить» -> «Новое поле-выражение».
  4. В заголовке укажите «Период», а в выражении детальных записей напишите уже знакомую нам формулу: "С " + Формат(ДатаНачала, "ДФ=гггг") + " по " + Формат(ДатаОкончания, "ДФ=гггг").

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

Резюме и рекомендации

Мы рассмотрели несколько подходов к решению задачи. Выбор конкретного метода зависит от ваших целей:

Помните, что использование Формат() внутри выражений СКД — это самый надежный способ избежать ошибок типов и получить предсказуемый результат при объединении текста и дат.

← На главную