Был отчет, в котором к неким датам прибавлялось 15 дней функцией ДобавитьКДате(). Но вот понадобилось добавлять к дате не все дни, а только рабочие. Сделал запрос, может быть кому понадобится
Собственно запрос получился такой:
ВЫБРАТЬ Даты.Дата,
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ РегламентированныйПроизводственныйКалендарь.ДатаКалендаря) КАК КоличествоРабочихДней, МАКСИМУМ(РегламентированныйПроизводственныйКалендарь.ДатаКалендаря) КАК ДатаКалендаря, РегламентированныйПроизводственныйКалендарь1.ДатаКалендаря КАК ДатаКалендаряДляГруппировки ИЗ РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь ВНУТРЕННЕЕ СОЕДИНЕНИЕ Даты КАК Даты ПО (Даты.Дата <= РегламентированныйПроизводственныйКалендарь.ДатаКалендаря) И (ДОБАВИТЬКДАТЕ(Даты.Дата, ДЕНЬ, &ГлубинаДней) > РегламентированныйПроизводственныйКалендарь.ДатаКалендаря) ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь1 ПО РегламентированныйПроизводственныйКалендарь.ДатаКалендаря <= РегламентированныйПроизводственныйКалендарь1.ДатаКалендаря ГДЕ (РегламентированныйПроизводственныйКалендарь.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Предпраздничный) ИЛИ РегламентированныйПроизводственныйКалендарь.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий)) СГРУППИРОВАТЬ ПО РегламентированныйПроизводственныйКалендарь1.ДатаКалендаря, Даты.Дата ИМЕЮЩИЕ МАКСИМУМ(РегламентированныйПроизводственныйКалендарь.ДатаКалендаря) = РегламентированныйПроизводственныйКалендарь1.ДатаКалендаря
Таблица «Даты» может содержать любые данные с датой в виде отдельного поля или в виде реквизита документа. Параметр «ГлубинаДней» определяет, как глубоко вперёд просматривать даты относительно входящих дат.
Вот пример работы для одной даты 28.11.2012
| Дата | КоличествоРабочихДней | ДатаКалендаря | ДатаКалендаряДляГруппировки | |
| 28.11.2012 | 1 | 28.11.2012 | 28.11.2012 | |
| 28.11.2012 | 2 | 29.11.2012 | 29.11.2012 | |
| 28.11.2012 | 3 | 30.11.2012 | 30.11.2012 | |
| 28.11.2012 | 4 | 03.12.2012 | 03.12.2012 | |
| 28.11.2012 | 5 | 04.12.2012 | 04.12.2012 | |
| 28.11.2012 | 6 | 05.12.2012 | 05.12.2012 | |
| 28.11.2012 | 7 | 06.12.2012 | 06.12.2012 | |
| 28.11.2012 | 8 | 07.12.2012 | 07.12.2012 | |
| 28.11.2012 | 9 | 10.12.2012 | 10.12.2012 | |
| 28.11.2012 | 10 | 11.12.2012 | 11.12.2012 | |
| 28.11.2012 | 11 | 12.12.2012 | 12.12.2012 | |
| 28.11.2012 | 12 | 13.12.2012 | 13.12.2012 | |
| 28.11.2012 | 13 | 14.12.2012 | 14.12.2012 | |
| 28.11.2012 | 14 | 17.12.2012 | 17.12.2012 | |
| 28.11.2012 | 15 | 18.12.2012 | 18.12.2012 | |
| 28.11.2012 | 16 | 19.12.2012 | 19.12.2012 | |
| 28.11.2012 | 17 | 20.12.2012 | 20.12.2012 | |
| 28.11.2012 | 18 | 21.12.2012 | 21.12.2012 | |
| 28.11.2012 | 19 | 24.12.2012 | 24.12.2012 | |
| 28.11.2012 | 20 | 25.12.2012 | 25.12.2012 | |
| 28.11.2012 | 21 | 26.12.2012 | 26.12.2012 | |
| 28.11.2012 | 22 | 27.12.2012 | 27.12.2012 |
В конец запроса осталось добавить условие
И КОЛИЧЕСТВО(РАЗЛИЧНЫЕРегламентированныйПроизводственныйКалендарь.ДатаКалендаря) = &РабочихДней
и отобрать данные по нужному количеству рабочих дней в параметре «РабочихДней»
Ну и в конце полная верия запроса, если захочется опробовать в консоли запросов
ВЫБРАТЬ РегламентированныйПроизводственныйКалендарь.ДатаКалендаря КАК Дата ПОМЕСТИТЬ Даты ИЗ РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь ГДЕ РегламентированныйПроизводственныйКалендарь.ДатаКалендаря В(&ВходящиеДаты) ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ Даты.Дата, КОЛИЧЕСТВО(РАЗЛИЧНЫЕ РегламентированныйПроизводственныйКалендарь.ДатаКалендаря) КАК КоличествоРабочихДней, МАКСИМУМ(РегламентированныйПроизводственныйКалендарь.ДатаКалендаря) КАК ДатаКалендаря, РегламентированныйПроизводственныйКалендарь1.ДатаКалендаря КАК ДатаКалендаряДляГруппировки ИЗ РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь ВНУТРЕННЕЕ СОЕДИНЕНИЕ Даты КАК Даты ПО (Даты.Дата <= РегламентированныйПроизводственныйКалендарь.ДатаКалендаря) И (ДОБАВИТЬКДАТЕ(Даты.Дата, ДЕНЬ, &ГлубинаДней) > РегламентированныйПроизводственныйКалендарь.ДатаКалендаря) ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь1 ПО РегламентированныйПроизводственныйКалендарь.ДатаКалендаря <= РегламентированныйПроизводственныйКалендарь1.ДатаКалендаря ГДЕ (РегламентированныйПроизводственныйКалендарь.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Предпраздничный) ИЛИ РегламентированныйПроизводственныйКалендарь.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий)) СГРУППИРОВАТЬ ПО РегламентированныйПроизводственныйКалендарь1.ДатаКалендаря, Даты.Дата ИМЕЮЩИЕ МАКСИМУМ(РегламентированныйПроизводственныйКалендарь.ДатаКалендаря) = РегламентированныйПроизводственныйКалендарь1.ДатаКалендаря И КОЛИЧЕСТВО(РАЗЛИЧНЫЕ РегламентированныйПроизводственныйКалендарь.ДатаКалендаря) = &РабочихДней




И в чём новизна? И здесь, и на других форумах тема широко обсуждалась… Данное решение — самое банальное.
На новизну не претендовал, просто не нашел решение, когда понадобилось. Можно ссылку на обсуждение?
типа так и вариации
Полезная тема.
В том-то и оно, что обсуждалось, типа «Кури …». Тут парень конкретно написал. Я помню раньше еще писал, но потом какое-то время не работал с 1С, сейчас на свое взглянул (а там еще с планом счетов связано), аж паника продернула, вспоминал бы дня два! Спасибо, ооочень выручил, так бы все писали, а не «Кури…»
Идея добавить к дате рабочие дни очень помогла при разработке отчетов, связанных с банковскими днями. Спасибо.
как правильно определить глубину дней чтобы не было слишком много или недостаточно?
Ну здесь дело в праздниках, если взять, например, какое-нибудь 21.12.2012, то глубина 15 дней не достаточна из-за долгих январских праздников — вот только исходя из таких нюансов. Поэтому Глубина = 15 дней + Максимум количества праздников, вот как-то так
новое решение или старое — но мне помогло. Автору спасибо огромное))))
Автору +, жаль для бух 3.0 не подходит)
(11) ilonnaa, а что там не так, регистр календаря что-ли по-другому называется?
(12) Там регистр по другому называется, + производственный календарь это справочник) ну все получилось, чуть запрос переписав, выложить не могу сервер выключился что-то( завтра если не забуду.
оставлю для коллекции вариант для Бух.3
Показать
Идея ок. Но задачка редко стоит просто отсечь празники. Рекомендую брать с графиков работы. Так как бух вряд ли полезет править произв календарь (он заходит правит в графике. а произв календарь виржин) ИМХО
Спасибо Вам большое! Очень помогло быстро сделать необходимый отчет!
ко второму соединению
полезно будет добавить условие типа (отмечено жирным)
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь1
ПО РегламентированныйПроизводственныйКалендарь.ДатаКалендаря <= РегламентированныйПроизводственныйКалендарь1.ДатаКалендаря
И (ДОБАВИТЬКДАТЕ(РегламентированныйПроизводственныйКалендарь.ДатаКалендаря, ДЕНЬ, &ГлубинаДней) > РегламентированныйПроизводственныйКалендарь1.ДатаКалендаря)
иначе много доп сведений (дат) добавляется, которые не очень-то нужны,
разница в скорострельности ощутима на 3-х значениях В (&ВходящиеДаты)
Автору спасибо, очень помогло
Решение действительно простое, но подойти с этой стороны не догадался.Спасибо
Мне одному кажется что не совсем верно считается добавление количество рабочих дней?
Если по запросу установить входящую дату 22.02.2017 и попросить добавить к дате 2 рабочих дня то запрос выдает 27.02.2017.
Ну а должен наверно 28.02.2017
(19) почему 28 то? 22 февраля 2017 (это среда) + два рабочих дня (четверг, пятница) = 22,23,24 февраля. 25 и 26 — выходные дни. Соответственно ближайший день 27 февраля выпадает. Откуда 28 должно быть?
23,24,25,26 февраля — это выходные дни… Соответственно ближайшие два рабочих дня это 27 и 28 число. Тогда даже не 28 а 1 марта….
(20)
да(21) Точно..
(21) в статье есть табличка как пример работы, в ней видно, что сама входящая дата (если это рабочий день) тоже входит в количество добавляемых рабочих дней.
(23)
Понятно. В общем нужно поиграться чтобы получить нужный результат.
В общем работает что-то нет так
08.02.2015 + 7 дней получаю 13.02.2015 хотя явно должно быть 16.02.2015 (это если учитывать начальную дату 08.02.2015)
но эта дата является выходным днем, поэтому учитывать ее нельзя, а в этом случае результатом должен быть 17.02.2015
но ни как не 13.02.2015.
Короче не работает.
а так будет оптимальнее (работает в 10 раз быстрее)
Показать
добавил условие на соединение РегламентированныйПроизводственныйКалендарь1
Вот простое и рабочее решение:
Показать
(27)
А в параметр «&ДатаДляКалендаря» — что, за дату нужно поместить?
(27) Не работает, если ДатаККоторойНужноДобавитьДни — выходной или праздничный лень
(29) Верно. Допилить не сложно для выходных и праздников.
Спасибо. Очень полезная статья!
всё отлично работает пока не переносишь в СКД консоль, там валится с ошибкой
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных, ВнешниеНаборыДанных, ДанныеРасшифровки, Истина);
по причине:
Ошибка компоновки данных
по причине:
Ошибка инициализации
по причине:
Ошибка создания набора данных «НаборДанных1»
по причине:
Ошибка при исполнении запроса набора данных
по причине:
{(53, 72)}: Поле не входит в группу «РегламентированныйПроизводственныйКалендарь1.ДатаКалендаря»
МАКСИМУМ(РегламентированныйПроизводственныйКалендарь.ДатаКалендаря) = <<?>>РегламентированныйПроизводственныйКалендарь1.ДатаКалендаря И
Показать
поправил вот так МАКСИМУМ(РегламентированныйПроизводственныйКалендарь.ДатаКалендаря) = МАКСИМУМ(РегламентированныйПроизводственныйКалендарь1.ДатаКалендаря) И
т.к. ДатаКалендаря совпадает с ДатаКалендаряДляГруппировки в последующем СКД использую ДатаКалендаряДляГруппировки
а вообще автор красавчик сэкономил мне кучу времени и нервов