Имя: Пароль:
1C
1С v8
Ещё один хитрый вопрос про запрос. Параметр в запросе как передать?
,
0 Cerera
 
17.08.12
09:51
Есть такой запрос, определяющий дату относительно заданной даты через заданное число дней:

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

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

В связи с этим возникает два вопроса:
1)как передать параметр количества дней в запрос вместо пятёрки в строчке
ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 5

2)как соединить запрос с запросом у которого в столбиках указаны количества дней на примере запроса к остаткам:

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

СГРУППИРОВАТЬ ПО
   ТоварыНаСкладахОстатки.Номенклатура
;

мне кажется, что это невозможно просто поэтому и типовые используют функцию модуля для определения числа дней
1 pessok
 
17.08.12
09:53
дарю:

Функция ДобавитьОтнятьКДатеРабочиеДни(Отнять = Ложь, ДатаНач, ЧислоРабочихДней) экспорт
   
   ЧислоДней = +?(ЧислоРабочихДней>0, ЧислоРабочихДней, 1);
   
   Запрос=Новый Запрос(
   "ВЫБРАТЬ "+?(Не Отнять, "ПЕРВЫЕ "+ЧислоДней, "") + "
   |    Календарь.ДатаКалендаря КАК ДатаКалендаря
   |ПОМЕСТИТЬ ТЗ
   |ИЗ
   |    РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК Календарь
   |ГДЕ
   |    Календарь.ДатаКалендаря "+?(Отнять, "<=", ">=")+"&ДатаНач
   |    И (Календарь.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий)
   |            ИЛИ Календарь.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Предпраздничный))
   |;
   |
   |////////////////////////////////////////////////////////////////////////////////
   |ВЫБРАТЬ
   | "+?(Не Отнять, "МАКСИМУМ(ТЗ.ДатаКалендаря)", "ТЗ.ДатаКалендаря") +" КАК ДатаКалендаря
   |ИЗ
   |    ТЗ КАК ТЗ");
   
   Запрос.УстановитьПараметр("ДатаНач",             ДатаНач);
   Выборка = Запрос.Выполнить().Выгрузить();
   Результат = 0;
   Если Не Отнять Тогда
       Если Выборка.Количество() = 1 Тогда
           
           //Если ЧислоРабочихДней = 0 Тогда
               
               Результат = КонецДня(Выборка[0].ДатаКалендаря);
               
           //Иначе    
           //    
           //    Результат = КонецДня(Выборка[0].ДатаКалендаря)+ЧислоРабочихДней;
           //    
           //КонецЕсли;
           
       Конецесли;
       
   ИначеЕсли Выборка.Количество() > 0 Тогда
       
       Выборка.Сортировать("ДатаКалендаря УБЫВ");
       
       Результат = Выборка[ЧислоДней-1].ДатаКалендаря;
       
   КонецЕсли;
   
   Возврат Результат;
2 Один С
 
17.08.12
09:53
я знаю два ответа как минимум на первый вопрос
3 Cerera
 
17.08.12
09:56
(1)к сожалению это не то! ты мне показал как програмно вычислить дату. даже в типовой такая есть функция.ОпределитьДату(ДатаНач, ЧислоДней)
но мне то надо это без програмного кода реализовать! чтоб к имеющемуся запросу в СКД Присоединить запрос, получающий выборку!
4 Cerera
 
17.08.12
09:57
(2)а именно без программного кода как передать. а чтоб чисто на языке запроса
5 pessok
 
17.08.12
09:58
открою страшную тайну. в вычисляемых полях скд можно использовать экспортные методы
6 Cerera
 
17.08.12
09:58
(5)я вкурсе! но делаю отчет без вычисляемых полей!! с вычисляемыми я уже делал ( тормозит.
7 Cerera
 
17.08.12
09:59
нужно чисто восьмерошный подход
8 pessok
 
17.08.12
10:00
у меня почему-то ничего не тормозит, хотя нарастающим итогом считаются дефициты на день по остаткам номенклатуры... делай в скд источником данных объект и строй свою ТЗ. ее подсунешь скд.
ОпределитьДату() - это в каких типовых есть такой метод? :)
9 Omskdizel
 
17.08.12
10:01
Что мешает в СКД подсунуть запрос, сделанный методом как в (1)?
10 Cerera
 
17.08.12
10:03
(8)в УТ в модуле "ЗАполнениеДОкументов"
11 Лоботряс
 
17.08.12
10:03
А какая разница 5 верхних записей брать или,например, 15. Все равно следующим запросом ты берешь максимальную из этих 5-ти? Тем более в 1-м запросе они не упорядочены?
12 pessok
 
17.08.12
10:05
(11) а если календарь заполнен на 100500 лет? и записи производственного календаря и так идут по порядку
13 Cerera
 
17.08.12
10:06
(11)суть то в том что это даты производственного календаря. если тебе от текущей даты нужно отступить на 5 дней то ты выбираешь пять записей от текущей и максимальной будет как раз наибольшая дата. а мне вот надо чтоб я мог это количество передавать в качестве параметра соединяя запрос с запросом к остаткам
(9)ну это мне основной запрос придется использовать для формирования этой ТЗ.
14 Лоботряс
 
17.08.12
10:09
(13)Нет, не так. Этот запрос получает все записи которые больше заданной даты, и из полученных отбирает первые 5. Так может правильнее было бы не больше первых записей брать, а заданную дату подвинуть, или еще одно ограничение добавить?
15 Cerera
 
17.08.12
10:11
(14)а поподробнее?
16 Лоботряс
 
17.08.12
10:12
Иными словами этот запрос всегда возвращает максимальную дату(при условии что как вы говорите он упорядочен) на которую заполнен производственный календарь.
17 Cerera
 
17.08.12
10:17
(16)а как задать чтоб он только 5 взял или 10 или не важно? это ведь главное
18 pessok
 
17.08.12
10:17
(16) просыпайся, ты шо...
ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 5
выбирает первые пять записей.
РегламентированныйПроизводственныйКалендарь.ДатаКалендаря > &ДатаНач
которые больше даты, от которой отбираем
19 pessok
 
17.08.12
10:18
а потом он берет максимальную - т.е. последний день
20 pessok
 
17.08.12
10:18
из пяти
21 acsent
 
17.08.12
10:20
учи как делается срезпоследних
22 acsent
 
17.08.12
10:21
(18) сначала найти 5 а потом найти максимум равносильно или даже хуже чем сразу найти максимум
23 Лоботряс
 
17.08.12
10:24
(18) я то уже кофем напился, а ты?
24 Лоботряс
 
17.08.12
10:24
:))
25 Cerera
 
17.08.12
10:24
(21)чтобы срез последних получить, надо знать на какую дату этот срез делать. а мы как раз ищем эту дату ) нам известна только начальняя дата и количество дней
26 acsent
 
17.08.12
10:25
(25) я имел ввиду учи как ПЛАТФОРМА делает срез
27 Лоботряс
 
17.08.12
10:28
Ну примерно так
ВЫБРАТЬ
   РегламентированныйПроизводственныйКалендарь.ДатаКалендаря

ИЗ
   РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
ГДЕ
   РазностьДат(&ДатаНач,РегламентированныйПроизводственныйКалендарь.ДатаКалендаря,"День")>&КолДней
   И (РегламентированныйПроизводственныйКалендарь.ВидДня = &РабочийДень
           ИЛИ РегламентированныйПроизводственныйКалендарь.ВидДня = &ПредпраздничныйДень)
;
28 pessok
 
17.08.12
10:31
(22) чем есть 5 записей в ВТ, из них берем максимум. чем это плохо?
29 Лоботряс
 
17.08.12
10:32
(27) +это то что ты хотел получить в (0), а вот что делает запрос, который в (0), я не знаю. Может в свете открывшихся фактов у тебя постановка задачи изменилась? :))
30 zzhiraf
 
17.08.12
10:33
(27) РазностьДат не учитывает выходные дни
31 pessok
 
17.08.12
10:34
(27) эээ. в твоем запросе выберутся ВСЕ дни, которые больше на &КолДней чем &ДатаНач
32 pessok
 
17.08.12
10:34
(30) +1
33 pessok
 
17.08.12
10:35
собственно код из (0) и (1) на самом деле из книги знаний :)
34 Лоботряс
 
17.08.12
10:41
(30) ну это от постановки задачи зависит. Автор же не указал что ему нужно, отобрать даты отстоящие на 5 дней от текущей и из них выбрать выходные или предпразничиные, или отстоящие на 5 выходных дней от текущей. Дальше я думаю сам доработает.
35 Cerera
 
17.08.12
10:44
(34)ха ха. в этом то и вся задача! что разность дат не канает а надо с учетом производственного календаря получить дату!! притом без кодинга!
36 pessok
 
17.08.12
10:47
(35) без кодинга никак. бери свой или мой код, формируй ТЗ и пихай в СКД
37 Cerera
 
17.08.12
10:50
(36)получается мне нужно вот что сделать:
1)сформировать основной запрос программы, для получения столбика количества столбцов
2)получить ТЗ и в цикле проставить Дату при помощи вызова той функции
3)прикрепить эту ТЗ в СКД и выполнить запрос ещё раз
так?
38 acsent
 
17.08.12
10:51
(35) без кодинга можно но будет тормозить
39 pessok
 
17.08.12
10:53
(37) нет. формируешь в пакете свою таблицу, помещаешь в ВТ, вторым запросом пакета получаешь даты, их тоже в ВТ, третьим запросом все это добро объединяешь. выгружаешь запрос. полученную ТЗ загоняешь в НаборДанных-Объект, а его уже выводишь зверю
40 Лоботряс
 
17.08.12
10:53
либо я че-то не понимаю, либо... по моему тут можно вполне 2-мя ВТ обойтись...
41 pessok
 
17.08.12
10:53
(38) без кодинга не можно, так как надо ВЫБРАТЬ Х делать...
42 Лоботряс
 
17.08.12
10:54
короче, пока не озвучите задачу, я пас...
43 acsent
 
17.08.12
10:55
(41) не надо, можно развернуть в соединения
44 acsent
 
17.08.12
10:56
но будет задача перенумеровать таблицу дат - а это долго
45 pessok
 
17.08.12
10:57
(44) просто это не нужно :)
46 Cerera
 
17.08.12
11:00
(42)я могу озвучить задачу. получить выборку где первый столбик будет остатку на дату, а второй столбик будет датой отстающей от заданной даты на число из первого столбика с учетом произв. календаря.
Если хочешь чтоб я придумал для чего это надо я скажу так. придумаю сказку:

На необитаемом острове нашли склад с продовольствием. В день из склада разрешается выносить только по одному экземпляру каждого товара. Получить даты кога закончится каждый из товаров с учетом произв. календаря.
47 pessok
 
17.08.12
11:02
(46) не жадничайте, купите Symphony :)
48 Лоботряс
 
17.08.12
11:06
млять... не ерничай, лучше разъясни что подразумевается по фразой "с учетом произв. календаря". Все твои беды от того что изначально не понимаешь чего хочешь. Если расписать задачу подробно, то сразу становиться понятно как ее решить.
49 pessok
 
17.08.12
11:07
(48) с учетом только рабочих дней
50 Cerera
 
17.08.12
11:09
(48)да. ну я считал что это и так очевидно. если регистр произв. календаря используется
51 Лоботряс
 
17.08.12
11:12
Получить остатки на одну дату или на таблицу дат?
52 Лоботряс
 
17.08.12
11:14
53 Cerera
 
17.08.12
11:15
(51)остатки на дату. а вот столбик чтоб второй показывал даты которые = ЗаданнаяДата+КоличествоОстатка с учетом только рабочих дней
54 pessok
 
17.08.12
11:16
в общем (52) + (1) двумя столбцами
55 Лоботряс
 
17.08.12
11:24
(54)Да. В качестве таблицы дат использовать пр. календарь со срезом последних по самому себе.
56 Cerera
 
17.08.12
11:25
(55)да. можно считать что задача решена. правда я пока не воспользуюсь этим методом надо сегодня отчет сделать а потом оптимизирую)