Имя: Пароль:
1C
1С v8
Прибавить рабочие дни к дате в запросе.
,
0 MAPATNK2
 
naïve
21.04.22
17:08
Заезженная тема, но после нескольких дней работы, не нашел ни одного рабочего метода, который подошел бы под моей запрос и работал в СКД.
Единственный подходящий вариант, но у него есть косяк, прибавить рабочие дни можно только к рабочим дням. А у меня некоторые входящие документы делаются в выходные.
Может кто знает, как его доработать?







///////////////////////////
ВЫБРАТЬ
    &ДатаККоторойНужноДобавитьДни КАК Дата,
    &КоличествоДней КАК КоличествоДней
ПОМЕСТИТЬ втДаты
;

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

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
    ДанныеКалендаря1.Дата,
    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ДанныеКалендаря2.Дата) КАК Индекс
ПОМЕСТИТЬ втДанныеКалендаряСИндексами
ИЗ
    втДанныеКалендаря КАК ДанныеКалендаря1
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ втДанныеКалендаря КАК ДанныеКалендаря2
        ПО ДанныеКалендаря1.Дата >= ДанныеКалендаря2.Дата

СГРУППИРОВАТЬ ПО
    ДанныеКалендаря1.Дата

ИНДЕКСИРОВАТЬ ПО
    Индекс
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
    ВТ.Дата,
    ВТ.КоличествоДней,
    ДанныеКалендаря.Индекс КАК Индекс
ПОМЕСТИТЬ втДатыСИндексами
ИЗ
    втДаты КАК ВТ
        ЛЕВОЕ СОЕДИНЕНИЕ втДанныеКалендаряСИндексами КАК ДанныеКалендаря
        ПО ВТ.Дата = ДанныеКалендаря.Дата
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
    Даты.Дата,
    ДанныеКалендаря.Дата КАК ДатаПослеДобавленияДней
ИЗ
    втДатыСИндексами КАК Даты
        ЛЕВОЕ СОЕДИНЕНИЕ втДанныеКалендаряСИндексами КАК ДанныеКалендаря
        ПО (ДанныеКалендаря.Индекс - Даты.Индекс = Даты.КоличествоДней)
1 Philix
 
21.04.22
17:37
Первый запрос переписать на выборку ближайшей рабочей даты. Примерно так:

ВЫБРАТЬ ПЕРВЫЕ 1
    ДанныеКалендаря.Дата как Дата,
    &КоличествоДней КАК КоличествоДней
ПОМЕСТИТЬ втДаты
ИЗ
    РегистрСведений.ДанныеПроизводственногоКалендаря КАК ДанныеКалендаря
ГДЕ
    ДанныеКалендаря.ПроизводственныйКалендарь.Код = "РФ"
    И (ДанныеКалендаря.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий)
            ИЛИ ДанныеКалендаря.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Предпраздничный))
    И ДанныеКалендаря.Дата >= &ДатаККоторойНужноДобавитьДни
УПОРЯДОЧИТЬ ПО  ДанныеКалендаря.Дата
2 MAPATNK2
 
naïve
21.04.22
17:39
(1) а в таком случае разве расчеты будут верными?
3 Philix
 
21.04.22
17:50
Если я правильно понял логику, то что-то должно произойти через Х рабочих дней после получения документа. Если документ получен в выходной, то считаем что он получен в ближайший предстоящий рабочий день. Первым запросом мы преобразуем фактическую дату получения документа в ближайшую рабочую дату. А дальше - все как и было.
Прогнал его на 16-04-2022 - вроде нормально выглядит: +9 дней угоняют на 29 апреля 2022, +10 дней - на 4 мая 2022
4 MAPATNK2
 
naïve
21.04.22
18:11
(3) ок, спасибо, обдумаю.
5 MAPATNK2
 
naïve
21.04.22
18:20
(3) Скорей всего такой вариант не подойдет.
У меня в 1 запросе моя выборка. И если её связывать с регистром календаря и писать ВЫБРАТЬ ПЕРВЫЕ 1. Получаю некорректные результаты.
6 MAPATNK2
 
naïve
21.04.22
18:22
ВЫБРАТЬ РАЗРЕШЕННЫЕ
    ВложенныйЗапрос.Организация КАК Организация,
    ВложенныйЗапрос.Контрагент КАК Контрагент,
    ВложенныйЗапрос.ДоговорКонтрагента КАК ДоговорКонтрагента,
    ВложенныйЗапрос.ДокументРасчетов КАК ДокументРасчетов,
    ВложенныйЗапрос.Сделка КАК Сделка,
    ВложенныйЗапрос.Регистратор КАК Регистратор,
    ВложенныйЗапрос.СуммаУпрНачальныйОстаток КАК СуммаУпрНачальныйОстаток,
    ВложенныйЗапрос.СуммаРегНачальныйОстаток КАК СуммаРегНачальныйОстаток,
    ВложенныйЗапрос.СуммаУпрПриход КАК СуммаУпрПриход,
    ВложенныйЗапрос.СуммаРегПриход КАК СуммаРегПриход,
    ВложенныйЗапрос.СуммаУпрРасход КАК СуммаУпрРасход,
    ВложенныйЗапрос.СуммаРегРасход КАК СуммаРегРасход,
    ВложенныйЗапрос.СуммаУпрКонечныйОстаток КАК СуммаУпрКонечныйОстаток,
    ВложенныйЗапрос.СуммаРегКонечныйОстаток КАК СуммаРегКонечныйОстаток,
    ВложенныйЗапрос.ДоговорКонтрагента.ДопустимоеЧислоДнейЗадолженности КАК КоличествоДней,
    НАЧАЛОПЕРИОДА(ВложенныйЗапрос.ДокументРасчетов.Дата, ДЕНЬ) КАК Дата
ПОМЕСТИТЬ втДаты

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ДанныеКалендаря1.ДатаКалендаря,
    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ДанныеКалендаря2.ДатаКалендаря) КАК Индекс
ПОМЕСТИТЬ втДанныеКалендаряСИндексами
ИЗ
    втДанныеКалендаря КАК ДанныеКалендаря1
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ втДанныеКалендаря КАК ДанныеКалендаря2
        ПО ДанныеКалендаря1.ДатаКалендаря >= ДанныеКалендаря2.ДатаКалендаря

СГРУППИРОВАТЬ ПО
    ДанныеКалендаря1.ДатаКалендаря

ИНДЕКСИРОВАТЬ ПО
    Индекс
;

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Даты.Дата,
    ДанныеКалендаря.ДатаКалендаря КАК ДатаПослеДобавленияДней,
    Даты.КоличествоДней,
    Даты.Индекс,
    Даты.Организация,
    Даты.Контрагент,
    Даты.ДоговорКонтрагента,
    Даты.ДокументРасчетов,
    Даты.Сделка,
    Даты.Регистратор,
    Даты.СуммаУпрНачальныйОстаток,
    Даты.СуммаРегНачальныйОстаток,
    Даты.СуммаУпрПриход,
    Даты.СуммаРегПриход,
    Даты.СуммаУпрРасход,
    Даты.СуммаРегРасход,
    Даты.СуммаУпрКонечныйОстаток,
    Даты.СуммаРегКонечныйОстаток
ИЗ
    втДатыСИндексами КАК Даты
        ЛЕВОЕ СОЕДИНЕНИЕ втДанныеКалендаряСИндексами КАК ДанныеКалендаря
        ПО (ДанныеКалендаря.Индекс - Даты.Индекс = Даты.КоличествоДней)
7 MAPATNK2
 
naïve
21.04.22
18:24
Как вариант ещё 1 временную таблицу писать для получения ближайшей рабочей даты...
Может какие то другие способы рабочие есть для прибавления рабочих дат?
8 MAPATNK2
 
naïve
21.04.22
18:38
Я пробовал ещё такой метод
http://catalog.mista.ru/public/385395/
Отрабатывает отлично, но когда итоговые данные помещает во временную таблицу и соединяешь их с Регистром календрая, то теряется определенная часть данных, так и не смог понять почему, да ещё и выполняется долго.
А способ который в (1) и (5) позволил все без потерь выводить, только со своим косяком в виде отсуствия результатов, когда выходные.
9 MAPATNK2
 
naïve
21.04.22
18:42
Т.е. я после получения результата с прибавленным числом рабочих дней к дате ещё раз помещаю результат во временную таблицу и соединяю с календарем, чтобы найти кол-во рабочих дней между полученной датой после прибавления и другим документом.
10 RomanYS
 
21.04.22
19:29
1. Создать Вт с пронумерованными рабочим днями
2. Соединить рабочую таблицу с ВТ по дате для получения номера текущего рабочего дня
3. Соединить с ещё одним экземпляром Вт по номеру нужного рабочего дня для получения даты

Если исходный день может быть нерабочим будет чуть сложнее
11 MAPATNK2
 
naïve
21.04.22
19:52
(10) Так и есть. День может быть нерабочим. Это я и пытаюсь как то решить.
12 Said_We
 
21.04.22
20:05
(0) В теме задача не сформулирована. Что нужно в итоге получить?
13 hhhh
 
21.04.22
20:07
(11) с этим как раз проблем нет. взять ближайший рабочий день и от него считать.
14 Russiagreat
 
21.04.22
20:08
(11) собрать отдельно рабочие и отдельно не рабочие, и не левым а внутренним соединением. и я согласен (12) не сформулирована задача.
15 Russiagreat
 
21.04.22
20:10
Еще попробуй РАЗНОСТЬДАТ(,,) помогает прибавлять и отнимать
16 Said_We
 
21.04.22
20:12
(15) Разность дат, скорее всего не поможет, раз речь идет не о всех днях.
17 Said_We
 
21.04.22
20:25
(0) Я так и не понял задачу, но подозреваю, что необходимо считать от текущей даты количество рабочих дней вперед.
1. Для каждой даты определить ближайший рабочий день. Это будет либо сам этот день если он рабочий либо ближайший до него.
2. Далее обычная функция DENSE_RANK() по этому полю ближайшего рабочего дня.
3. Далее находим МИНИМАЛЬНУЮ дату для которой выполняется условие НомерТекущегоДня + НеобходимоеКоличествоДней = НомерДня
18 Russiagreat
 
21.04.22
20:25
(16) поможет, получит количество дней в нерабочие календарные дни и плюсанет к остальному
19 Said_We
 
21.04.22
20:25
Условием играемся. Так как я не знаю включительно или исключительно дни считаем.
20 MAPATNK2
 
naïve
21.04.22
20:45
(12) Как не описана задача? Есть запрос, который прибавляет к дате число рабочих дней (причем не факт, что это дата вообще есть, но это опустим). Вот этот запрос прибавляет рабочие дни только к рабочей дате, если она выпадает на выходной день, то выводится NULL. Вот это и хочу починить.
21 MAPATNK2
 
naïve
21.04.22
20:50
(13) Я понял, что нужно взять ближайший рабочий день. И выше даже написали запрос как её получить. Но Адаптировать к своему запросу я не могу в виду отсутствия нужных знаний.
Если я свой запрос (там как раз дата документа и число дней на которые нужно увеличить её)  помещаю во временную таблицу и делаю связь с календарем, я не знаю, что дальше делать.
Я не могу написать "Выбрать первые 1", ведь тогда в моей выборке будет только 1 запись. А у меня их тысячи. Т.е. мне нужно как то вышеописанный в (1)  запрос адаптировать к большому кол-ву вводных данных. Как это сделать, я не пойму.
22 MAPATNK2
 
naïve
21.04.22
20:58
(21) Если только вложенный запрос делать, где я буду у каждой записи получать ближайшую рабочую дату. А потом соединять его по всем полям с итоговой таблицей. Только сколько выполняться будет такое ....
23 Said_We
 
21.04.22
21:35
(22) Ещё раз сформулируй задачу. Что на входе и что необходимо видеть на выходе.
24 MAPATNK2
 
naïve
21.04.22
21:43
(23) На входе вот такой результирующий запрос

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

Нужно к "Дата" Прибавить "КоличествоДней". Как сделать верно?
25 MAPATNK2
 
naïve
21.04.22
21:45
Вот что я сделал:



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

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ДанныеКалендаря1.ДатаКалендаря,
    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ДанныеКалендаря2.ДатаКалендаря) КАК Индекс
ПОМЕСТИТЬ втДанныеКалендаряСИндексами
ИЗ
    втДанныеКалендаря КАК ДанныеКалендаря1
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ втДанныеКалендаря КАК ДанныеКалендаря2
        ПО ДанныеКалендаря1.ДатаКалендаря >= ДанныеКалендаря2.ДатаКалендаря

СГРУППИРОВАТЬ ПО
    ДанныеКалендаря1.ДатаКалендаря

ИНДЕКСИРОВАТЬ ПО
    Индекс
;

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

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

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

СГРУППИРОВАТЬ ПО
    ТаблицаСДанными.Дата,
    ТаблицаСДанными.ДатаПослеДобавленияДней,
    ТаблицаСДанными.Организация,
    ТаблицаСДанными.Контрагент,
    ТаблицаСДанными.Сделка,
    ТаблицаСДанными.ДоговорКонтрагента,
    ТаблицаСДанными.ДокументРасчетов,
    ТаблицаСДанными.Регистратор,
    ТаблицаСДанными.СуммаУпрНачальныйОстаток,
    ТаблицаСДанными.СуммаРегНачальныйОстаток,
    ТаблицаСДанными.СуммаУпрПриход,
    ТаблицаСДанными.СуммаРегПриход,
    ТаблицаСДанными.СуммаУпрКонечныйОстаток,
    ТаблицаСДанными.СуммаРегКонечныйОстаток,
    ТаблицаСДанными.КоличествоДней,
    ТаблицаСДанными.СуммаРегРасход,
    ТаблицаСДанными.СуммаУпрРасход,
    ТаблицаСДанными.ДатаРегитсратора
26 MAPATNK2
 
naïve
21.04.22
21:47
(23) проблема (25) в том, что прибавляются дни только к рабочим дням. А "дата" может быть и праздничным днем и "выходным".
Как сделать так, чтобы ДатаПослеДобавленияДней не была пустой, если "Дата" = прраздником или выходным.
27 RomanYS
 
21.04.22
22:46
ВЫБРАТЬ
    РПК.ДатаКалендаря КАК Дата,
    АВТОНОМЕРЗАПИСИ() КАК НомерРД
ПОМЕСТИТЬ РД
ИЗ
    РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РПК
ГДЕ
    РПК.Пятидневка = 1
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    РД.Дата,
    РД.НомерРД,
    ДобавитьКДате(РД1.Дата, День,1) КАК ДатаПервогоВыдногоПередРД_ЕслиОнБыл
ПОМЕСТИТЬ РД_СПериодамиВыходных
ИЗ
    РД КАК РД
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РД КАК РД1
        ПО РД.НомерРД = РД1.НомерРД + 1
28 RomanYS
 
21.04.22
22:49
*(27) КАК ДатаПервогоВыходногоПередРД_ЕслиОнБыл
+(27) Далее соединять с рабочей таблицей
по РабочаяТаблица.Дата между  РД_СПериодамиВыходных.ДатаПервогоВыдногоПередРД_ЕслиОнБыл и РД_СПериодамиВыходных.Дата
29 Said_We
 
22.04.22
11:53
(28) Выходных и праздничных бывает несколько подряд.
30 RomanYS
 
22.04.22
12:25
(29) Вот поэтому там Дата<!>Первого</!>ВыходногоПередРД_ЕслиОнБыл , отсчет рабочих дней после всех этих выходных одинаковый
31 Ryzeman
 
22.04.22
12:35
(0) Не читал всю тему. Найди первый рабочий день, делов то:

ВЫБРАТЬ
    Минимум(ДанныеКалендаря.Дата)
ПОМЕСТИТЬ втПервыйРабочийДень
ИЗ
    РегистрСведений.ДанныеПроизводственногоКалендаря КАК ДанныеКалендаря
ГДЕ
    ДанныеКалендаря.ПроизводственныйКалендарь.Код = "РФ"
    И (ДанныеКалендаря.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий)
            ИЛИ ДанныеКалендаря.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Предпраздничный))
    И ДанныеКалендаря.Дата МЕЖДУ &ДатаДляКалендаря И ДОБАВИТЬКДАТЕ(&ДатаДляКалендаря, Месяц, 1)
32 Ryzeman
 
22.04.22
12:37
(31) если опасаешься что выходных дней может быть больше чем месяц, возьми год :-D Если это часто расчитывается, выкинь в общий модуль повторного использования... Импровизируй)
33 Said_We
 
22.04.22
12:55
(30) По сути будет вот такая последовательность, где 0 выходной, 1 рабочий:
0111110010100011111010101001110

Не понял я при чем тут первый или не первый или второй выходной день перед рабочим.
Найти 25 рабочих дней от даты Ч - это найти дату в которой сумма от даты Ч этих 1 будет равна 25.

Судя по (24) это необходимо сделать не как в (0) для одной даты, а для набора дат и у каждой даты своё такое количество.
34 Ryzeman
 
22.04.22
13:07
(33) Согласен, задачу можно решить ещё проще. Максимум от первых N дней, из интервала где нет выходных дней, где N - это количество рабочих дней на которые отсрочка.
35 Said_We
 
22.04.22
14:28
(0) Рисовал на коленке и не сильно думая на SQLite. Перевести на 1С запрос не сложно, тем более что переводить необходимо не всё, а только часть.
with - создание временной таблицы в 1С аналог ПОМЕСТИТЬ
vt_31 - рекурсивный запрос чисел от 0 до 31. Это не нужно, так как есть регистр производственного календаря.
vt_dni - таблица с 0 и 1 напротив каждого дня начиная с 2022-08-11, всего 31 день. 0 если день недели суббота (weekday 6) или воскресение (weekday 0).
vt_data - входные данные дата и количество дней.
ss - сумма нарастающим итогом для для каждой входящей даты

Итого: vt_31 и vt_dni не нужны - это данные из производственного календаря. vt_data - это входные данные. Осталось посчитать сумму нарастающим итогом в разрезе каждой даты запросом на 1С - это не сложно.

with vt_31 as
    (select
        0 as a
    union all
    select
        t.a+1 as a
    from
        vt_31 as t
    where
        t.a+1 <=30
    ),
    
vt_dni as (
    SELECT
        *
        ,CASE
            WHEN t.DateX = date(t.DateX,'weekday 6')
                    or t.DateX = date(t.DateX,'weekday 0')  THEN
                0
            ELSE
                1
         END as d
    FROM
        (SELECT
            DATE('2022-08-11','+'||t.a||' day') as DateX
        FROM vt_31 as t
        ) as t
    ),
    
vt_data as (
    SELECT DATE('2022-08-20') as DateN, 5 as kol
    UNION ALL SELECT DATE('2022-08-25'), 12
    UNION ALL SELECT DATE('2022-08-12'), 8
    )

SELECT
     t.DateN
    ,t.Kol
    ,Min(t.DateX) as DateK
FROM
    (SELECT
        *
        ,sum(t2.d) OVER(PARTITION BY t1.DateN ORDER BY t2.DateX) as ss
    FROM
        vt_data as t1
        LEFT JOIN vt_dni as t2
        ON t1.DateN <=t2.DateX
    ) as t
WHERE
    t.kol = t.ss
GROUP BY
     t.DateN
    ,t.Kol
36 Said_We
 
22.04.22
14:44
Можно и через DENSE_RANK() вместо SUM() как в (17) я описал. Но там условие в WHERE последнего запроса чуть другое будет.
По логике запросы идентичны.
37 Said_We
 
22.04.22
15:00
(0) Ещё примеры есть в ЗиУП любой. Расчет дней календарных для отпуска. Календарные дни - это дни без праздников ст. 112 ТК РФ.
В форме документа обычно вводя дату начала и количество дней отпуска - дата окончания считается автоматически.
В твоем случае не календарные дни а производственный календарь. Разницы ноль.
38 Лирик
 
22.04.22
16:54
Я тут поразвлекался:

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

СГРУППИРОВАТЬ ПО
    Календарь.ДатаКалендаря

ИМЕЮЩИЕ
    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Календарь1.ДатаКалендаря) = &КоличествоДней
39 Said_We
 
22.04.22
17:21
(38) В условии ГДЕ лишнее " И Календарь.РабочийДень". Документ может быть выписан в выходной, но для него надо считать.
Всё условие необходимо ещё до соединения во втором запросе обрезать.
По сути это тот же вариант расчета, но для одной даты и одного количества, как в условии в (0).
Но задачу автор уточнил в (24). У него таблица дат и количества дней. Расчет надо произвести для каждой строки таблицы.
40 Лирик
 
22.04.22
17:42
(39) Условие не лишнее, доказывать не буду, если интересно - поэкспериментируйте. Принцип понятен, переделать на связь с таблицей дат не составит труда. При "длинных" календарях недостаточно производительное, хотя пятилетний календарь, соединение ~2000х2000 строк для сервера мелочь. Не ставилась задача сделать рабочее решение, просто еще один способ к указанным выше.
41 RomanYS
 
22.04.22
19:53
(33) так в (28) написано как соединить с рабочей таблицей чтобы получить индекс рабочего дня (текущего рабочего или первого рабочего после текущего выходного).
Далее 3й пункт из (10)
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан