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