Имя: Пароль:
1C
1С v8
Как в одном запросе обратиться сразу к трем документам?
0 Надежда25
 
04.06.12
13:50
Добрый день!
Есть документ "Инвентаризация незавершенного производства". Формируется каждый месяц для каждого подразделения. В отчет надо выводить данные последнего документа по каждому подразделению.
Не знаю, как можно в одном запросе обратиться сразу к трем документам, каждый из которых по дате близок к сегодняшней?
Когда было одно подразделение, дату вносила вручную, а запрос был таким:
ВЫБРАТЬ
   ИнвентаризацияНЗПМатериалы.Ссылка,
   ИнвентаризацияНЗПМатериалы.Номенклатура КАК Сырье,
   ИнвентаризацияНЗПМатериалы.Количество КАК КоличествоНачОстаток
ПОМЕСТИТЬ ТабЧасть
ИЗ
   Документ.ИнвентаризацияНЗП.Материалы КАК ИнвентаризацияНЗПМатериалы
ГДЕ
   ИнвентаризацияНЗПМатериалы.Ссылка.Дата >= &Дата;

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

////////////////////////////////////////////////////////////////////////////////
УНИЧТОЖИТЬ ТабЧасть
1 butterbean
 
04.06.12
13:54
условие с датой какое-то непонятное... как и весь запрос
условие на подразделение нельзя что-ли установить?? по аналогии с датой
2 Джинн
 
04.06.12
13:56
> каждый из которых по дате близок к сегодняшней

Насколько близок? За май 1812 года - это еще близко, или уже далеко?

PS Вы какими-то не программерскими терминами оперируете.
3 Надежда25
 
04.06.12
13:59
Вообще-то да, можно сделать параметр "Подразделение". А как указать явно?
Дата - последняя введенная.
4 butterbean
 
04.06.12
14:04
(3) что значит "как указать явно?"??
с датой понятней не стало
5 Надежда25
 
04.06.12
14:12
Есть документы "Инвентаризация незавершенного производства", подразделение 1, от 31.01.2012,
от 29.02.2012, 01.04.2012;
подразделение 2 от 31.01.2012, от 29.02.2012, 30.03.2012;
подразделение 3 от 31.01.2012, от 29.02.2012, 31.03.2012. Надо выбрать данные из трех документов: подразделение 1 от 01.04.2012, подразделение 2 от 30.03.2012, подразделение 3 от 31.03.2012.
"Указать явно" - сразу в запросе:
ГДЕ
   ИнвентаризацияНЗП.Подразделение.Наименование = "1".
6 sapphire
 
04.06.12
14:12
(0) Задача разбивается на 2:
1. Для каждого подразделения получить документ ближайший к дате.
2. Вывести данные табличной части документов из пункта 1.

По п. 1 если  документ "Инвентаризация незавершенного производства" содержит реквизит "Подраздление", тогда
текст запроса будет выглядеть следующим образом
select
   Документы.Подразделение
  ,Документы.Ссылка
  ,Документы.Дата
  ,ТЧМатериалы.Номенклатура Сырье
  ,ТЧМатериалы.Количество КАК КоличествоНачОстаток
from
(
select
 ЗапросБлижайшихДатДокументов.Подразделение
,ЗапросБлижайшихДатДокументов.Дата
,MAX(ИнвентаризацияНЗП_Реквизиты.Ссылка) Ссылка
from
(
select // этот подзапрос вернет ближайшую дату по подразделению
  Подразделение
 ,MAX(Дата) Дата
FROM
 Документ.ИнвентаризацияНЗП   ИнвентаризацияНЗП_Реквизиты
WHERE
 Дата<=&Дата
GROUP BY
 Подразделение
) ЗапросБлижайшихДатДокументов
INNER JOIN Документ.ИнвентаризацияНЗП   ИнвентаризацияНЗП_Реквизиты
ON ИнвентаризацияНЗП_Реквизиты.Подразделение=ЗапросБлижайшихДатДокументов.Подразделение AND ИнвентаризацияНЗП_Реквизиты.Дата=ЗапросБлижайшихДатДокументов.Дата

GROUP BY
 ЗапросБлижайшихДатДокументов.Подразделение
,ЗапросБлижайшихДатДокументов.Дата
) Документы
INNER JOIN Документ.ИнвентаризацияНЗП.Материалы ТЧМатериалы
ON ТЧМатериалы.Ссылка=Документы.Ссылка
7 AaNnDdRrEeYy
 
04.06.12
14:13
вот так попробуй, естественно напиши синтаксически правильно

[code]
выбрать первые 1
ИнвентаризацияНЗПМатериалы.Ссылка,
Максимум(ИнвентаризацияНЗПМатериалы.Дата)
поместить последнийдокумент
из Документ.ИнвентаризацияНЗП.Материалы КАК ИнвентаризацияНЗПМатериалы
где
ИнвентаризацияНЗПМатериалы.Подразделение = &Подразделени

//////////////////

ВЫБРАТЬ
   ИнвентаризацияНЗПМатериалы.Ссылка,
   ИнвентаризацияНЗПМатериалы.Номенклатура КАК Сырье,
   ИнвентаризацияНЗПМатериалы.Количество КАК КоличествоНачОстаток
ПОМЕСТИТЬ ТабЧасть
ИЗ
   Документ.ИнвентаризацияНЗП.Материалы КАК ИнвентаризацияНЗПМатериалы
ГДЕ
   ИнвентаризацияНЗПМатериалы.Ссылка.Дата >= &Дата и

ИнвентаризацияНЗПМатериалы.Ссылка в (последнийдокумент.Ссылка)
////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
   ТабЧасть.Сырье,
   ТабЧасть.КоличествоНачОстаток,
   ИнвентаризацияНЗП.Дата КАК Дата,
   ИнвентаризацияНЗП.Ссылка КАК Документ
//    ТабЧасть.Ссылка

   
ИЗ
   Документ.ИнвентаризацияНЗП КАК ИнвентаризацияНЗП
       ЛЕВОЕ СОЕДИНЕНИЕ ТабЧасть КАК ТабЧасть
       ПО (ТабЧасть.Ссылка = ИнвентаризацияНЗП.Материалы.Ссылка)
;

////////////////////////////////////////////////////////////////////////////////

УНИЧТОЖИТЬ ТабЧасть
[/code]
8 AaNnDdRrEeYy
 
04.06.12
14:14
(7) в первом запросе пакета еще сгруппировать надо по ссылке и максимум(дата)
9 sapphire
 
04.06.12
14:15
(7) НАФИГА?!
10 AaNnDdRrEeYy
 
04.06.12
14:17
(6)MAX(ИнвентаризацияНЗП_Реквизиты.Ссылка) Ссылка что вернет эта строка запроса?
максимум по ссылке нифига не максимум по дате
11 sapphire
 
04.06.12
14:23
(10) Или ты невнимательно смотрел мой запрос, или....
12 sapphire
 
04.06.12
14:26
(10) Там дата УЖЕ выбрана максимальной, если ты не заметил.
Речь о том, что на одну и ту же дату может быть несколько документов, с учетом того КАК 1С генерит УИДы MAX(ИнвентаризацияНЗП_Реквизиты.Ссылка) вернет самый последний документ. Таким образом, этот подзапрос возвращает одну ссылку, одну дату для подразделения.
13 Надежда25
 
04.06.12
15:38
(6) Спасибо большое за ответ. Буду разбираться в вашем запросе. Пока что скопировала его буквально и:
{(2, 2)}: Поле не найдено "ИнвентаризацияНЗП.Подразделение"
<<?>>ИнвентаризацияНЗП.Подразделение,
14 sapphire
 
04.06.12
15:40
(13) см в (6)
<B>если  документ "Инвентаризация незавершенного производства" содержит реквизит "Подраздление", тогда</B>
15 sapphire
 
04.06.12
15:40
(13) Какой реквизит в документе отличает одно подразделение от другого?
16 sapphire
 
04.06.12
15:46
// Конфигурация Бухгалтерия
select
   Документы.Подразделение ПодразделениеОрганизации
  ,Документы.Ссылка
  ,Документы.Дата
  ,ТЧМатериалы.Номенклатура Сырье
  ,ТЧМатериалы.Количество КАК КоличествоНачОстаток
from
(
select
 ЗапросБлижайшихДатДокументов.Подразделение
,ЗапросБлижайшихДатДокументов.Дата
,MAX(ИнвентаризацияНЗП_Реквизиты.Ссылка) Ссылка
from
(
select // этот подзапрос вернет ближайшую дату по подразделению

  ПодразделениеОрганизации Подразделение
 ,MAX(Дата) Дата
FROM
 Документ.ИнвентаризацияНЗП   ИнвентаризацияНЗП_Реквизиты
WHERE
 Дата<=&Дата
GROUP BY
 ПодразделениеОрганизации
) ЗапросБлижайшихДатДокументов
INNER JOIN Документ.ИнвентаризацияНЗП   ИнвентаризацияНЗП_Реквизиты
ON ИнвентаризацияНЗП_Реквизиты.Подразделение=ЗапросБлижайшихДатДокументов.Подразделение AND ИнвентаризацияНЗП_Реквизиты.Дата=ЗапросБлижайшихДатДокументов.Дата

GROUP BY
 ЗапросБлижайшихДатДокументов.Подразделение
,ЗапросБлижайшихДатДокументов.Дата
) Документы
INNER JOIN Документ.ИнвентаризацияНЗП.Материалы ТЧМатериалы
ON ТЧМатериалы.Ссылка=Документы.Ссылка
17 Надежда25
 
04.06.12
15:46
Исправила: ИнвентаризацияНЗП.Подразделение.Наименование КАК Подразделение,
Все равно та же ошибка
18 sapphire
 
04.06.12
15:50
(17) см (16)
19 sapphire
 
04.06.12
15:52
(17) У Вас реквизит как-то по-другому называется, т.е. его имя!="Подразделение",
вариантов 2: в Бухгалтерии вроде как для этого документа есть реквизит "ПодразделениеОрганизации" (взято с просторов инета ибо нет типовых конфигураций под рукой), либо "ПодразделениеЗатрат"
20 Надежда25
 
04.06.12
15:55
У меня УПП - так и называется: Подразделение. Только что проверила.
21 sapphire
 
04.06.12
15:57
(20) Это оно на форме так называется, а вот как оно называется в реквизитах документа?
22 Надежда25
 
04.06.12
15:59
Увы, также.
23 sapphire
 
04.06.12
16:03
(22) По-пробуйте заменить в запросе "Подразделение" на то как указано в конфигураторе, возможно, что где то опечатка
24 sapphire
 
04.06.12
16:04
(22) Консоль запросов имеется?
25 Надежда25
 
04.06.12
16:11
Пробовала и в консоле, копировала из конфигуратора, все то же.
Неудобно Вас больше мучать, буду сама искать, за основное - спасибо.
26 Buster007
 
04.06.12
16:24
(16) ужас.
27 sapphire
 
04.06.12
16:24
(25) Нестрашно. Раз есть консоль постараюсь объяснить логику и способ отладки запроса в (6) по-шагам.
1. В консоли конструктором из документа "ИнвентаризацияНЗП" выбираем поле подразделение и дата
должны получить что-то вида
 ВЫБРАТЬ
   ИнвентаризацияНЗП.Дата,
   ИнвентаризацияНЗП.{Имя поля подразделения, как оно задано в кофигураторе}
 ИЗ
   Документ.ИнвентаризацияНЗП КАК ИнвентаризацияНЗП

Дописываем MAX к дате и группируем:


 ВЫБРАТЬ
   MAX(ИнвентаризацияНЗП.Дата) Дата,
   ИнвентаризацияНЗП.{Имя поля подразделения, как оно задано в кофигураторе}
 ИЗ
   Документ.ИнвентаризацияНЗП КАК ИнвентаризацияНЗП
 GROUP BY
       ИнвентаризацияНЗП.{Имя поля подразделения, как оно задано в кофигураторе}

 Добавляем условие
 
 ВЫБРАТЬ
   MAX(ИнвентаризацияНЗП.Дата) Дата,
   ИнвентаризацияНЗП.{Имя поля подразделения, как оно задано в кофигураторе}
 ИЗ
   Документ.ИнвентаризацияНЗП КАК ИнвентаризацияНЗП
 ГДЕ ИнвентаризацияНЗП.Дата<=&Дата
 GROUP BY
       ИнвентаризацияНЗП.{Имя поля подразделения, как оно задано в кофигураторе}

Этот запрос вернет нам Дату документа , ближайшего к &Дата для каждого подразделения, у которого хоть когда-либо была ИНЗП.

Далее, получим последний документ
28 Dmitry77
 
04.06.12
16:31
все не осилил, а задать спикок документов на форме, а потом его тянуть в запрос почему нельзя?
29 Надежда25
 
04.06.12
16:35
Спасибо. А моя ошибка была в том, что я во второй строке запроса вместо:     Документы.Подразделение
писала: ИнвентаризацияНЗП.Подразделение.
Сейчас все работает.
30 sapphire
 
04.06.12
16:36
+(27) К "огороду"
ВЫБРАТЬ
   MAX(ИнвентаризацияНЗП.Дата) Дата,
   ИнвентаризацияНЗП.{Имя поля подразделения, как оно задано в конфигураторе}
 ИЗ
   Документ.ИнвентаризацияНЗП КАК ИнвентаризацияНЗП
 ГДЕ ИнвентаризацияНЗП.Дата<=&Дата
 GROUP BY
      ИнвентаризацияНЗП.{Имя поля подразделения, как оно задано в конфигураторе}

вверху пишем ВЫБРАТЬ * ИЗ и ставим открывающую скобку - внизу закрывающую и пишем ЗапросБлижайшихДатДокументов :
ВЫБРАТЬ
*
ИЗ
(
ВЫБРАТЬ
   MAX(ИнвентаризацияНЗП.Дата) Дата,
   ИнвентаризацияНЗП.{Имя поля подразделения, как оно задано в конфигураторе}
 ИЗ
   Документ.ИнвентаризацияНЗП КАК ИнвентаризацияНЗП
 ГДЕ ИнвентаризацияНЗП.Дата<=&Дата
 GROUP BY
      ИнвентаризацияНЗП.{Имя поля подразделения, как оно задано в конфигураторе}
) ЗапросБлижайшихДатДокументов

Соединим результат запроса с таблицей документов.



ВЫБРАТЬ
*
ИЗ
(
ВЫБРАТЬ
   MAX(ИнвентаризацияНЗП.Дата) Дата,
   ИнвентаризацияНЗП.{Имя поля подразделения, как оно задано в конфигураторе}
 ИЗ
   Документ.ИнвентаризацияНЗП КАК ИнвентаризацияНЗП
 ГДЕ ИнвентаризацияНЗП.Дата<=&Дата
 GROUP BY
      ИнвентаризацияНЗП.{Имя поля подразделения, как оно задано в конфигураторе}
) ЗапросБлижайшихДатДокументов
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ИнвентаризацияНЗП ИнвентаризацияНЗП
ПО ИнвентаризацияНЗП.{Имя поля подразделения, как оно задано в конфигураторе}=ЗапросБлижайшихДатДокументов.{Имя поля подразделения, как оно задано в конфигураторе}
И ИнвентаризацияНЗП.Дата=ЗапросБлижайшихДатДокументов.Дата

//
Здесь необходимо учесть, что на дату теоретически для каждого подразделения может быть несколько документов,
а нам нужен последний.

Применим агрегирующую функцию MAX к полю Ссылка таблицы ИнвентаризацияНЗП:
вместо * напишем
ЗапросБлижайшихДатДокументов.{Имя поля подразделения, как оно задано в конфигураторе}
,ЗапросБлижайшихДатДокументов.Дата
,MAX(ИнвентаризацияНЗП.Ссылка) КАК Ссылка

и внизу допишем группировки
GROUP BY
ЗапросБлижайшихДатДокументов.{Имя поля подразделения, как оно задано в конфигураторе}
,ЗапросБлижайшихДатДокументов.Дата

Получится:


ВЫБРАТЬ
ЗапросБлижайшихДатДокументов.{Имя поля подразделения, как оно задано в конфигураторе}
,ЗапросБлижайшихДатДокументов.Дата
,MAX(ИнвентаризацияНЗП.Ссылка) КАК Ссылка
ИЗ
(
ВЫБРАТЬ
   MAX(ИнвентаризацияНЗП.Дата) Дата,
   ИнвентаризацияНЗП.{Имя поля подразделения, как оно задано в конфигураторе}
 ИЗ
   Документ.ИнвентаризацияНЗП КАК ИнвентаризацияНЗП
 ГДЕ ИнвентаризацияНЗП.Дата<=&Дата
 GROUP BY
      ИнвентаризацияНЗП.{Имя поля подразделения, как оно задано в конфигураторе}
) ЗапросБлижайшихДатДокументов
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ИнвентаризацияНЗП ИнвентаризацияНЗП
ПО ИнвентаризацияНЗП.{Имя поля подразделения, как оно задано в конфигураторе}=ЗапросБлижайшихДатДокументов.{Имя поля подразделения, как оно задано в конфигураторе}
И ИнвентаризацияНЗП.Дата=ЗапросБлижайшихДатДокументов.Дата
GROUP BY
ЗапросБлижайшихДатДокументов.{Имя поля подразделения, как оно задано в конфигураторе}
,ЗапросБлижайшихДатДокументов.Дата

// Этот запрос вернет уже ссылку на документ, ближайший к &Дата для подразделения.
Остается только соединить полученные ссылки с таблицей табличной части и ввуаля :
ВЫБРАТЬ
   Документы.Подразделение ПодразделениеОрганизации
  ,Документы.Ссылка
  ,Документы.Дата
  ,ТЧМатериалы.Номенклатура Сырье
  ,ТЧМатериалы.Количество КАК КоличествоНачОстаток
ИЗ
(
ВЫБРАТЬ
ЗапросБлижайшихДатДокументов.{Имя поля подразделения, как оно задано в конфигураторе}
,ЗапросБлижайшихДатДокументов.Дата
,MAX(ИнвентаризацияНЗП.Ссылка) КАК Ссылка
ИЗ
(
ВЫБРАТЬ
   MAX(ИнвентаризацияНЗП.Дата) Дата,
   ИнвентаризацияНЗП.{Имя поля подразделения, как оно задано в конфигураторе}
 ИЗ
   Документ.ИнвентаризацияНЗП КАК ИнвентаризацияНЗП
 ГДЕ ИнвентаризацияНЗП.Дата<=&Дата
 GROUP BY
      ИнвентаризацияНЗП.{Имя поля подразделения, как оно задано в конфигураторе}
) ЗапросБлижайшихДатДокументов
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ИнвентаризацияНЗП ИнвентаризацияНЗП
ПО ИнвентаризацияНЗП.{Имя поля подразделения, как оно задано в конфигураторе}=ЗапросБлижайшихДатДокументов.{Имя поля подразделения, как оно задано в конфигураторе}
И ИнвентаризацияНЗП.Дата=ЗапросБлижайшихДатДокументов.Дата
GROUP BY
ЗапросБлижайшихДатДокументов.{Имя поля подразделения, как оно задано в конфигураторе}
,ЗапросБлижайшихДатДокументов.Дата
) Документы
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ИнвентаризацияНЗП.Материалы ТЧМатериалы
ПО ТЧМатериалы.Ссылка=Документы.Ссылка
31 sapphire
 
04.06.12
16:38
(29) Написанное в (6) носило предположительный характер, а весь огород в (27) и (30) нужен только для того, что бы уметь быстро отладить неработающий запрос.
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший