Комментарии
Избранное
Подписка
Сортировка:
Древо
В том-то и оно, что обсуждалось, типа "Кури ...". Тут парень конкретно написал. Я помню раньше еще писал, но потом какое-то время не работал с 1С, сейчас на свое взглянул (а там еще с планом счетов связано), аж паника продернула, вспоминал бы дня два! Спасибо, ооочень выручил, так бы все писали, а не "Кури..."
Ну здесь дело в праздниках, если взять, например, какое-нибудь 21.12.2012, то глубина 15 дней не достаточна из-за долгих январских праздников - вот только исходя из таких нюансов. Поэтому Глубина = 15 дней + Максимум количества праздников, вот как-то так
Немного допилил запрос, чтобы можно было отнять дату. Автору +, единственное внятное рабочее решение, которое я нашел в инете по этой теме ("скопировал и работает").
или так
ВЫБРАТЬ
РегламентированныйПроизводственныйКалендарь.ДатаКалендаря КАК Дата
ПОМЕСТИТЬ Даты
ИЗ
РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
ГДЕ
РегламентированныйПроизводственныйКалендарь.ДатаКалендаря В(&ВходящиеДаты)
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
Даты.Дата,
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ РегламентированныйПроизводственныйКалендарь.ДатаКалендаря) КАК КоличествоРабочихДней,
ВЫБОР
КОГДА &ОтнятьДни
ТОГДА МИНИМУМ(РегламентированныйПроизводственныйКалендарь.ДатаКалендаря)
ИНАЧЕ МАКСИМУМ(РегламентированныйПроизводственныйКалендарь.ДатаКалендаря)
КОНЕЦ КАК ДатаКалендаря,
РегламентированныйПроизводственныйКалендарь1.ДатаКалендаря КАК ДатаКалендаряДляГруппировки
ИЗ
РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Даты КАК Даты
ПО (ВЫБОР
КОГДА &ОтнятьДни
ТОГДА Даты.Дата >= РегламентированныйПроизводственныйКалендарь.ДатаКалендаря
ИНАЧЕ Даты.Дата <= РегламентированныйПроизводственныйКалендарь.ДатаКалендаря
КОНЕЦ)
И (ДОБАВИТЬКДАТЕ(Даты.Дата, ДЕНЬ, &ГлубинаДней) > РегламентированныйПроизводственныйКалендарь.ДатаКалендаря)
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь1
ПО (ВЫБОР
КОГДА &ОтнятьДни
ТОГДА РегламентированныйПроизводственныйКалендарь.ДатаКалендаря >= РегламентированныйПроизводственныйКалендарь1.ДатаКалендаря
ИНАЧЕ РегламентированныйПроизводственныйКалендарь.ДатаКалендаря <= РегламентированныйПроизводственныйКалендарь1.ДатаКалендаря
КОНЕЦ)
ГДЕ
(РегламентированныйПроизводственныйКалендарь.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Предпраздничный)
ИЛИ РегламентированныйПроизводственныйКалендарь.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий))
СГРУППИРОВАТЬ ПО
РегламентированныйПроизводственныйКалендарь1.ДатаКалендаря,
Даты.Дата
ИМЕЮЩИЕ
ВЫБОР
КОГДА &ОтнятьДни
ТОГДА МИНИМУМ(РегламентированныйПроизводственныйКалендарь.ДатаКалендаря) = РегламентированныйПроизводственныйКалендарь1.ДатаКалендаря
ИНАЧЕ МАКСИМУМ(РегламентированныйПроизводственныйКалендарь.ДатаКалендаря) = РегламентированныйПроизводственныйКалендарь1.ДатаКалендаря
КОНЕЦ И
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ РегламентированныйПроизводственныйКалендарь.ДатаКалендаря) = &РабочихДней
Показатьили так
ВЫБРАТЬ
РегламентированныйПроизводственныйКалендарь.ДатаКалендаря КАК Дата
ПОМЕСТИТЬ Даты
ИЗ
РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
ГДЕ
РегламентированныйПроизводственныйКалендарь.ДатаКалендаря В(&ВходящиеДаты)
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
Даты.Дата,
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ РегламентированныйПроизводственныйКалендарь.ДатаКалендаря) КАК КоличествоРабочихДней,
ВЫБОР
КОГДА &РабочихДней < 0
ТОГДА МИНИМУМ(РегламентированныйПроизводственныйКалендарь.ДатаКалендаря)
ИНАЧЕ МАКСИМУМ(РегламентированныйПроизводственныйКалендарь.ДатаКалендаря)
КОНЕЦ КАК ДатаКалендаря,
РегламентированныйПроизводственныйКалендарь1.ДатаКалендаря КАК ДатаКалендаряДляГруппировки
ИЗ
РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Даты КАК Даты
ПО (ВЫБОР
КОГДА &РабочихДней < 0
ТОГДА Даты.Дата >= РегламентированныйПроизводственныйКалендарь.ДатаКалендаря
ИНАЧЕ Даты.Дата <= РегламентированныйПроизводственныйКалендарь.ДатаКалендаря
КОНЕЦ)
И (ДОБАВИТЬКДАТЕ(Даты.Дата, ДЕНЬ, &ГлубинаДней) > РегламентированныйПроизводственныйКалендарь.ДатаКалендаря)
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь1
ПО (ВЫБОР
КОГДА &РабочихДней < 0
ТОГДА РегламентированныйПроизводственныйКалендарь.ДатаКалендаря >= РегламентированныйПроизводственныйКалендарь1.ДатаКалендаря
ИНАЧЕ РегламентированныйПроизводственныйКалендарь.ДатаКалендаря <= РегламентированныйПроизводственныйКалендарь1.ДатаКалендаря
КОНЕЦ)
ГДЕ
(РегламентированныйПроизводственныйКалендарь.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Предпраздничный)
ИЛИ РегламентированныйПроизводственныйКалендарь.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий))
СГРУППИРОВАТЬ ПО
РегламентированныйПроизводственныйКалендарь1.ДатаКалендаря,
Даты.Дата
ИМЕЮЩИЕ
ВЫБОР
КОГДА &РабочихДней < 0
ТОГДА МИНИМУМ(РегламентированныйПроизводственныйКалендарь.ДатаКалендаря) = РегламентированныйПроизводственныйКалендарь1.ДатаКалендаря
ИНАЧЕ МАКСИМУМ(РегламентированныйПроизводственныйКалендарь.ДатаКалендаря) = РегламентированныйПроизводственныйКалендарь1.ДатаКалендаря
КОНЕЦ И
ВЫБОР
КОГДА &РабочихДней < 0
ТОГДА КОЛИЧЕСТВО(РАЗЛИЧНЫЕ РегламентированныйПроизводственныйКалендарь.ДатаКалендаря) = -&РабочихДней
ИНАЧЕ КОЛИЧЕСТВО(РАЗЛИЧНЫЕ РегламентированныйПроизводственныйКалендарь.ДатаКалендаря) = &РабочихДней
КОНЕЦ
Показать
оставлю для коллекции вариант для Бух.3
Функция ОтсчитатьРабочиеДни(ДатаОтсчета,Отсрочка)
Запрос = Новый Запрос;
Запрос.Текст = "Select
| ДанныеПроизводственногоКалендаря.ПроизводственныйКалендарь,
| ДанныеПроизводственногоКалендаря.Дата,
| ДанныеПроизводственногоКалендаря.Год,
| ДанныеПроизводственногоКалендаря.ВидДня,
| ДанныеПроизводственногоКалендаря.ДатаПереноса
|
|into
| cal
|from
| РегистрСведений.ДанныеПроизводственногоКалендаря КАК ДанныеПроизводственногоКалендаря
|where
| ДанныеПроизводственногоКалендаря.Дата between &ДатаОтсчета
| and DateAdd(&ДатаОтсчета, день, &Отсрочка*2 + 12)
|;
|
|Select
|min(дата) датаОтсрочки
|from(
|Select
|
|c1.дата дата,
|
|count(*) -1 РабочихДней
|
|from cal c1
|left join cal c2
|on (c2.ВидДня = value(Перечисление.ВидыДнейПроизводственногоКалендаря.Предпраздничный) or c2.ВидДня = value(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий))
|and c1.дата>=c2.дата
|group by c1.дата
|having count(*)= &Отсрочка+1
|) tt
|group by РабочихДней";
попытка
Запрос.УстановитьПараметр("ДатаОтсчета", ДатаОтсчета);
Запрос.УстановитьПараметр("Отсрочка", Отсрочка);
Результат = Запрос.Выполнить().Выгрузить();
Возврат Результат[0].датаОтсрочки;
исключение
конецпопытки;
конецФункции
Показать
ко второму соединению
полезно будет добавить условие типа (отмечено жирным)
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь1
ПО РегламентированныйПроизводственныйКалендарь.ДатаКалендаря <= РегламентированныйПроизводственныйКалендарь1.ДатаКалендаря
И (ДОБАВИТЬКДАТЕ(РегламентированныйПроизводственныйКалендарь.ДатаКалендаря, ДЕНЬ, &ГлубинаДней) > РегламентированныйПроизводственныйКалендарь1.ДатаКалендаря)
иначе много доп сведений (дат) добавляется, которые не очень-то нужны,
разница в скорострельности ощутима на 3-х значениях В (&ВходящиеДаты)
Автору спасибо, очень помогло
полезно будет добавить условие типа (отмечено жирным)
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь1
ПО РегламентированныйПроизводственныйКалендарь.ДатаКалендаря <= РегламентированныйПроизводственныйКалендарь1.ДатаКалендаря
И (ДОБАВИТЬКДАТЕ(РегламентированныйПроизводственныйКалендарь.ДатаКалендаря, ДЕНЬ, &ГлубинаДней) > РегламентированныйПроизводственныйКалендарь1.ДатаКалендаря)
иначе много доп сведений (дат) добавляется, которые не очень-то нужны,
разница в скорострельности ощутима на 3-х значениях В (&ВходящиеДаты)
Автору спасибо, очень помогло
Мне одному кажется что не совсем верно считается добавление количество рабочих дней?
Если по запросу установить входящую дату 22.02.2017 и попросить добавить к дате 2 рабочих дня то запрос выдает 27.02.2017.
Ну а должен наверно 28.02.2017
Если по запросу установить входящую дату 22.02.2017 и попросить добавить к дате 2 рабочих дня то запрос выдает 27.02.2017.
Ну а должен наверно 28.02.2017
В общем работает что-то нет так
08.02.2015 + 7 дней получаю 13.02.2015 хотя явно должно быть 16.02.2015 (это если учитывать начальную дату 08.02.2015)
но эта дата является выходным днем, поэтому учитывать ее нельзя, а в этом случае результатом должен быть 17.02.2015
но ни как не 13.02.2015.
Короче не работает.
08.02.2015 + 7 дней получаю 13.02.2015 хотя явно должно быть 16.02.2015 (это если учитывать начальную дату 08.02.2015)
но эта дата является выходным днем, поэтому учитывать ее нельзя, а в этом случае результатом должен быть 17.02.2015
но ни как не 13.02.2015.
Короче не работает.
а так будет оптимальнее (работает в 10 раз быстрее)
добавил условие на соединение РегламентированныйПроизводственныйКалендарь1
ВЫБРАТЬ
ПК.Дата КАК Дата,
ПК.ВидДня КАК ВидДня
ПОМЕСТИТЬ Рабочие
ИЗ
РегистрСведений.ДанныеПроизводственногоКалендаря КАК ПК
ГДЕ
ПК.Дата МЕЖДУ ДОБАВИТЬКДАТЕ(&тДата, МЕСЯЦ, -2) И ДОБАВИТЬКДАТЕ(&тДата, ДЕНЬ, 15)
И ПК.ВидДня В (ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий), ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Предпраздничный))
;
ВЫБРАТЬ
Даты.Дата,
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ РегламентированныйПроизводственныйКалендарь.Дата)-1 КАК КоличествоРабочихДней,
МАКСИМУМ(РегламентированныйПроизводственныйКалендарь.Дата) КАК ДатаКалендаря,
РегламентированныйПроизводственныйКалендарь1.Дата КАК ДатаКалендаряДляГруппировки
ИЗ
РегистрСведений.ДанныеПроизводственногоКалендаря КАК РегламентированныйПроизводственныйКалендарь
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Рабочие КАК Даты
ПО (РегламентированныйПроизводственныйКалендарь.Дата Между Даты.Дата И ДОБАВИТЬКДАТЕ(Даты.Дата, ДЕНЬ, 20))
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ДанныеПроизводственногоКалендаря КАК РегламентированныйПроизводственныйКалендарь1
ПО РегламентированныйПроизводственныйКалендарь.Дата <= РегламентированныйПроизводственныйКалендарь1.Дата
И ДОБАВИТЬКДАТЕ(Даты.Дата, ДЕНЬ, 20) > РегламентированныйПроизводственныйКалендарь1.Дата
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.апкОбщиеНастройки КАК ЧасыОплатыЗаявки
ПО (ЧасыОплатыЗаявки.Настройка = ЗНАЧЕНИЕ(ПланВидовХарактеристик.апкОбщиеНастройки.ЧасовОтСозданияЗаявкиДСДоВыполненияЗаказаРассылка))
ГДЕ
РегламентированныйПроизводственныйКалендарь.ВидДня В (ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий), ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Предпраздничный))
СГРУППИРОВАТЬ ПО
РегламентированныйПроизводственныйКалендарь1.Дата,
Даты.Дата,
ЧасыОплатыЗаявки.Значение
ИМЕЮЩИЕ
МАКСИМУМ(РегламентированныйПроизводственныйКалендарь.Дата) = РегламентированныйПроизводственныйКалендарь1.Дата
И КОЛИЧЕСТВО(РАЗЛИЧНЫЕ РегламентированныйПроизводственныйКалендарь.Дата)-1 = ВЫРАЗИТЬ(ВЫРАЗИТЬ(ЧасыОплатыЗаявки.Значение КАК ЧИСЛО(10, 0))/24 КАК ЧИСЛО(10, 0))
Показатьдобавил условие на соединение РегламентированныйПроизводственныйКалендарь1
Вот простое и рабочее решение:
ВЫБРАТЬ
&ДатаККоторойНужноДобавитьДни КАК Дата,
&КоличествоДней КАК КоличествоДней
ПОМЕСТИТЬ втДаты
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ДанныеКалендаря.Дата
ПОМЕСТИТЬ втДанныеКалендаря
ИЗ
РегистрСведений.ДанныеПроизводственногоКалендаря КАК ДанныеКалендаря
ГДЕ
ДанныеКалендаря.ПроизводственныйКалендарь.Код = "РФ"
И (ДанныеКалендаря.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий)
ИЛИ ДанныеКалендаря.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Предпраздничный))
И ДанныеКалендаря.Дата >= &ДатаДляКалендаря
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ДанныеКалендаря1.Дата,
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ДанныеКалендаря2.Дата) КАК Индекс
ПОМЕСТИТЬ втДанныеКалендаряСИндексами
ИЗ
втДанныеКалендаря КАК ДанныеКалендаря1
ВНУТРЕННЕЕ СОЕДИНЕНИЕ втДанныеКалендаря КАК ДанныеКалендаря2
ПО ДанныеКалендаря1.Дата >= ДанныеКалендаря2.Дата
СГРУППИРОВАТЬ ПО
ДанныеКалендаря1.Дата
ИНДЕКСИРОВАТЬ ПО
Индекс
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ВТ.Дата,
ВТ.КоличествоДней,
ДанныеКалендаря.Индекс КАК Индекс
ПОМЕСТИТЬ втДатыСИндексами
ИЗ
втДаты КАК ВТ
ЛЕВОЕ СОЕДИНЕНИЕ втДанныеКалендаряСИндексами КАК ДанныеКалендаря
ПО ВТ.Дата = ДанныеКалендаря.Дата
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
Даты.Дата,
ДанныеКалендаря.Дата КАК ДатаПослеДобавленияДней
ИЗ
втДатыСИндексами КАК Даты
ЛЕВОЕ СОЕДИНЕНИЕ втДанныеКалендаряСИндексами КАК ДанныеКалендаря
ПО (ДанныеКалендаря.Индекс - Даты.Индекс = Даты.КоличествоДней)
Показать
всё отлично работает пока не переносишь в СКД консоль, там валится с ошибкой
поправил вот так МАКСИМУМ(РегламентированныйПроизводственныйКалендарь.ДатаКалендаря) = МАКСИМУМ(РегламентированныйПроизводственныйКалендарь1.ДатаКалендаря) И
т.к. ДатаКалендаря совпадает с ДатаКалендаряДляГруппировки в последующем СКД использую ДатаКалендаряДляГруппировки
а вообще автор красавчик сэкономил мне кучу времени и нервов
{ВнешняяОбработка.ирОбщий.МодульОбъекта(22178)}: Ошибка при вызове метода контекста (Инициализировать)
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных, ВнешниеНаборыДанных, ДанныеРасшифровки, Истина);
по причине:
Ошибка компоновки данных
по причине:
Ошибка инициализации
по причине:
Ошибка создания набора данных "НаборДанных1"
по причине:
Ошибка при исполнении запроса набора данных
по причине:
{(53, 72)}: Поле не входит в группу "РегламентированныйПроизводственныйКалендарь1.ДатаКалендаря"
МАКСИМУМ(РегламентированныйПроизводственныйКалендарь.ДатаКалендаря) = <<?>>РегламентированныйПроизводственныйКалендарь1.ДатаКалендаря И
ПоказатьПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных, ВнешниеНаборыДанных, ДанныеРасшифровки, Истина);
по причине:
Ошибка компоновки данных
по причине:
Ошибка инициализации
по причине:
Ошибка создания набора данных "НаборДанных1"
по причине:
Ошибка при исполнении запроса набора данных
по причине:
{(53, 72)}: Поле не входит в группу "РегламентированныйПроизводственныйКалендарь1.ДатаКалендаря"
МАКСИМУМ(РегламентированныйПроизводственныйКалендарь.ДатаКалендаря) = <<?>>РегламентированныйПроизводственныйКалендарь1.ДатаКалендаря И
поправил вот так МАКСИМУМ(РегламентированныйПроизводственныйКалендарь.ДатаКалендаря) = МАКСИМУМ(РегламентированныйПроизводственныйКалендарь1.ДатаКалендаря) И
т.к. ДатаКалендаря совпадает с ДатаКалендаряДляГруппировки в последующем СКД использую ДатаКалендаряДляГруппировки
а вообще автор красавчик сэкономил мне кучу времени и нервов
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|