В процессе разработки специализированных документов или отчетов в 1С:ЗУП 3.1 часто возникает задача преобразовать интервал «ДатаНачала» — «ДатаОкончания» в набор отдельных записей, где для каждого дня периода будет своя строка. Давайте разберем, как реализовать эту задачу профессионально, используя возможности типовой конфигурации.
В конфигурации 1С:ЗУП 3.1 предусмотрен специальный функционал для генерации периодов. Использование метода ЗарплатаКадрыОбщиеНаборыДанных.СоздатьВТПериоды позволяет избежать «ручного» перебора строк в цикле, что значительно повышает производительность и чистоту кода.
Рассмотрим по шагам, как это реализовать в запросе:
МенеджерВременныхТаблиц.СоздатьВТПериоды для генерации временной таблицы дат.ЛЕВОЕ СОЕДИНЕНИЕ по условию вхождения даты в интервал.Пример программного кода для реализации этой задачи:
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
// Формируем временную таблицу дат (Календарь)
ЗарплатаКадрыОбщиеНаборыДанных.СоздатьВТПериоды(
Запрос.МенеджерВременныхТаблиц,
НачалоДня(ДатаНачала),
КонецДня(ДатаОкончания),
"ДЕНЬ",
"Дата",
"Календарь");
// Используем сформированную таблицу в основном запросе
Запрос.Текст =
"ВЫБРАТЬ
| Календарь.Дата КАК Дата,
| ОтсутствияСотрудники.Сотрудник КАК Сотрудник
|ИЗ
| Календарь КАК Календарь
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.ОтсутствияСотрудники.Сотрудники КАК ОтсутствияСотрудники
| ПО (Календарь.Дата >= ОтсутствияСотрудники.ДатаНачала
| И Календарь.Дата <= ОтсутствияСотрудники.ДатаОкончания)
|ГДЕ
| ОтсутствияСотрудники.Ссылка.Проведен";
РезультатЗапроса = Запрос.Выполнить().Выгрузить();
Если вам требуется решение, не зависящее от конкретной подсистемы ЗУП, можно воспользоваться универсальным методом «Таблицы цифр». Суть метода заключается в генерации последовательности дат путем сложения чисел с начальной датой.
Для начала создается временная таблица чисел от 0 до 9, после чего через декартово произведение создается диапазон чисел, который прибавляется к начальной дате:
ВЫБРАТЬ 0 КАК Цифра ПОМЕСТИТЬ ТабЦифр ОБЪЕДИНИТЬ ВЫБРАТЬ 1 ... ОБЪЕДИНИТЬ ВЫБРАТЬ 9;
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(&ДатаНачала, ДЕНЬ, ТабЦифр1.Цифра + 10 * ТабЦифр2.Цифра + 100 * ТабЦифр3.Цифра) КАК День
ИЗ
ТабЦифр КАК ТабЦифр1,
ТабЦифр КАК ТабЦифр2,
ТабЦифр КАК ТабЦифр3
ГДЕ
ДОБАВИТЬКДАТЕ(&ДатаНачала, ДЕНЬ, ТабЦифр1.Цифра + 10 * ТабЦифр2.Цифра + 100 * ТабЦифр3.Цифра) <= &ДатаКонца
При работе с такими задачами помните о следующих принципах:
Календарь работает достаточно быстро, но избегайте избыточного количества записей в исходных данных, чтобы не допустить взрывного роста выборки (декартового произведения).Видов использования рабочего времени и документов Отсутствие (неявка). Прямое вмешательство в табель является крайним методом и может усложнить поддержку системы при обновлении.Используя предложенные методы, вы сможете элегантно и эффективно решать задачи по детализации периодов, делая код более читаемым и соответствующим стандартам разработки 1С.