Как развернуть период дат в таблицу по дням в 1С:ЗУП 3.1?

Программист 1С v8.3 (Управляемые формы) 1С:Зарплата и Управление Персоналом Управленческий учет IT и автоматизация бизнеса
← На главную

В процессе разработки специализированных документов или отчетов в 1С:ЗУП 3.1 часто возникает задача преобразовать интервал «ДатаНачала» — «ДатаОкончания» в набор отдельных записей, где для каждого дня периода будет своя строка. Давайте разберем, как реализовать эту задачу профессионально, используя возможности типовой конфигурации.

Использование механизма ЗарплатаКадрыОбщиеНаборыДанных

В конфигурации 1С:ЗУП 3.1 предусмотрен специальный функционал для генерации периодов. Использование метода ЗарплатаКадрыОбщиеНаборыДанных.СоздатьВТПериоды позволяет избежать «ручного» перебора строк в цикле, что значительно повышает производительность и чистоту кода.

Рассмотрим по шагам, как это реализовать в запросе:

  1. Создаем объект МенеджерВременныхТаблиц.
  2. Вызываем метод СоздатьВТПериоды для генерации временной таблицы дат.
  3. Связываем полученную таблицу с данными документа через ЛЕВОЕ СОЕДИНЕНИЕ по условию вхождения даты в интервал.

Пример программного кода для реализации этой задачи:


Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;

// Формируем временную таблицу дат (Календарь)
ЗарплатаКадрыОбщиеНаборыДанных.СоздатьВТПериоды(
    Запрос.МенеджерВременныхТаблиц,
    НачалоДня(ДатаНачала),
    КонецДня(ДатаОкончания),
    "ДЕНЬ",
    "Дата",
    "Календарь");

// Используем сформированную таблицу в основном запросе
Запрос.Текст = 
    "ВЫБРАТЬ
    |    Календарь.Дата КАК Дата,
    |    ОтсутствияСотрудники.Сотрудник КАК Сотрудник
    |ИЗ
    |    Календарь КАК Календарь
    |        ЛЕВОЕ СОЕДИНЕНИЕ Документ.ОтсутствияСотрудники.Сотрудники КАК ОтсутствияСотрудники
    |        ПО (Календарь.Дата >= ОтсутствияСотрудники.ДатаНачала 
    |        И Календарь.Дата <= ОтсутствияСотрудники.ДатаОкончания)
    |ГДЕ
    |    ОтсутствияСотрудники.Ссылка.Проведен";

РезультатЗапроса = Запрос.Выполнить().Выгрузить();

Альтернативный метод: Таблица цифр

Если вам требуется решение, не зависящее от конкретной подсистемы ЗУП, можно воспользоваться универсальным методом «Таблицы цифр». Суть метода заключается в генерации последовательности дат путем сложения чисел с начальной датой.

Для начала создается временная таблица чисел от 0 до 9, после чего через декартово произведение создается диапазон чисел, который прибавляется к начальной дате:


ВЫБРАТЬ 0 КАК Цифра ПОМЕСТИТЬ ТабЦифр ОБЪЕДИНИТЬ ВЫБРАТЬ 1 ... ОБЪЕДИНИТЬ ВЫБРАТЬ 9;

ВЫБРАТЬ
    ДОБАВИТЬКДАТЕ(&ДатаНачала, ДЕНЬ, ТабЦифр1.Цифра + 10 * ТабЦифр2.Цифра + 100 * ТабЦифр3.Цифра) КАК День
ИЗ
    ТабЦифр КАК ТабЦифр1,
    ТабЦифр КАК ТабЦифр2,
    ТабЦифр КАК ТабЦифр3
ГДЕ
    ДОБАВИТЬКДАТЕ(&ДатаНачала, ДЕНЬ, ТабЦифр1.Цифра + 10 * ТабЦифр2.Цифра + 100 * ТабЦифр3.Цифра) <= &ДатаКонца

Важные рекомендации по архитектуре

При работе с такими задачами помните о следующих принципах:

Используя предложенные методы, вы сможете элегантно и эффективно решать задачи по детализации периодов, делая код более читаемым и соответствующим стандартам разработки 1С.

← На главную