Часто при разработке динамических списков возникает потребность отобразить все дни недели, даже если по ним нет записей в основной таблице (например, в заказах клиентов). Если в конфигурации отсутствует регистр сведений ПроизводственныйКалендарь, стандартные механизмы получения списка дат становятся недоступными. Рассмотрим, как решить эту задачу с помощью средств языка запросов.
Самый прямой способ получить фиксированный набор из 7 дат — это «сконструировать» таблицу вручную. Мы можем использовать оператор ОБЪЕДИНИТЬ, чтобы создать виртуальный источник данных, содержащий только даты текущей недели.
Для реализации этого метода мы вычисляем дату начала периода и последовательно прибавляем к ней смещения от 0 до 6 дней, а также отрицательные значения, чтобы покрыть всю неделю. Затем, с помощью фильтра ГДЕ НЕДЕЛЯ(Дата) = НЕДЕЛЯ(&ТекущаяДата), мы отсекаем лишние записи.
Рассмотрим пример кода для такого запроса:
ВЫБРАТЬ
ВЗ_ДниНедели.ДеньНедели
ИЗ (
ВЫБРАТЬ НАЧАЛОПЕРИОДА(&ТекущаяДата, ДЕНЬ) КАК ДеньНедели
ОБЪЕДИНИТЬ ВЫБРАТЬ ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ТекущаяДата, ДЕНЬ), ДЕНЬ, 1)
ОБЪЕДИНИТЬ ВЫБРАТЬ ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ТекущаяДата, ДЕНЬ), ДЕНЬ, 2)
ОБЪЕДИНИТЬ ВЫБРАТЬ ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ТекущаяДата, ДЕНЬ), ДЕНЬ, 3)
ОБЪЕДИНИТЬ ВЫБРАТЬ ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ТекущаяДата, ДЕНЬ), ДЕНЬ, 4)
ОБЪЕДИНИТЬ ВЫБРАТЬ ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ТекущаяДата, ДЕНЬ), ДЕНЬ, 5)
ОБЪЕДИНИТЬ ВЫБРАТЬ ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ТекущаяДата, ДЕНЬ), ДЕНЬ, 6)
) КАК ВЗ_ДниНедели
Этот запрос возвращает ровно 7 записей, которые можно использовать в ЛЕВОМ СОЕДИНЕНИИ с основной таблицей вашего документа. Таким образом, в динамическом списке даже для дней без документов будут выведены пустые строки, что позволит сохранить целостность группировки.
Если вы хотите избежать громоздких объединений, можно воспользоваться функционалом платформы для вычисления дат начала недели. Это удобно, если необходимо динамически формировать заголовки или значения колонок.
Используйте функцию НАЧАЛОПЕРИОДА с параметром НЕДЕЛЯ:
ВЫБРАТЬ
НАЧАЛОПЕРИОДА(&ТекущаяДата, НЕДЕЛЯ) КАК Понедельник,
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ТекущаяДата, НЕДЕЛЯ), ДЕНЬ, 1) КАК Вторник,
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ТекущаяДата, НЕДЕЛЯ), ДЕНЬ, 2) КАК Среда
// и так далее до конца недели
При работе с динамическими списками важно учитывать производительность. Если ручные объединения кажутся вам избыточными, обратите внимание на следующие советы:
ТаблицуЗначений, заполните её семью датами и передайте в динамический список как параметр запроса. Это самый чистый способ с точки зрения сопровождения кода.СКД. Если вам нужно просто сгруппировать данные по дням, возможно, достаточно настроить группировку непосредственно в настройках самого динамического списка, указав НАЧАЛОПЕРИОДА(Дата, ДЕНЬ) как группировочное поле.Выбор метода зависит от того, насколько гибким должен быть запрос. Для простых задач вполне достаточно метода с ОБЪЕДИНИТЬ, но для крупных проектов рекомендуем выносить генерацию дат в код сервера 1С.