Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
24 ноя 2024, 12:41

Определение недели по воскресенью

Автор Nosferatu112, 02 авг 2023, 10:42

0 Пользователей и 1 гость просматривают эту тему.

Nosferatu112

Доброго дня, такой вопрос есть такое условие
Считается по всем воскресеньям, попавшим в месяц. Например, если период Июнь 2023, значит таких воскресений по сотруднику может быть не более 4 (04.06, 11.06, 18.06, 25.06). Каждое воскресенье это неделя, считать в ней сколько дней сотрудник был на работе
ВЫБРАТЬ
втСотрудники.Ссылка КАК Сотрудник,
ВозвратПутевогоЛистаЗаявки.Ссылка КАК ВозвратПЛ,
НАЧАЛОПЕРИОДА(ВозвратПутевогоЛистаЗаявки.Ссылка.Дата, ДЕНЬ) КАК Дата,
ДЕНЬНЕДЕЛИ(ВозвратПутевогоЛистаЗаявки.Ссылка.Дата) КАК ДеньНедели
ПОМЕСТИТЬ втНедельнаяПремия
ИЗ
втСотрудники КАК втСотрудники
ЛЕВОЕ СОЕДИНЕНИЕ Документ.ВозвратПутевогоЛиста.Заявки КАК ВозвратПутевогоЛистаЗаявки
ПО втСотрудники.Ссылка = ВозвратПутевогоЛистаЗаявки.Ссылка.Водитель
ГДЕ
ВозвратПутевогоЛистаЗаявки.Ссылка.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания

СГРУППИРОВАТЬ ПО
втСотрудники.Ссылка,
ДЕНЬНЕДЕЛИ(ВозвратПутевогоЛистаЗаявки.Ссылка.Дата),
ВозвратПутевогоЛистаЗаявки.Ссылка,
НАЧАЛОПЕРИОДА(ВозвратПутевогоЛистаЗаявки.Ссылка.Дата, ДЕНЬ)
Написал я вот такую ВТшку в которой есть дни недели как правильно в запросе разграничить эти недели
То есть мне нужно например посчитать сколько возвратов есть в неделе месяца, но при этом расчет будет идти за месяц и нужно как то поделить месяц на 4 недели отсекая (в случае с маем) лишние 3 дня 29,30,31, так как неделя считаеться если в ней есть воскресенье

Максим75

Nosferatu112, вот что сразу приходит, наверняка есть и более красивое решение:

Запустить в цикле пробегать месяц по дням.
Каждый день смотреть номер дня недели. Если воскресенье, то начальной дате присвоить ДатаВЦикле-6, если вываливается за начало месяца, то начало месяца. Конечной дате присвоить дату воскресенья. И в цикле запустить запрос по начальной и конечной дате. Т.е. будет в цикле 4 раза запрос запускаться, просто с разными начальной и конечной датами. Можно каждый результат в ТЗ выгрузить, там уже придумать, что с общей ТЗ делать, или ее как-то обрабатывать, или в запрос и там крутить-вертеть.
Коряво конечно...

Nosferatu112

Максим75, Идея хорошая, но проблема в том (и я этоо не упоминул выше, извеняюсь) что мне нужно сделать 5 расчетов разных начислений в 1 запросе это одно из них, а потом просто готовый результат грузануть с запроса в таблицу то есть все махинации с расчётами нужно провести именно в запросе, я поэтому и задался вопросом как, у меня уже есть 1 подобный запрос из 63 ВТшек просто не дорубаю как с днями недели нахимичить

Максим75

Nosferatu112, если Вам необходимо что-то получить за определенные периоды в одном большом периоде, тогда все-равно придется эти периоды каким-то образом отдельно обрабатывать. Или грузануть в запрос ТЗ, где будет начальная и конечная дата недели (ТЗ предварительно подготовить отдельно), а потом уже соединять данные по периоду, чтобы период был между начальной датой и конечной датой.

Nosferatu112

Максим75, Всё допёр решил проблему, не фелигранно но работает, из таблицы(запрос выше) отобрал в таблицу выходые дни в которые люди работали, отобрал в другую таблицу рабочие в общем часть запроса ниже может кому пригодиться
ВЫБРАТЬ
втСотрудники.Ссылка КАК Сотрудник,
МИНИМУМ(ВозвратПутевогоЛистаЗаявки.Ссылка) КАК ВозвратПЛ,
НАЧАЛОПЕРИОДА(ВозвратПутевогоЛистаЗаявки.Ссылка.Дата, ДЕНЬ) КАК Дата,
ДЕНЬНЕДЕЛИ(ВозвратПутевогоЛистаЗаявки.Ссылка.Дата) КАК ДеньНедели,
НЕДЕЛЯ(ВозвратПутевогоЛистаЗаявки.Ссылка.Дата) КАК Неделя,
ДанныеПроизводственногоКалендаря.ВидДня КАК ВидДня
ПОМЕСТИТЬ втНедельнаяПремия
ИЗ
втСотрудники КАК втСотрудники
ЛЕВОЕ СОЕДИНЕНИЕ Документ.ВозвратПутевогоЛиста.Заявки КАК ВозвратПутевогоЛистаЗаявки
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДанныеПроизводственногоКалендаря КАК ДанныеПроизводственногоКалендаря
ПО (НАЧАЛОПЕРИОДА(ВозвратПутевогоЛистаЗаявки.Ссылка.Дата, ДЕНЬ) = НАЧАЛОПЕРИОДА(ДанныеПроизводственногоКалендаря.Дата, ДЕНЬ))
ПО втСотрудники.Ссылка = ВозвратПутевогоЛистаЗаявки.Ссылка.Водитель
ГДЕ
ВозвратПутевогоЛистаЗаявки.Ссылка.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания

СГРУППИРОВАТЬ ПО
втСотрудники.Ссылка,
ДЕНЬНЕДЕЛИ(ВозвратПутевогоЛистаЗаявки.Ссылка.Дата),
НАЧАЛОПЕРИОДА(ВозвратПутевогоЛистаЗаявки.Ссылка.Дата, ДЕНЬ),
ДанныеПроизводственногоКалендаря.ВидДня,
НЕДЕЛЯ(ВозвратПутевогоЛистаЗаявки.Ссылка.Дата)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
втНедельнаяПремия.Сотрудник КАК Сотрудник,
втНедельнаяПремия.Неделя КАК Неделя,
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ втНедельнаяПремия.ДеньНедели) КАК ДеньНедели
ПОМЕСТИТЬ втНедельнаяПремияВыходные
ИЗ
втНедельнаяПремия КАК втНедельнаяПремия
ГДЕ
(втНедельнаяПремия.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Суббота)
ИЛИ втНедельнаяПремия.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Воскресенье)
ИЛИ втНедельнаяПремия.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Праздник)
ИЛИ втНедельнаяПремия.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Нерабочий))

СГРУППИРОВАТЬ ПО
втНедельнаяПремия.Сотрудник,
втНедельнаяПремия.Неделя
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
втНедельнаяПремия.Сотрудник КАК Сотрудник,
втНедельнаяПремия.Неделя КАК Неделя,
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ втНедельнаяПремия.ДеньНедели) КАК ДеньНедели
ПОМЕСТИТЬ втНедельнаяПремияРабочие
ИЗ
втНедельнаяПремия КАК втНедельнаяПремия
ГДЕ
втНедельнаяПремия.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий)

СГРУППИРОВАТЬ ПО
втНедельнаяПремия.Сотрудник,
втНедельнаяПремия.Неделя
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
втНедельнаяПремияВыходные.Сотрудник КАК Сотрудник,
втНедельнаяПремияВыходные.Неделя КАК Неделя,
втНедельнаяПремияВыходные.ДеньНедели + втНедельнаяПремияРабочие.ДеньНедели КАК ДеньНедели
ПОМЕСТИТЬ втНедельнаяПремияОбщее
ИЗ
втНедельнаяПремияВыходные КАК втНедельнаяПремияВыходные
ЛЕВОЕ СОЕДИНЕНИЕ втНедельнаяПремияРабочие КАК втНедельнаяПремияРабочие
ПО (втНедельнаяПремияВыходные.Сотрудник = втНедельнаяПремияРабочие.Сотрудник)
И (втНедельнаяПремияВыходные.Неделя = втНедельнаяПремияРабочие.Неделя)
;
В последней таблице кол-во дней которые мне как раз и нужны а из за левого соединения присутствуют только отрудники работающие в выходные главное условие задачи

Kvark5d

Nosferatu112, если есть регистр сведений регламентированный производственный календарь то можно так:
ВЫБРАТЬ
    МАКСИМУМ(КОНЕЦПЕРИОДА(РегламентированныйПроизводственныйКалендарь.ДатаКалендаря, ДЕНЬ)) КАК ДатаКалендаря
ПОМЕСТИТЬ ПоследнееВоскресение
ИЗ
    РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
ГДЕ
    РегламентированныйПроизводственныйКалендарь.ДатаКалендаря МЕЖДУ &НачалоПериода И &КонецПериода
    И ДЕНЬНЕДЕЛИ(РегламентированныйПроизводственныйКалендарь.ДатаКалендаря) = 7
;
 ВЫБРАТЬ
    втСотрудники.Ссылка КАК Сотрудник,
    ВозвратПутевогоЛистаЗаявки.Ссылка КАК ВозвратПЛ,
    НАЧАЛОПЕРИОДА(ВозвратПутевогоЛистаЗаявки.Ссылка.Дата, ДЕНЬ) КАК Дата,
    ДЕНЬНЕДЕЛИ(ВозвратПутевогоЛистаЗаявки.Ссылка.Дата) КАК ДеньНедели
ПОМЕСТИТЬ втНедельнаяПремия
ИЗ
    втСотрудники КАК втСотрудники
        ВНУТРЕНЕЕ СОЕДИНЕНИЕ Документ.ВозвратПутевогоЛиста.Заявки КАК ВозвратПутевогоЛистаЗаявки
        ПО втСотрудники.Ссылка = ВозвратПутевогоЛистаЗаявки.Ссылка.Водитель
        ВНУТРЕНЕЕ СОЕДИНЕНИЕ ПоследнееВоскресение КАК ПоследнееВоскресение
        ПО ВозвратПутевогоЛистаЗаявки.Ссылка.Дата <= ПоследнееВоскресение.ДатаКалендаря
ГДЕ
    ВозвратПутевогоЛистаЗаявки.Ссылка.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
СГРУППИРОВАТЬ ПО
    втСотрудники.Ссылка,
    ДЕНЬНЕДЕЛИ(ВозвратПутевогоЛистаЗаявки.Ссылка.Дата),
    ВозвратПутевогоЛистаЗаявки.Ссылка,
    НАЧАЛОПЕРИОДА(ВозвратПутевогоЛистаЗаявки.Ссылка.Дата, ДЕНЬ)

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск