Доброго времени суток Всем читающим! Уважаемые, возник такой вопрос, допиливаю ЗУП 3.0 для упр учета, и возникла такая ситуация, в компании используются аттестации, необходимо их назначать программно, но возникла такая ситуация, до прибавить то дни или месяцы не проблема, но дата аттестации может вытечь на выходной, и возник вопрос как можно получить первую рабочую дату после выходного или праздничного дня?
По теме из базы знаний
- Адаптивный рабочий стол из SVG с вкладками и анимацией от kuzkov.info
- Как я неожиданно для себя стал руководителем
- Как мы перестали нанимать готовых программистов, и как это повлияло на зарабатывание денег
- Адекватность работодателя. Как её определить? Часть 2. Процесс работы, от испытательного срока до увольнения
- Сказ о папочке в декрете и о том, как получить от государства до 1 200 000 рублей
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
у нас используется следующий "костыль":
// Функция возвращает дату отстоящую на заданное количество рабочих дней от начальной в соответствии с
// регламентированным производственным календарем
//
// Параметры:
// ДатаНач - начальная дата
// ЧислоДней - количество рабочих дней, на которое искомая дата должна отстоять от начальной
//
Функция ПолучитьРабочийДеньНедели(ДатаНач,ЧислоДней) Экспорт
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("ДатаНач", ДатаНач);
Запрос.УстановитьПараметр("ЧислоДней", ЧислоДней);
Запрос.УстановитьПараметр("РабочийДень", Перечисления.ВидыДнейПроизводственногоКалендаря.Рабочий);
Запрос.УстановитьПараметр("ПредпраздничныйДень", Перечисления.ВидыДнейПроизводственногоКалендаря.Предпраздничный);
Если ЧислоДней > 0 Тогда
Запрос.Текст = "
|ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ " + ЧислоДней + "
| РегламентированныйПроизводственныйКалендарь.ДатаКалендаря
|ИЗ
| РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
|ГДЕ РегламентированныйПроизводственныйКалендарь.ДатаКалендаря > &ДатаНач
| И (РегламентированныйПроизводственныйКалендарь.ВидДня = &РабочийДень
| ИЛИ РегламентированныйПроизводственныйКалендарь.ВидДня = &ПредпраздничныйДень)
|";
Иначе
ЧислоДней = -ЧислоДней;
Запрос.Текст = "
|ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ " + ЧислоДней + "
| РегламентированныйПроизводственныйКалендарь.ДатаКалендаря
|ИЗ
| РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
|ГДЕ РегламентированныйПроизводственныйКалендарь.ДатаКалендаря < &ДатаНач
| И (РегламентированныйПроизводственныйКалендарь.ВидДня = &РабочийДень
| ИЛИ РегламентированныйПроизводственныйКалендарь.ВидДня = &ПредпраздничныйДень)
|УПОРЯДОЧИТЬ ПО
| ДатаКалендаря УБЫВ
|";
КонецЕсли;
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Количество() > 0 Тогда
Пока Выборка.Следующий() Цикл
ТекДата = Выборка.ДатаКалендаря;
КонецЦикла;
Возврат ТекДата;
КонецЕсли;
Возврат Неопределено;
КонецФункции
Показать
Пока получилось вот так вот:
в итоге получаем необходимую дату.
ВЫБРАТЬ
ДанныеПроизводственногоКалендаря.ПроизводственныйКалендарь,
ДанныеПроизводственногоКалендаря.Год,
ВЫБОР
КОГДА ДанныеПроизводственногоКалендаря.ВидДня <> ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий)
ТОГДА 0
ИНАЧЕ ДанныеПроизводственногоКалендаря.ВидДня
КОНЕЦ КАК Поле1,
ДанныеПроизводственногоКалендаря.ДатаПереноса,
ДанныеПроизводственногоКалендаря.Дата
ПОМЕСТИТЬ Вт1
ИЗ
РегистрСведений.ДанныеПроизводственногоКалендаря КАК ДанныеПроизводственногоКалендаря
ГДЕ
ДанныеПроизводственногоКалендаря.ПроизводственныйКалендарь = &ПроизводственныйКалендарь
И ДанныеПроизводственногоКалендаря.Дата >= &ДатаАтт
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ ПЕРВЫЕ 1
Вт1.ПроизводственныйКалендарь,
Вт1.Год,
Вт1.Поле1,
Вт1.ДатаПереноса,
Вт1.Дата
ИЗ
Вт1 КАК Вт1
ГДЕ
Вт1.Поле1 <> 0
Показатьв итоге получаем необходимую дату.
(7)
Немного доработал текст для бухгалтерии с учетом добавления упущенного вида дня: Предпраздничный
Немного доработал текст для бухгалтерии с учетом добавления упущенного вида дня: Предпраздничный
ВЫБРАТЬ
ДанныеПроизводственногоКалендаря.ПроизводственныйКалендарь КАК ПроизводственныйКалендарь,
ДанныеПроизводственногоКалендаря.Год КАК Год,
ВЫБОР
КОГДА ДанныеПроизводственногоКалендаря.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий)
ТОГДА ДанныеПроизводственногоКалендаря.ВидДня
ИНАЧЕ ВЫБОР
КОГДА ДанныеПроизводственногоКалендаря.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Предпраздничный)
ТОГДА ДанныеПроизводственногоКалендаря.ВидДня
ИНАЧЕ 0
КОНЕЦ
КОНЕЦ КАК ВидДня,
ДанныеПроизводственногоКалендаря.ДатаПереноса КАК ДатаПереноса,
ДанныеПроизводственногоКалендаря.Дата КАК Дата
ПОМЕСТИТЬ ВТ
ИЗ
РегистрСведений.ДанныеПроизводственногоКалендаря КАК ДанныеПроизводственногоКалендаря
ГДЕ
ДанныеПроизводственногоКалендаря.ПроизводственныйКалендарь = &ПроизводственныйКалендарь
И ДанныеПроизводственногоКалендаря.Дата > &Дата
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1
ВТ.Дата КАК Дата
ИЗ
ВТ КАК ВТ
ГДЕ
ВТ.ВидДня <> 0
Показать
В качестве дополнения, запрос для получения последнего рабочего дня предшествующего переданному в параметр:
ВЫБРАТЬ
ВЫБОР
КОГДА ДанныеПроизводственногоКалендаря.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий)
ТОГДА ДанныеПроизводственногоКалендаря.ВидДня
ИНАЧЕ ВЫБОР
КОГДА ДанныеПроизводственногоКалендаря.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Предпраздничный)
ТОГДА ДанныеПроизводственногоКалендаря.ВидДня
ИНАЧЕ 0
КОНЕЦ
КОНЕЦ КАК ВидДня,
ДанныеПроизводственногоКалендаря.Дата КАК Дата
ПОМЕСТИТЬ ВТ
ИЗ
РегистрСведений.ДанныеПроизводственногоКалендаря КАК ДанныеПроизводственногоКалендаря
ГДЕ
ДанныеПроизводственногоКалендаря.ПроизводственныйКалендарь = &ПроизводственныйКалендарь
И ДанныеПроизводственногоКалендаря.Дата МЕЖДУ ДОБАВИТЬКДАТЕ(&Дата, День, -15) И ДОБАВИТЬКДАТЕ(&Дата, ДЕНЬ, -1)
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1
ВТ.Дата КАК Дата
ИЗ
ВТ КАК ВТ
ГДЕ
ВТ.ВидДня <> 0
УПОРЯДОЧИТЬ ПО
ВТ.Дата УБЫВ
Показать
а почему так нельзя, как ниже ?
или это для 3.1 ;)
ВЫБРАТЬ
МИНИМУМ(ДанныеПроизводственногоКалендаря.Дата) КАК Дата
ИЗ
РегистрСведений.ДанныеПроизводственногоКалендаря КАК ДанныеПроизводственногоКалендаря
ГДЕ
ДанныеПроизводственногоКалендаря.Дата МЕЖДУ НАЧАЛОПЕРИОДА(&Дата, МЕСЯЦ) И КОНЕЦПЕРИОДА(&Дата, МЕСЯЦ)
И ДанныеПроизводственногоКалендаря.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий)
или это для 3.1 ;)
ВЫБРАТЬ
МИНИМУМ(ДанныеПроизводственногоКалендаря.Дата) КАК Дата
ИЗ
РегистрСведений.ДанныеПроизводственногоКалендаря КАК ДанныеПроизводственногоКалендаря
ГДЕ
ДанныеПроизводственногоКалендаря.Дата МЕЖДУ НАЧАЛОПЕРИОДА(&Дата, МЕСЯЦ) И КОНЕЦПЕРИОДА(&Дата, МЕСЯЦ)
И ДанныеПроизводственногоКалендаря.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий)
(13)
По вашему запросу:
Дата = 24.02.2021 Результат = 01.02.2021. - начало месяца
Дата = 15.03.2021 Результат = 01.03.2021. - начало месяца
По моему запросу:
Дата = 24.02.2021 Результат = 20.02.2021. - предыдущий рабочий день (суббота, предпраздничный)
Дата = 15.03.2021 Результат = 12.03.2021. - предыдущий рабочий день (пятница)
ВЫБРАТЬ
МИНИМУМ(ДанныеПроизводственногоКалендаря.Дата) КАК Дата
ИЗ
РегистрСведений.ДанныеПроизводственногоКалендаря КАК ДанныеПроизводственногоКалендаря
ГДЕ
ДанныеПроизводственногоКалендаря.Дата МЕЖДУ НАЧАЛОПЕРИОДА(&Дата, МЕСЯЦ) И КОНЕЦПЕРИОДА(&Дата, МЕСЯЦ)
И ДанныеПроизводственногоКалендаря.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий)
МИНИМУМ(ДанныеПроизводственногоКалендаря.Дата) КАК Дата
ИЗ
РегистрСведений.ДанныеПроизводственногоКалендаря КАК ДанныеПроизводственногоКалендаря
ГДЕ
ДанныеПроизводственногоКалендаря.Дата МЕЖДУ НАЧАЛОПЕРИОДА(&Дата, МЕСЯЦ) И КОНЕЦПЕРИОДА(&Дата, МЕСЯЦ)
И ДанныеПроизводственногоКалендаря.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий)
По вашему запросу:
Дата = 24.02.2021 Результат = 01.02.2021. - начало месяца
Дата = 15.03.2021 Результат = 01.03.2021. - начало месяца
По моему запросу:
Дата = 24.02.2021 Результат = 20.02.2021. - предыдущий рабочий день (суббота, предпраздничный)
Дата = 15.03.2021 Результат = 12.03.2021. - предыдущий рабочий день (пятница)
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот