Как добавить части дат (год, месяц, день) для вычисляемого поля в СКД?

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

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

Почему для вычисляемых полей не создается иерархия дат?

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

Рассмотрим по шагам основные способы решения этой задачи, от простого к самому правильному с точки зрения производительности.

Способ 1. Ручное создание иерархии через «Путь к данным»

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

Допустим, наше основное вычисляемое поле называется ДатаВыхода. Чтобы у него появился «плюсик», проделаем следующие действия:

  1. Создадим новое вычисляемое поле.
  2. В колонке Путь к данным укажем значение через точку: ДатаВыхода.Год.
  3. В колонке Выражение напишем формулу: ГОД(ДатаВыхода).
  4. Аналогично добавим другие периоды: ДатаВыхода.Месяц с выражением МЕСЯЦ(ДатаВыхода), ДатаВыхода.НачалоКвартала с выражением НАЧАЛОПЕРИОДА(ДатаВыхода, "КВАРТАЛ") и так далее.

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


// В поле ДатаВыхода.Год выражение будет:
ГОД(ДобавитьКДате(ДатаДокумента, "Месяц", 1))

// В поле ДатаВыхода.НачалоМесяца:
НАЧАЛОПЕРИОДА(ДобавитьКДате(ДатаДокумента, "Месяц", 1), "МЕСЯЦ")

Способ 2. Использование функций общего модуля

Чтобы не дублировать сложный программный код в нескольких вычисляемых полях (как в способе выше), лучше всего вынести логику расчета в общий модуль. Это сделает отчет более надежным и удобным в поддержке.

Выполним следующие шаги:

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

Функция ПолучитьДатуСобытия(ИсходнаяДата, ПараметрСмещения) Экспорт
    // Здесь ваша сложная логика
    Возврат ДобавитьКДате(ИсходнаяДата, "ДЕНЬ", ПараметрСмещения);
КонецФункции

Теперь в СКД на вкладке «Вычисляемые поля» мы можем использовать эту функцию для создания иерархии:

Преимущество: При изменении логики расчета даты вам достаточно будет поправить код только в одном месте — в общем модуле.

Способ 3. Перенос логики в текст запроса (Рекомендуемый)

Как показывает практика, использование вычисляемых полей для сложных расчетов дат может замедлять формирование отчета, так как расчет происходит построчно после получения данных из СУБД. Проанализируем возможность переноса вычислений в сам Набор данных - запрос.

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

Например, вместо вычисляемого поля в СКД, используйте конструкцию в запросе:


ВЫБРАТЬ
    ДОБАВИТЬКДАТЕ(Продажи.Период, МЕСЯЦ, 1) КАК ДатаСледующегоПланирования,
    ...
ИЗ
    РегистрНакопления.Продажи КАК Продажи

В этом случае поле ДатаСледующегоПланирования сразу получит заветный «плюсик» в настройках компоновки.

Дополнительные настройки оформления

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

В колонке Оформление вычисляемого поля можно задать параметр Формат. Например:

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

Резюме

Подведем итог. Если вы обнаружили, что у вычисляемого поля типа Дата отсутствует выбор частей дат, у вас есть три пути:

  1. Быстрый: Прописать дочерние поля вручную в колонке «Путь к данным» через точку.
  2. Масштабируемый: Вынести расчет даты в общий модуль и обращаться к нему в выражениях СКД.
  3. Оптимальный: Постараться реализовать расчет даты внутри запроса, чтобы использовать встроенные механизмы платформы 1С.

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

← На главную