Объединение в запросах

  1. 9 г. назад
    14.05.2015 09:00:17 отредактировано Hans

    Есть простой запрос:

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

    Запрос показывает остатки и обороты за два периода. Запрос не хочет показывать начальные остатки почему то. Если во вложенном запросе убрать запрос по второму периоду - все показывает. Че за ххх?

    Ответы: (4) (33)
  2. скд??? там вроде где то чет указывать в скд надо если одним запросом по разным периодам получаешь...

  3. Не СКД. В обычном запроснике82 тоже не показывает начальные остатки.

    Ответы: (3) (15)
  4. (2) у меня показывает

    Ответы: (5)
  5. (0) А не пробовал периодичность "Регистратор" указать в 3-м объединении?:

    РегистрНакопления.ЗаказыПокупателей.Остатки(&ДатаКон2, ) КАК ЗаказыПокупателейОстатки) КАК ВложенныйЗапрос
    Ответы: (6)
  6. +(3) может у тебя их нет?

    Ответы: (6)
  7. (5)Остатки есть, все отчеты показывают, если в объединении оставить первый подзапрос - все показывает как надо.
    (4) Это остатки, там нет периодичности.

  8. и на разных платформах то же самое.

    Ответы: (8)
  9. Hans и на разных платформах то же самое

    попробуй использовать ISNULL - будешь удивлен результатом :-)

  10. а куда тут есть вставлять?

    Ответы: (11)
  11. везде, где количество

  12. Hans а куда тут есть вставлять?

    Ну сам подумай. В чем может быть разница при добавлении или "уборки" запроса в объединении? Только лишь в вероятном появлении NULL
    И ещё - убери "регистратор" как класс (а виртуальные таблицы сворачивай "по периоду") - и посмотри на эффект

  13. объясните, плиз, как может тут NULL появиться если тут ни одного соединения?

  14. Никак оно тут не может появиться.

  15. То что проблема с регистратором это да. От него как то зависит. Тут похоже малоизвестный всем механиз работы запроса.

    Ответы: (16)
  16. Hans В обычном запроснике82

    точно обычный?

  17. Hans Тут похоже малоизвестный всем механиз работы запроса.

    Да нет, все известно. Просто если что-то "не нужное", то его не нужно пихать всюду.

    В твоей задаче "регистратор" стопудово избыточен. Переделай запрос без него.

    Ответы: (17) (20)
  18. (16) Делаю отчет, просто сравнить остатки обороты за два периода. Да, в задаче небыло конкретизировано что регистратор нужен =) Но отчет без расшифровки по документам - это издевательство. Все отчеты должны быть с расшифровками.

    Ответы: (18)
  19. 14.05.2015 09:59:05 отредактировано avm3110

    Hans Все отчеты должны быть с расшифровками.

    В контексте "остатки по периодам" само понятие "регистратор" - нонсенс.
    Не нужно пробовать всегда скрещивать ужа с ежом ;)

    И опять же - Тебе "шашечки" или ехать? (с)

  20. для начала давайте все три таблицы выведем и посмотрим где там null и вообще
    ТС, можешь же в mxl зарепортить из консоли

    Ответы: (25)
  21. 14.05.2015 10:04:29 отредактировано КитайскийМуй

    avm3110 В твоей задаче "регистратор" стопудово избыточен. Переделай запрос без него.

    Не получится - будет ругаться на период, нужно будет хотя бы "Период" поставить.

    Ответы: (21)
  22. КитайскийМуй нужно будет хотя бы "Авто" поставить

    Э-э-э.. А ставить "онли регистратор" - это так религия велит? А иное она же "строго запрещает" - да ?

    Ответы: (22)
  23. 14.05.2015 10:11:12 отредактировано КитайскийМуй

    (21) Нет, конечно. Просто он использует "ВложенныйЗапрос.Период", а для этого нужно обязательно указать периодичность для ОстатковИОборотов.

    Ответы: (23)
  24. КитайскийМуй а для этого нужно обязательно указать периодичность для ОстатковИОборотов.

    Я не возражаю против правильности указания параметров виртуальных таблиц, я лишь отметил, что параметр "Регистратор" - явно не правильный в данном контексте.

  25. 14.05.2015 11:20:42 отредактировано ChMikle

    посмотри м.б. проблемы с представлением у тебя приход, расход выводится корректно ?

  26. (19) В виртуальных таблицах РН/РБ/РР не бывает значений ресурсов NULL

    Ответы: (26) (27) (30)
  27. (25) ну это понятно

  28. sapphire не бывает значений ресурсов NULL

    Ресурсов - да, измерений - запросто

  29. я уже в конец во всем запутался...

  30. ВложенныйЗапрос.КоличествоНачальныйОстаток1 КАК КоличествоНачальныйОстаток1,
    ВложенныйЗапрос.КоличествоКонечныйОстаток1 КАК КоличествоКонечныйОстаток1,
    попробуй

    ВложенныйЗапрос.КоличествоНачальныйОстаток1 КАК КоличествоНачальныйОстаток11,
    ВложенныйЗапрос.КоличествоКонечныйОстаток1 КАК КоличествоКонечныйОстаток11,

  31. (25) Бывает - в общих итогах.

    Ответы: (31)
  32. (30) Пример?

    Ответы: (32) (33)
  33. (31)Ключевое слово "общие итоги"
    Попробуй их сделать, когда в измерении "затешится" у тебя NULL - что после этого будет в общих итогах по ресурсу?

  34. 14.05.2015 12:33:24 отредактировано КитайскийМуй

    (31) вот результат запроса из (0)

    Безымянный.jpg

    На Период - не обращать внимание, там просто стоит:

    NULL КАК Период,
  35. вобщем вроде разобрался. Какой то есть ньюанс. Если поле "ИсхТаб" не использовать - получается какая то хрень непонятная с остатками. Это при объединении одних и тех же таблиц за разные периоду. Так же поле "период" нужно для правильного получения остатков по регистратору.

    ВЫБРАТЬ
    	ТоварыНаСкладахОстаткиИОбороты.Склад КАК Склад,
    	ТоварыНаСкладахОстаткиИОбороты.Номенклатура КАК Номенклатура,
    	ТоварыНаСкладахОстаткиИОбороты.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
    	ТоварыНаСкладахОстаткиИОбороты.СерияНоменклатуры КАК СерияНоменклатуры,
    	ТоварыНаСкладахОстаткиИОбороты.КоличествоНачальныйОстаток КАК КолНачОст1,
    	ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток КАК КолКонОст1,
    	ТоварыНаСкладахОстаткиИОбороты.КоличествоПриход КАК КолПриход1,
    	ТоварыНаСкладахОстаткиИОбороты.КоличествоРасход КАК КолРасход1,
    	0 КАК КоличествоОстатокПоЗаказам,
    	0 КАК КолНачОст2,
    	0 КАК КолКоНост2,
    	0 КАК КолПриход2,
    	0 КАК КолРасход2,
    	"Период 1" КАК ИсхТаб,
    	ТоварыНаСкладахОстаткиИОбороты.Регистратор КАК Регистратор,
    	ТоварыНаСкладахОстаткиИОбороты.Период
    {ВЫБРАТЬ
    	Склад.*,
    	Номенклатура.*,
    	ХарактеристикаНоменклатуры.*,
    	СерияНоменклатуры.*,
    	КолНачОст1,
    	КолКонОст1,
    	КолПриход1,
    	КолРасход1 КАК КолРасход1,
    	КоличествоОстатокПоЗаказам,
    	КолНачОст2,
    	КолКоНост2,
    	КолПриход2,
    	КолРасход2,
    	ИсхТаб,
    	Регистратор.*,
    	Период}
    ИЗ
    	РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&ДатаНач1, &ДатаКон1, Регистратор, , ) КАК ТоварыНаСкладахОстаткиИОбороты
    {ГДЕ
    	ТоварыНаСкладахОстаткиИОбороты.Склад.*,
    	ТоварыНаСкладахОстаткиИОбороты.Номенклатура.*,
    	ТоварыНаСкладахОстаткиИОбороты.ХарактеристикаНоменклатуры.*,
    	ТоварыНаСкладахОстаткиИОбороты.СерияНоменклатуры.*,
    	ТоварыНаСкладахОстаткиИОбороты.КоличествоНачальныйОстаток КАК КолНачОст1,
    	ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток КАК КолКонОст2,
    	ТоварыНаСкладахОстаткиИОбороты.КоличествоПриход КАК КолПриход1,
    	ТоварыНаСкладахОстаткиИОбороты.КоличествоРасход КАК КолРасход1,
    	("Период 1") КАК ИсхТаб,
    	ТоварыНаСкладахОстаткиИОбороты.Регистратор.*,
    	ТоварыНаСкладахОстаткиИОбороты.Период}
    
    ОБЪЕДИНИТЬ ВСЕ
    
    ВЫБРАТЬ
    	ТоварыНаСкладахОстаткиИОбороты.Склад,
    	ТоварыНаСкладахОстаткиИОбороты.Номенклатура,
    	ТоварыНаСкладахОстаткиИОбороты.ХарактеристикаНоменклатуры,
    	ТоварыНаСкладахОстаткиИОбороты.СерияНоменклатуры,
    	0,
    	0,
    	0,
    	0,
    	0,
    	ТоварыНаСкладахОстаткиИОбороты.КоличествоНачальныйОстаток,
    	ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток,
    	ТоварыНаСкладахОстаткиИОбороты.КоличествоПриход,
    	ТоварыНаСкладахОстаткиИОбороты.КоличествоРасход,
    	"Период 2",
    	ТоварыНаСкладахОстаткиИОбороты.Регистратор,
    	ТоварыНаСкладахОстаткиИОбороты.Период
    {ВЫБРАТЬ
    	Склад.*,
    	Номенклатура.*,
    	ХарактеристикаНоменклатуры.*,
    	СерияНоменклатуры.*,
    	КолНачОст1,
    	КолКонОст1,
    	КолПриход1,
    	КолРасход1,
    	КоличествоОстатокПоЗаказам,
    	КолНачОст2,
    	КолКоНост2,
    	КолПриход2,
    	КолРасход2,
    	ИсхТаб,
    	Регистратор.*,
    	Период}
    ИЗ
    	РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&ДатаНач2, &ДатаКон2, Регистратор, , ) КАК ТоварыНаСкладахОстаткиИОбороты
    {ГДЕ
    	ТоварыНаСкладахОстаткиИОбороты.Склад.*,
    	ТоварыНаСкладахОстаткиИОбороты.Номенклатура.*,
    	ТоварыНаСкладахОстаткиИОбороты.ХарактеристикаНоменклатуры.*,
    	ТоварыНаСкладахОстаткиИОбороты.СерияНоменклатуры.*,
    	ТоварыНаСкладахОстаткиИОбороты.КоличествоНачальныйОстаток КАК КолНачОст2,
    	ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток КАК КолКонОст2,
    	ТоварыНаСкладахОстаткиИОбороты.КоличествоПриход КАК КолПриход2,
    	ТоварыНаСкладахОстаткиИОбороты.КоличествоРасход КАК КолРасход2,
    	("Период 2") КАК ИсхТаб,
    	ТоварыНаСкладахОстаткиИОбороты.Регистратор.*,
    	ТоварыНаСкладахОстаткиИОбороты.Период}
    
    ОБЪЕДИНИТЬ ВСЕ
    
    ВЫБРАТЬ
    	ЗаказыПокупателейОстатки.ЗаказПокупателя.СкладГруппа,
    	ЗаказыПокупателейОстатки.Номенклатура,
    	ЗаказыПокупателейОстатки.ХарактеристикаНоменклатуры,
    	0,
    	0,
    	0,
    	0,
    	0,
    	ЗаказыПокупателейОстатки.КоличествоОстаток,
    	0,
    	0,
    	0,
    	0,
    	"ОстаткиПоЗаказам",
    	ЗаказыПокупателейОстатки.ЗаказПокупателя,
    	ЗаказыПокупателейОстатки.ЗаказПокупателя.Дата
    {ВЫБРАТЬ
    	Склад.*,
    	Номенклатура.*,
    	ХарактеристикаНоменклатуры.*,
    	СерияНоменклатуры.*,
    	Регистратор.*,
    	КолНачОст1,
    	КолКонОст1,
    	КолПриход1,
    	КолРасход1,
    	КоличествоОстатокПоЗаказам,
    	КолНачОст2,
    	КолКоНост2,
    	КолПриход2,
    	КолРасход2,
    	ИсхТаб,
    	Период}
    ИЗ
    	РегистрНакопления.ЗаказыПокупателей.Остатки(&ДатаКон2, ) КАК ЗаказыПокупателейОстатки
    {ГДЕ
    	ЗаказыПокупателейОстатки.ЗаказПокупателя.СкладГруппа.*,
    	ЗаказыПокупателейОстатки.Номенклатура.*,
    	ЗаказыПокупателейОстатки.ХарактеристикаНоменклатуры.*,
    	ЗаказыПокупателейОстатки.КоличествоОстаток КАК КоличествоОстатокПоЗаказам,
    	("ОстаткиПоЗаказам") КАК ИсхТаб,
    	ЗаказыПокупателейОстатки.ЗаказПокупателя.* КАК Регистратор,
    	ЗаказыПокупателейОстатки.ЗаказПокупателя.Дата КАК Период}
    {УПОРЯДОЧИТЬ ПО
    	Склад.*,
    	Номенклатура.*,
    	ХарактеристикаНоменклатуры.*,
    	СерияНоменклатуры.*,
    	КолНачОст1,
    	КолКонОст1,
    	КолПриход1,
    	КолРасход1 КАК КолРасход1,
    	КоличествоОстатокПоЗаказам,
    	КолНачОст2,
    	КолКоНост2,
    	КолПриход2,
    	КолРасход2,
    	ИсхТаб КАК ИсхТаб,
    	Регистратор.*,
    	Период}
    ИТОГИ
    	СУММА(КолНачОст1),
    	СУММА(КолКонОст1),
    	СУММА(КолПриход1),
    	СУММА(КолРасход1),
    	СУММА(КоличествоОстатокПоЗаказам),
    	СУММА(КолНачОст2),
    	СУММА(КолКоНост2),
    	СУММА(КолПриход2),
    	СУММА(КолРасход2)
    ПО
    	ОБЩИЕ
    {ИТОГИ ПО
    	Склад.*,
    	Номенклатура.*,
    	ХарактеристикаНоменклатуры.*,
    	СерияНоменклатуры.*,
    	ИсхТаб,
    	Период,
    	Регистратор.*}
    АВТОУПОРЯДОЧИВАНИЕ

    перед формированием отчета прописано

    Процедура СформироватьОтчет(ТабличныйДокумент) Экспорт
    	
    	// Перед формирование отчета можно установить необходимые параметры универсального отчета.
    	УниверсальныйОтчет.ПостроительОтчета.Параметры.Вставить("ДатаНач1", УниверсальныйОтчет.ДатаНач);
    	УниверсальныйОтчет.ПостроительОтчета.Параметры.Вставить("ДатаКон1", УниверсальныйОтчет.ДатаКон);
    	
    	УниверсальныйОтчет.ПостроительОтчета.Параметры.Вставить("ДатаНач2", ДатаНач2);
    	УниверсальныйОтчет.ПостроительОтчета.Параметры.Вставить("ДатаКон2", ДатаКон2);
    	
    	
    	//без поля исхтаб итоги по считаются криво
    		
    	ЕстьПолеИсхТаб = ЛОЖЬ;
    	Если НЕ ЕстьПолеИсхТаб Тогда 
    		Для каждого ВыбранноеПоле Из УниверсальныйОтчет.ПостроительОтчета.ВыбранныеПоля Цикл
    		
    			ЕстьПолеИсхТаб = Найти(ВыбранноеПоле.ПутьКДанным, "ИсхТаб") > 0;
    			Если ЕстьПолеИсхТаб Тогда
    				Прервать;
    			КонецЕсли;
    		
    		КонецЦикла;
    	КонецЕсли;
    	
    	Если НЕ ЕстьПолеИсхТаб Тогда 
    		Для каждого ВыбранноеПоле Из УниверсальныйОтчет.ПостроительОтчета.ИзмеренияСтроки Цикл
    		
    			ЕстьПолеИсхТаб = Найти(ВыбранноеПоле.ПутьКДанным, "ИсхТаб") > 0;
    			Если ЕстьПолеИсхТаб Тогда
    				Прервать;
    			КонецЕсли;
    		
    		КонецЦикла;
    	КонецЕсли;
    	
    	Если НЕ ЕстьПолеИсхТаб Тогда
    		
    		УниверсальныйОтчет.ПостроительОтчета.ВыбранныеПоля.Добавить("ИсхТаб", "ИсхТаб");
    		
    	КонецЕсли;
    	
    	УниверсальныйОтчет.СформироватьОтчет(ТабличныйДокумент,,, ЭтотОбъект);
    
    КонецПроцедуры // СформироватьОтчет()
    

    говорят есть инфа об этом в статье "Типичные проблемы при расчете остатков" на ИТС, но ИТС как всегда под рукой нет.

    Ответы: (35)
  36. Hans но ИТС как всегда под рукой нет

    Я пользуюсь ИТС через инет и не парюсь с дисками (логин и пароль нужно получить от франчей с которыми договор на ИТС)

  37. Я сам франь, в те редкие моменты когда нужет этот ИТС, паролей как всегда нет [smile=x_x]

    Ответы: (37) (38)
  38. Hans паролей как всегда нет

    Запомнить в браузере пароль - не предлагать? ;)

  39. (36) нет доступа на its.1c.ru ?

    Ответы: (39)
  40. (38)нет

или зарегистрируйтесь чтобы ответить!