Предлагаю вам небольшой шаблон, который полезно иметь на руках, для решения различных задач связанных с датами и календарем в случаях, когда "производственный календарь" или "график" отсутствуют в конфигурации или когда использование их накладывает определенные ограничения (необходимость предварительного заполнения на определенный период).
За основу взят известный алгоритм получения чисел от 0 до 9999 в запросе, суть которого заключается в том, чтобы перемножить таблицы, содержащие цифры от 0 до 9, столько раз, сколько порядков вам требуется в итоговом максимальном числе. Например для получения последовательности цифр от 0 до 9999 - вам потребуется соединить 4 таблицы (как в примере).
Также добавлены дополнительные запросы, позволяющие определить название месяца, дня недели и является ли день стандартным выходным. Конечно, все это можно определить при выводе результата через СКД, но в данном случае это добавлено "на свякий случай", когда использование СКД не представляется возможным или целесообразным.
"ТаблицаМесяцев" - таблица, содержащая наименование месяцев.
"ТаблицаДнейНедели" - таблица, содержащая наименование дней недели и признак выходного дня.
"ТаблицаЦифр", "ТаблицаЧисел" - служебные таблицы, используемые для последующего построения таблицы "Календарь".
"Календарь" - таблица, содержащая непоследственно список дат за определенный период.
Результирующая таблица - фактически тот самый производственный каледнарь, за исключением праздников.
Сам запрос:
ВЫБРАТЬ
"Январь" КАК НазваниеМесяца,
1 КАК НомерМесяца
ПОМЕСТИТЬ ТаблицаМесяцев
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"Февраль",
2
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"Март",
3
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"Апрель",
4
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"Май",
5
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"Июнь",
6
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"Июль",
7
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"Август",
8
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"Сентябрь",
9
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"Октябрь",
10
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"Ноябрь",
11
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"Декабрь",
12
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
"Понедельник" КАК ДеньНедели,
"Пн" КАК ДеньНеделиСокращено,
1 КАК НомерДняНедели,
ЛОЖЬ КАК СтандартныйВыходной
ПОМЕСТИТЬ ТаблицаДнейНедели
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"Вторник",
"Вт",
2,
ЛОЖЬ
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"Среда",
"Ср",
3,
ЛОЖЬ
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"Четверг",
"Чт",
4,
ЛОЖЬ
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"Пятница",
"Пт",
5,
ЛОЖЬ
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"Суббота",
"Сб",
6,
ИСТИНА
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"Воскресенье",
"Вс",
7,
ИСТИНА
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
0 КАК Цифра
ПОМЕСТИТЬ ТаблицаЦифр
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
1
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
2
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
3
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
4
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
5
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
6
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
7
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
8
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
9
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ТаблицаЦифрДляТысяч.Цифра * 1000 + ТаблицаЦифрДляСотен.Цифра * 100 + ТаблицаЦифрДляДесятков.Цифра * 10 + ТаблицаЦифрДляЕдиниц.Цифра КАК Число
ПОМЕСТИТЬ ТаблицаЧисел
ИЗ
ТаблицаЦифр КАК ТаблицаЦифрДляЕдиниц,
ТаблицаЦифр КАК ТаблицаЦифрДляДесятков,
ТаблицаЦифр КАК ТаблицаЦифрДляСотен,
ТаблицаЦифр КАК ТаблицаЦифрДляТысяч
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(&НачПериода, ДЕНЬ, ТаблицаЧисел.Число) КАК Дата
ПОМЕСТИТЬ Календарь
ИЗ
ТаблицаЧисел КАК ТаблицаЧисел
ГДЕ
ДОБАВИТЬКДАТЕ(&НачПериода, ДЕНЬ, ТаблицаЧисел.Число) <= &КонПериода
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ТаблицаМесяцев.НазваниеМесяца КАК Месяц,
Календарь.Дата КАК ДатаКалендаря,
ТаблицаДнейНедели.ДеньНедели КАК ДеньНедели,
ТаблицаДнейНедели.ДеньНеделиСокращено КАК ДеньНеделиСокращено,
ТаблицаДнейНедели.СтандартныйВыходной КАК СтандартныйВыходной
ИЗ
Календарь КАК Календарь
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаМесяцев КАК ТаблицаМесяцев
ПО (МЕСЯЦ(Календарь.Дата) = ТаблицаМесяцев.НомерМесяца)
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаДнейНедели КАК ТаблицаДнейНедели
ПО (ДЕНЬНЕДЕЛИ(Календарь.Дата) = ТаблицаДнейНедели.НомерДняНедели)
УПОРЯДОЧИТЬ ПО
ДатаКалендаря