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