Имя: Пароль:
1C
1С v8
Подскажите лучший способ прибавления к дате рабочих дней в запросе
0 tciban
 
20.01.17
12:02
Уважаемые коллеги! подскажите как в запросе получить новую дату путем прибавления к ней некоторого количества рабочих дней! Суть проблемы проста как мир - есть документы отгрузки (с датами :)), в документах есть договор, в договоре - поле отсрочки в рабочих днях. Есть Регламентированный Производственный Календарь. Нужно получить в отчете СКД даты истечения отсрочки. Буду благодарен за пример кода или ссылку на оный!
1 piter3
 
20.01.17
12:05
РАЗНОСТЬДАТ и ДОБАВИТЬКДАТЕ
2 tciban
 
20.01.17
12:10
(1) Мне нужно добавить к дате рабочие дни. Только рабочие, без праздников и выходных.
3 piter3
 
20.01.17
12:11
ну и ставь условия на (2).
4 tciban
 
20.01.17
12:17
Люди накрученные запросы пишут, по пять виртуалных таблиц вычисляют (http://catalog.mista.ru/public/358927/), а у вас так просто - поставить условия да и все. Что то я видно не понимаю ни в запросах ни в программировании вовсе.

Не предоставите ли любезно образчик запроса?
5 WebberNSK
 
20.01.17
12:45
Посмотрите в ERP метод ОбеспечениеСервер.ТекстЗапросаДатГрафика
6 SSSSS_AAAAA
 
20.01.17
12:53
(2) В запросах нормальные люди ничего к специфическим датам, Дкоими, в частности, являются и рабочие, не прибавляют. Жаты вообще не вычисляют, а используют таблицы с календарями, на которые и накладывают нужные условия.
7 FIXXXL
 
20.01.17
13:03
(0) мож проще при проведении документа эту дату писать в свой регистр? и его цеплять в запрос

в договоре срок отсрочки менять ведь нельзя?
8 tciban
 
20.01.17
13:13
(7) Ну как всегда мы пишем отчет и исходим из условия, что рабочую конфу менять нельзя :)
9 tciban
 
20.01.17
13:15
(5) Ох-хо-хо... Это ж еще надо скачать и установить erp! А я для УПП 1.2 делаю :(

Можно вас попросить любезно скинуть мне на почту текст помянутого вами метода?
10 FIXXXL
 
20.01.17
13:18
(8) ну сваргань таблицу, обсчитай и сунь ее в набор данных СКД
или временную в запрос, в СКД уже финальную таблицу
11 svsvsv
 
20.01.17
13:30
(0)
В УПП 1.3 (может и в УПП 1.2 тоже) есть такой регистр - РегламентированныйПроивзодственныйКалендарь.

ВЫБРАТЬ ПЕРВЫЕ 5 //ЗДЕСЬ НУЖНО ПОСТАВИТЬ КОЛ-ВО ДНЕЙ
    РегламентированныйПроизводственныйКалендарь.ДатаКалендаря КАК ДатаКалендаря
ПОМЕСТИТЬ ВТ_РабочиеДни
ИЗ
    РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
ГДЕ
    РегламентированныйПроизводственныйКалендарь.ВидДня = &ВидДня_РабочийДень
    И РегламентированныйПроизводственныйКалендарь.ДатаКалендаря >= &ИсходнаяДата
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    МАКСИМУМ(ВТ_РабочиеДни.ДатаКалендаря) КАК ДатаКалендаря
ИЗ
    ВТ_РабочиеДни КАК ВТ_РабочиеДни

Как то так.
12 svsvsv
 
20.01.17
13:30
(11) и в первой таблице поставить "=" вместо ">="
13 FIXXXL
 
20.01.17
13:39
(11) напиши на каждую строку отчета, разные договора, разные даты документов
14 kumena
 
20.01.17
13:44
> Как то так.

не так, твой одноразовый запрос нафиг не уперся.
15 kumena
 
20.01.17
13:46
технология вообще такая, нужно сделать таблицу с пронумерованными днями. сделав соединение по дате узнаем номер дня, а к номеру дня прибавим количество дней и узнаем нужный день.
16 kumena
 
20.01.17
13:47
естественно все в запросе, я делал такое давным давно
17 tciban
 
20.01.17
14:44
Коллеги! Больше идей нет?
18 Быдло замкадное
 
20.01.17
14:47
(17) нужна платформенная функция ПрибавитьКДатеРабочихДней() ? Ее нет
19 tciban
 
20.01.17
14:54
(18) Я типа про запросы тут.
20 kumena
 
20.01.17
15:05
(17) а чем тебе технология в 15 посте не нравиться?
21 kumena
 
20.01.17
15:07
там все разжевано, если запросы писать умеешь, то сделать вообще не проблема.
22 DrZombi
 
гуру
20.01.17
15:07
(0) через запрос
23 kumena
 
20.01.17
15:08
могу написать пример, не бесплатно.
24 FIXXXL
 
20.01.17
15:10
(15) (20) (23) в каждой строке отчета Дата и Число
из таблицы с рабочими днями надо выдернуть начиная с Дата столько строк с "1", сколько в Число и потом просуммировать "1"

наверное можно в запросе, но в пятницу неохота думать :)
25 marvak
 
20.01.17
15:11
(0)
Если нужно учитывать праздники, то только через производственный календарь.
26 FIXXXL
 
20.01.17
15:11
(24) не проссумировать, а получить последнюю старшую из "1"-ых

пятница :)
27 Лефмихалыч
 
20.01.17
15:11
|ВЫБРАТЬ
            |    Календарь.Дата КАК Дата
            |ПОМЕСТИТЬ ДанныеКалендаря
            |ИЗ
            |    РегистрСведений.ДанныеПроизводственногоКалендаря КАК Календарь
            |    ПО (Календарь.Дата > &ТвояДата)
            |        И (Календарь.ВидДня <> ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Суббота))
            |        И (Календарь.ВидДня <> ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Воскресенье))
            |        И (Календарь.ВидДня <> ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Праздник))
            |        И (Календарь.ПроизводственныйКалендарь = &ПроизводственныйКалендарь)
            |;
            |
            |////////////////////////////////////////////////////////////////////////////////
            |ВЫБРАТЬ ПЕРВЫЕ 1
            |    ДанныеКалендаря.Дата КАК Дата
            |ПОМЕСТИТЬ ДатаПлатежа
            |ИЗ
            |    ДанныеКалендаря КАК ДанныеКалендаря
            |        ЛЕВОЕ СОЕДИНЕНИЕ ДанныеКалендаря КАК ДанныеКалендаря1
            |        ПО ДанныеКалендаря.Дата > ДанныеКалендаря1.Дата
            |
            |СГРУППИРОВАТЬ ПО
            |    ДанныеКалендаря.Дата,
            |    ОтсрочкаПоСоглашению.КоличествоДней
            |    
            |ИМЕЮЩИЕ
            |    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ДанныеКалендаря1.Дата) = &НужноеКоличествоРабочихДней
28 Лефмихалыч
 
20.01.17
15:12
ОтсрочкаПоСоглашению.КоличествоДней - выкосить, это лишнее
29 svsvsv
 
20.01.17
15:50

ВЫБРАТЬ
    Реализация.Ссылка КАК Ссылка,
    Реализация.Дата КАК Дата,
    Реализация.Договор.ДнейОтсрочки КАК ДоговорДнейОтсрочки
ПОМЕСТИТЬ ВТ_Документы
ИЗ
    Документ.Реализация КАК Реализация
;

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ_Документы.Ссылка КАК Ссылка,
    ВТ_Документы.Дата КАК Дата,
    ВТ_Документы.ДоговорДнейОтсрочки КАК ДоговорДнейОтсрочки,
    ВТ_РабочиеДни.ДатаКалендаря КАК ДатаКалендаря,
    РАЗНОСТЬДАТ(ВТ_Документы.Дата, ВТ_РабочиеДни.ДатаКалендаря, ДЕНЬ) КАК Срок
ИЗ
    ВТ_Документы КАК ВТ_Документы
        ЛЕВОЕ СОЕДИНЕНИЕ ВТ_РабочиеДни КАК ВТ_РабочиеДни
        ПО ВТ_Документы.Дата < ВТ_РабочиеДни.ДатаКалендаря
ГДЕ
    РАЗНОСТЬДАТ(ВТ_Документы.Дата, ВТ_РабочиеДни.ДатаКалендаря, ДЕНЬ) = ВТ_Документы.ДоговорДнейОтсрочки
30 svsvsv
 
20.01.17
15:59
(29) так тоже неправильно
31 tciban
 
20.01.17
16:21
(29) (27) Спасибо! Будем пробовать!
32 svsvsv
 
20.01.17
16:24
(31) В последней таблице надо не РАЗНОСТЬДАТ использовать, нужно более сложный запрос писать, сейчас пока не твремени
33 tciban
 
20.01.17
16:27
(28) Не, твой запрос под добавление ко многим датам документов перепилить не смог...
34 tciban
 
20.01.17
16:27
Ладно, давайте ужо в понедельник поднимем тему... Сейчас уже все.
35 SoulPower
 
20.01.17
16:30
36 ELEA26
 
20.01.17
16:46
(34) праздники надо учитывать или нет? От этого зависит - только производственный календарь или можно без него.
37 tciban
 
20.01.17
20:20
Праздники конечно надо учитывать
38 tciban
 
23.01.17
11:02
(35) Все классно, заработало! Правда не очень быстро... Исходный запрос, в котором получаю документы возникновения долга, выполняется за 1 183 мс, а с расчетом дат - 170 474 мс :(
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ_Документы.Период КАК Период,
    ВТ_Документы.ДнейОтсрочкиДолга КАК Отсрочка
ПОМЕСТИТЬ ИсходныеДаты
ИЗ
    ВТ_Документы КАК ВТ_Документы

ИНДЕКСИРОВАТЬ ПО
    Период,
    Отсрочка
;

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

ИНДЕКСИРОВАТЬ ПО
    Период,
    Отсрочка
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    СоединениеСРабочими.Период КАК Период,
    СоединениеСРабочими.Отсрочка КАК Отсрочка,
    СоединениеСРабочими1.РабочийДень КАК ДатаОплаты
ПОМЕСТИТЬ ВТ_ДатыОплат
ИЗ
    СоединениеСРабочими КАК СоединениеСРабочими
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ СоединениеСРабочими КАК СоединениеСРабочими1
        ПО СоединениеСРабочими.РабочийДень <= СоединениеСРабочими1.РабочийДень

СГРУППИРОВАТЬ ПО
    СоединениеСРабочими.Отсрочка,
    СоединениеСРабочими.Период,
    СоединениеСРабочими1.РабочийДень

ИМЕЮЩИЕ
    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ СоединениеСРабочими.РабочийДень) = СоединениеСРабочими.Отсрочка

ИНДЕКСИРОВАТЬ ПО
    Период,
    Отсрочка
;

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

УПОРЯДОЧИТЬ ПО
    ДатаОплаты
39 Ildarovich
 
23.01.17
11:35
(38) Посмотрите статью http://catalog.mista.ru/public/358927/ . В ней похожая задача и достаточно экономный по времени метод прибавления рабочих дней, а также ссылки на множество других публикаций по тому же вопросу.

Проблема запроса в (38) в том, что неэкономные соединения делаются для всех заданных дат, а нужно, как уже говорилось в (15) и как сделано в статье по ссылке, сначала получить единую таблицу пронумерованных подряд рабочих дней, а затем работать уже с ней - находить по заданной дате номер рабочего дня, прибавлять к этому номеру число дней отсрочки и по прибавленному номеру находить обратно искомую дату.

В итоге время работы запроса должно очень сильно сократиться из-за однократности использования тэта-соединения.
40 tciban
 
23.01.17
11:44
(39) Это был первый вариант, но при отгрузке в нерабочие дни он не рассчитывает даты. Кстати, документы я получаю по вашему алгоритму из (http://catalog.mista.ru/public/262300/)
Огромное вам за него спасибо!!!
41 tciban
 
23.01.17
11:46
Кстати, померял в консоле запросов оба варианта на выборке документов с начала декабря - получилось что у SoulPower (
http://catalog.mista.ru/public/385395/) быстрее чем алгоритм Игронова
42 tciban
 
23.01.17
11:55
(39) Сергей! Раз уж Вы заглянули сюда - вопросик по Вашему алгоритму - почему резко увеличивается время выполнения когда добавляю в настройках СКД группировку по Контрагент.ОсновнойМенеджерПокупателя с иерархией? Так и должно быть или же есть способ, что бы работало быстрее?
43 Fragster
 
гуру
23.01.17
11:57
В новых БСП в этом РС есть хорошее измерение РабочихДнейСНачалаГода или как-то так... тогда не надо считать сумму, а можно просто прибавить нужное количество (ну, и немного поизвращаться с переходом через границу года)
44 tciban
 
23.01.17
12:03
(43) Увы, но я пишу отчетец для УПП 1.2, какие уж тут БСП!
45 tciban
 
23.01.17
12:03
(43) И конечно же нужно не лезть в конфу и не менять структуру данных...
46 Fragster
 
гуру
23.01.17
12:05
(45) может я пропустил, но где в этой ветке указание на то, какая версия БСП, или хотя бы какая версия типового решения используется?
47 Fragster
 
гуру
23.01.17
12:06
кроме (44)
48 Fragster
 
гуру
23.01.17
12:07
а, нашел. ну, тогда только суммировать. но я бы не в два раза больше запас делал, а в 15 дней на каждый год + 2 на каждую неделю.
49 tciban
 
23.01.17
12:14
(48) Попробую, спасибо за совет! :)
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн