Запрос к регистру накоплений, остатки

57. пользователь 20.04.12 12:56
Сообщение было скрыто модератором.
...
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
58. stalker17 01.07.09 14:40 Сейчас в теме
Есть документ Приход, хочу выбрать его строки из табличной части, так, что бы к каждой строке привязать остаток на момент времени документа. Просто не понимаю как сделать. Если был бы чистый SQL, то тут два пути:
1.
sel ect pr.*, (sel ect kol_ost from Ostatki_na_moment_dokumenta).*
from doc_prihod pr

2.
sel ect pr.*, os.*
from doc_prihod
left join Ostatki_na_moment_dokumenta os on pr.nomenklatura = os.nomenklatura

:)

Как быть в 1С?

Подзапрос из первого варианта не дает сделать, говорит низяяяя писать ВЫБОР.
Левым соединением не получилось передать параметр в виртуальную таблицу Остатки(Приход.Ссылка) ругается на "Приход.Ссылка".

Как быть?
59. Душелов 4017 01.07.09 15:46 Сейчас в теме
>Как быть?

Изучать запросы типовых конфигураций.

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


В качестве параметра в запрос передаешь документ, дату документа и массив номенклатуры из его табличной части.
60. stalker17 01.07.09 15:55 Сейчас в теме
Неправильно вы меня поняли. Мне не нужно по конкретному документу (я быстро нашел и понял как это сделать), мне нужно получить массив документов, если есть возможность одним запросом и такую таблицу на выходе:

ДокНомер, ДокДата, ДокНоменклатура, ДокКоличество, ДокЦена, ОстатокПоДокументуКоличество

где поле ОстатокПоДокументуКоличество - это остаток на МоментВремени документа в данной строке, по номенклатуре в данной строке, без учета других разрезов регистра накопления.
61. Душелов 4017 01.07.09 16:09 Сейчас в теме
(3) в (2) убрать условие и параметры.
62. Ish_2 1104 01.07.09 18:14 Сейчас в теме
(2) На мой взгляд , это неверный подход к построению запросов.

В приведенном запросе вначале будет сделано левое соединение таблицы
документов с таблицей регистров (что очень и очень затратно) и полученная ,
возможно огромная, промежуточная таблица будет отфильрована по условию Док.Ссылка = &Ссылка.

Вначале нужно получить временную таблицу , содержащую табличную часть
указанного документа и лишь затем левым соединением с таблицей регистра получить итоговый результат.
63. I_G_O_R 69 01.07.09 19:22 Сейчас в теме
если все документы проведены, то нужно брать из ТоварыНаСкладах.ОстаткиИОброты
вот пример:

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


&ДатаНач и &ДатаКон это даты первого и последнего документа, а в регистраторе ищите свой документ
64. I_G_O_R 69 01.07.09 19:37 Сейчас в теме
Другой вариант:
соединить следующий запрос с табличной частью документа:
ВЫБРАТЬ РАЗРЕШЕННЫЕ
	ТоварыНаСкладахОстаткиИОбороты.Период,
	ТоварыНаСкладахОстаткиИОбороты.Номенклатура,
	ТоварыНаСкладахОстаткиИОбороты.КоличествоНачальныйОстаток
ИЗ
	РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&ДатаНач, &ДатаКон, Регистратор, , ) КАК ТоварыНаСкладахОстаткиИОбороты
Dima2711; +1 Ответить
65. Ish_2 1104 01.07.09 19:47 Сейчас в теме
(6)
Из (3) следует , что в итоговой таблице должен присутствовать реквизит Цена из табличной части документа.
У Вас он отсутствует.
66. Ish_2 1104 01.07.09 19:53 Сейчас в теме
(7) Документов за период множество.
В выходной таблице Вашего запроса отсутствует "Регистратор" и условие соединения построить невозможно.
67. Душелов 4017 01.07.09 19:54 Сейчас в теме
(6,7) В данном случае не будет нулевых остатков, если по ним не было движений за период.
68. I_G_O_R 69 01.07.09 19:59 Сейчас в теме
ВЫБРАТЬ РАЗРЕШЕННЫЕ
	ПоступлениеТоваровУслугТовары.Ссылка,
	ПоступлениеТоваровУслугТовары.Ссылка.Дата,
	ПоступлениеТоваровУслугТовары.Ссылка.Номер,
	ПоступлениеТоваровУслугТовары.Номенклатура,
	ПоступлениеТоваровУслугТовары.Количество,
	ЕСТЬNULL(ТоварыНаСкладахОстаткиИОбороты.КоличествоНачальныйОстаток, 0) КАК Остаток,
	ПоступлениеТоваровУслугТовары.Цена
ИЗ
	Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(, , Регистратор, , ) КАК ТоварыНаСкладахОстаткиИОбороты
		ПО ПоступлениеТоваровУслугТовары.Ссылка = ТоварыНаСкладахОстаткиИОбороты.Регистратор
			И ПоступлениеТоваровУслугТовары.Номенклатура = ТоварыНаСкладахОстаткиИОбороты.Номенклатура
Показать


так нормально????
69. I_G_O_R 69 01.07.09 20:00 Сейчас в теме
вообще-то подсказать могу бесплатно(ну или за плюсик), а работаю за деньги...
user1227891; +1 Ответить
70. Душелов 4017 01.07.09 20:02 Сейчас в теме
71. I_G_O_R 69 01.07.09 20:05 Сейчас в теме
(10) ЕСТЬNULL(ТоварыНаСкладахОстаткиИОбороты.КоличествоНачальныйОстаток, 0) КАК Остаток ТАК?
72. I_G_O_R 69 01.07.09 20:08 Сейчас в теме
вообще запрос выдран из типового отчета ВедомостьТоварыНаСкладах, при настройках:
в группировках - Номенклатура и ДокументДвижения
73. I_G_O_R 69 01.07.09 20:08 Сейчас в теме
и чуть-чуть модифицирован
74. Душелов 4017 01.07.09 20:12 Сейчас в теме
(15) Ведомость - да. Она показыват, что было на начало периода, что пришло/ушло... Нулевых остатков не будет, если не было движений за этот период.

А если нужно взять все документы прихода и посмотреть остаток на текущий день, то надо воспользоваться (4)
75. Ish_2 1104 01.07.09 20:15 Сейчас в теме
(11) Я , конечно , извинясь.
Но запрос неверный..
Нужно сделать две временных таблицы .
Первая должна быть получена из Документ.ПоступлениеТоваровИУслуг за период &ДатаНач,&ДатаКон
Вторая должна быть получена из РегистраНакопления за тот же период с полями Период,Регистратор,Номенклатура.

И лишь за тем эти две таблицы должны быть соединены левым соединением по условию

ПоступлениеТоваровУслугТовары.Ссылка = ТоварыНаСкладахОстаткиИОбороты.Регистратор
И ПоступлениеТоваровУслугТовары.Номенклатура = ТоварыНаСкладахОстаткиИОбороты.Номенклатура
76. I_G_O_R 69 01.07.09 20:20 Сейчас в теме
77. I_G_O_R 69 01.07.09 20:24 Сейчас в теме
1) берем запрос (11), вставляем в консоль отчетов, делаем отчет
2) открываем отчет ВедомостьПоТоварамНаСкладах: группировки Номенклатура, Регистратор
3) сравниваем и убеждаемся что все правильно
78. I_G_O_R 69 01.07.09 20:30 Сейчас в теме
напонятно что имел ввиду автор (4)
79. Ish_2 1104 01.07.09 20:30 Сейчас в теме
1. У Вас не задан период.
2. Левое соединение не с вирт. таблицей регистра , с временной таблицей которая получена из вирт.таблицы с явным указанием нужных полей Период,Регистратор, Номенклатура,НачОстаток.
80. Душелов 4017 01.07.09 20:30 Сейчас в теме
(20) Сравнивать надо не с ведомостью!.. см. в (17)
81. I_G_O_R 69 01.07.09 20:34 Сейчас в теме
понял, надо читать внимательнее:
Душелов пишет:
посмотреть остаток на текущий день
82. I_G_O_R 69 01.07.09 20:42 Сейчас в теме
(23) остатки то надо не на одну дату, а:


(3)
stalker17 пишет:

остаток на МоментВремени документа в данной строке
83. I_G_O_R 69 01.07.09 20:59 Сейчас в теме
84. I_G_O_R 69 01.07.09 21:13 Сейчас в теме
что-то маленькие картинки ;(
85. Душелов 4017 01.07.09 21:14 Сейчас в теме
(26) Введи новую номенклатуру. Оприходуй ее все и продай в прошлом месяце. Сделай отчет "ведомость по складам" за текущий месяц и посмотри, будет ли твоя новая номенклатура в отчете...
86. I_G_O_R 69 01.07.09 21:15 Сейчас в теме
(28) не будет, согласен, а если нет значит остаток 0
87. Душелов 4017 01.07.09 21:21 Сейчас в теме
(29) в (0)

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

Думаю, что 0 должен быть.
88. I_G_O_R 69 01.07.09 21:21 Сейчас в теме
ВЫБРАТЬ РАЗРЕШЕННЫЕ 
   ПоступлениеТоваровУслугТовары.Ссылка, 
   ПоступлениеТоваровУслугТовары.Ссылка.Дата, 
   ПоступлениеТоваровУслугТовары.Ссылка.Номер, 
   ПоступлениеТоваровУслугТовары.Номенклатура, 
   ПоступлениеТоваровУслугТовары.Количество, 
   ЕСТЬNULL(ТоварыНаСкладахОстаткиИОбороты.КоличествоНачальныйОстаток, 0) КАК Остаток,
   ПоступлениеТоваровУслугТовары.Цена 
ИЗ 
   Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары 
      ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(, , Регистратор, , ) КАК ТоварыНаСкладахОстаткиИОбороты 
      ПО ПоступлениеТоваровУслугТовары.Ссылка = ТоварыНаСкладахОстаткиИОбороты.Регистратор 
         И ПоступлениеТоваровУслугТовары.Номенклатура = ТоварыНаСкладахОстаткиИОбороты.Номенклатура
Показать


еще раз посмотри: в запрос попадут все записи из таблицы Документ.ПоступлениеТоваровУслуг.Товары и соединятся с ОстаткамиИОбротами, вот эта строчка:
ЕСТЬNULL(ТоварыНаСкладахОстаткиИОбороты.КоличествоНачальныйОстаток, 0) КАК Остаток
- если есть записи, вернет остаток, а если нет вернет 0
89. Ish_2 1104 01.07.09 22:18 Сейчас в теме
(31) В Вашем Запросе ВСЯ таблица "Документ.ПоступлениеТоваровУслуг.Товары "
левым соединением соединяется со ВСЕМ с регистром.

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

В какое место запроса вставите условие по ограничению для даты документов "ГДЕ ..." ?
90. I_G_O_R 69 01.07.09 22:40 Сейчас в теме
ну если вы не знаете азов, может надо начать с простейшего?
ВЫБРАТЬ
	ПоступлениеТоваровУслуг.Ссылка
ИЗ
	Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг
ГДЕ
	ПоступлениеТоваровУслуг.Дата МЕЖДУ &ДатаНач И &ДатаКон


если не знаете где руками вставить, то пользуйтесь Конструктором запросов, я им тоже пользуюсь.
для реальных таблиц на вкладке "Условия", для виртуальных - в параметрах таблицы.
По-моему это легкий запрос, вот лучше посмотрите конфигурацию "Зарплата и управление персоналом", модуль "Проведение расчетов", функция "ПолучитьДанныеДляРасчета", вот там есть где подумать...
ну если не сможете вставить условие, то напишите, обязательно помогу
91. Ish_2 1104 01.07.09 22:46 Сейчас в теме
(33) Спокойно. Давайте разбираться.
Условие "ГДЕ " для Даты нужно вставить в Ваш запрос (31) .
Вы куда его вставите ? В конец Вашего запроса ?
92. I_G_O_R 69 01.07.09 22:51 Сейчас в теме
С условиями:

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


а почему бы Вам не предложить свой вариант?
93. stalker17 01.07.09 23:00 Сейчас в теме
I_G_O_R пишет:

С условиями:

ГДЕ

   ПоступлениеТоваровУслугТовары.Ссылка.Дата МЕЖДУ &ДатаНач И &ДатаКон





Огромное спасибо! Не знал и не догадался, что в таблице ОстаткиИОбороты считают все промежуточные агрегатные значения для всех видов регистрации. Супер!

Из такой таблицы в легкую, по идее, OLAP кубик нарисовать можно!

Всем спасибо! Выручили.

PS. Может посоветуете что почитать человеку хорошо знающему 7.7 и работавшему с большими системами (Oracle, Microsoft Dynamics AX) по программированию в 8.1 ?
94. Ish_2 1104 01.07.09 23:09 Сейчас в теме
(35) Как будет работать Ваш запрос ?
Давайте разберем последовательность получения результирующей таблицы Вашего запроса с условием "ГДЕ".

Вначале будет выполнено левое соединение (внимание !) ВСЕЙ (без ограничения периода) таблицы
"Документ. ПоступлениеТоваровУслуг.Товары" с виртуальной таблицей регистра.
Затем из полученного соединения будет выбрана таблица с указанными Вами полями "Ссылка,Ссылка.Дата,..."
И лишь потом последняя таблица будет отфильтрована по дате (Ваше условие "Где").

Согласитесь , что такой алгоритм не оптимален.
Лучше вначале с отбором по дате из таблицы "Документ. ПоступлениеТоваровУслуг.Товары" получить временную таблицу.
И вот её то и соединять с вирт.таблицей регистра левым соединением.

Учитывая, что ВСЯ таблица "Документ. ПоступлениеТоваровУслуг.Товары" может быть очень большой ,Ваш запрос
может работать очень медленно.

Поэтому помещение в Вашем запросе условия "ГДЕ " в конец запроса - считается грубой ошибкой.
95. I_G_O_R 69 01.07.09 23:12 Сейчас в теме
я читал диски ИТС, Радченко(ксати скачал прямо с сайта 1С http://online.1c.ru/books/allbooks/enterprise/ стоит 25 р.), Профессиональная разработка в системе 1С:Предприятие - это большая дорогая книга, правда видел где в инете
96. Ish_2 1104 01.07.09 23:16 Сейчас в теме
I_G_O_R пишет:
а почему бы Вам не предложить свой вариант?


Свой вариант не приводил намеренно.
Считаю , что теперь Вы самостоятельно сможете написать правильный запрос.
97. I_G_O_R 69 01.07.09 23:18 Сейчас в теме
(37) ну да согласен, но временные таблицы не обязательно использовать, можно вложенный запрос,
а насчет грубой ошибки, у вас она еще грубее, потому-что у вас вообще нет решения
оптимизированный вариант:

ВЫБРАТЬ
	ВложенныйЗапрос.Ссылка,
	ВложенныйЗапрос.Дата,
	ВложенныйЗапрос.Номер,
	ВложенныйЗапрос.Номенклатура,
	ВложенныйЗапрос.Количество,
	ЕСТЬNULL(ТоварыНаСкладахОстаткиИОбороты.КоличествоНачальныйОстаток, 0) КАК Остаток,
	ВложенныйЗапрос.Цена
ИЗ
	(ВЫБРАТЬ
		ПоступлениеТоваровУслугТовары.Ссылка КАК Ссылка,
		ПоступлениеТоваровУслугТовары.Ссылка.Дата КАК Дата,
		ПоступлениеТоваровУслугТовары.Ссылка.Номер КАК Номер,
		ПоступлениеТоваровУслугТовары.Номенклатура КАК Номенклатура,
		ПоступлениеТоваровУслугТовары.Количество КАК Количество,
		ПоступлениеТоваровУслугТовары.Цена КАК Цена
	ИЗ
		Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
	ГДЕ
		ПоступлениеТоваровУслугТовары.Ссылка.Дата МЕЖДУ &ДатаНач И &ДатаКон) КАК ВложенныйЗапрос
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&ДатаНач, &ДатаКон, Регистратор, , ) КАК ТоварыНаСкладахОстаткиИОбороты
		ПО ВложенныйЗапрос.Ссылка = ТоварыНаСкладахОстаткиИОбороты.Регистратор
			И ВложенныйЗапрос.Номенклатура = ТоварыНаСкладахОстаткиИОбороты.Номенклатура
Показать
98. I_G_O_R 69 01.07.09 23:21 Сейчас в теме
99. Ish_2 1104 01.07.09 23:24 Сейчас в теме
(40) Да , ладно чего там.. Груб..еще грубее.
А вот как Вы считаете , не следует ли и к регистру обращаться не напрямую , а вначале сделать вложенный запрос и выбрать только нужные поля ?
100. stalker17 01.07.09 23:38 Сейчас в теме
Ish_2 а в 1С-ке что-то типа Плана запроса посмотреть можно? Я к чему, нормальный SQL сервер (MS SQL, Oracle) сам сначала сделает hash-фильтр по таблице документа и только потом будет присоединять. Это проверено. Можно ли в этом убедиться в 1С? Какие инструменты анализа запросов там присуствуют?
101. I_G_O_R 69 01.07.09 23:41 Сейчас в теме
(42) выдрано из типовой УТ:

Запрос.Текст = "
		|ВЫБРАТЬ РАЗРЕШЕННЫЕ
		|
		|	0 КАК ТипПериода,
		|	КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.ДоговорКонтрагента КАК Договор,
		|	ВЫБОР КОГДА СУММА(КонтрагентыВзаиморасчетыУпр.СуммаВзаиморасчетовКонечныйОстаток) = 0 ТОГДА 0
		|	ИНАЧЕ СУММА(КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.СуммаВзаиморасчетовКонечныйОстаток)*
		|		СУММА(КонтрагентыВзаиморасчетыУпр.СуммаУпрКонечныйОстаток)/
		|		СУММА(КонтрагентыВзаиморасчетыУпр.СуммаВзаиморасчетовКонечныйОстаток)
		|	КОНЕЦ КАК Долг,
		|	СУММА(КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.СуммаВзаиморасчетовКонечныйОстаток) КАК ДолгВзаиморасчеты,
		|	КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.Период КАК Период,
		|	КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.ДокументРасчетовСКонтрагентом.Дата КАК ДатаДок,
		|	КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.ДокументРасчетовСКонтрагентом КАК Док
		|	
		|ИЗ
		|	РегистрНакопления.ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.ОстаткиИОбороты(&НачПериода, &КонПериода, " + Периодичность + ", , ) КАК КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты
		|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыПереданные.Обороты КАК ОстаткиТоваровКомпанииОтданныеОбороты
		|		ПО КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.ДоговорКонтрагента = ОстаткиТоваровКомпанииОтданныеОбороты.ДоговорКонтрагента
		|		ЛЕВОЕ СОЕДИНЕНИЕ  РегистрНакопления.ВзаиморасчетыСКонтрагентами.ОстаткиИОбороты(&НачПериода, &КонПериода, " + Периодичность + ", , ) КАК КонтрагентыВзаиморасчетыУпр
		|		ПО КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.ДоговорКонтрагента = КонтрагентыВзаиморасчетыУпр.ДоговорКонтрагента
		|		И  КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.Период = КонтрагентыВзаиморасчетыУпр.Период
        |
		|ГДЕ
		|	КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.ДоговорКонтрагента.КонтролироватьЧислоДнейЗадолженности = ИСТИНА И
		|	КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.ДоговорКонтрагента.ВестиПоДокументамРасчетовСКонтрагентом
        |
		|СГРУППИРОВАТЬ ПО
		|	КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.ДокументРасчетовСКонтрагентом,
		|	КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.ДоговорКонтрагента,
		|	КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.Период";
	
	Если ФлагПредПериод Тогда
		Запрос.УстановитьПараметр("НачПредПериода", Новый Граница(НачалоПредПериода, ВидГраницы.Включая));
		Запрос.УстановитьПараметр("КонПредПериода", Новый Граница(КонецПредПериода, ВидГраницы.Включая));
		Запрос.Текст = Запрос.Текст + "
			|ОБЪЕДИНИТЬ
            |
			|ВЫБРАТЬ
			|
			|	1 КАК ТипПериода,
			|	КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.ДоговорКонтрагента КАК Договор,
			|	ВЫБОР КОГДА СУММА(КонтрагентыВзаиморасчетыУпр.СуммаВзаиморасчетовКонечныйОстаток) = 0 ТОГДА 0
			|	ИНАЧЕ СУММА(КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.СуммаВзаиморасчетовКонечныйОстаток)*
			|		СУММА(КонтрагентыВзаиморасчетыУпр.СуммаУпрКонечныйОстаток)/
			|		СУММА(КонтрагентыВзаиморасчетыУпр.СуммаВзаиморасчетовКонечныйОстаток)
			|	КОНЕЦ КАК Долг,
			|	СУММА(КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.СуммаВзаиморасчетовКонечныйОстаток) КАК ДолгВзаиморасчеты,
			|	КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.Период КАК Период,
			|	КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.ДокументРасчетовСКонтрагентом.Дата КАК ДатаДок,
			|	КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.ДокументРасчетовСКонтрагентом КАК Док
			|	
			|ИЗ
			|	РегистрНакопления.ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.ОстаткиИОбороты(&НачПредПериода, &КонПредПериода, " + Периодичность + ", , ) КАК КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты
			|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыПереданные.Обороты КАК ОстаткиТоваровКомпанииОтданныеОбороты
			|		ПО КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.ДоговорКонтрагента = ОстаткиТоваровКомпанииОтданныеОбороты.ДоговорКонтрагента
			|		ЛЕВОЕ СОЕДИНЕНИЕ  РегистрНакопления.ВзаиморасчетыСКонтрагентами.ОстаткиИОбороты(&НачПредПериода, &КонПредПериода, " + Периодичность + ", , ) КАК КонтрагентыВзаиморасчетыУпр
			|		ПО КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.ДоговорКонтрагента = КонтрагентыВзаиморасчетыУпр.ДоговорКонтрагента
			|		И  КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.Период = КонтрагентыВзаиморасчетыУпр.Период

	        |
			|ГДЕ
			|	КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.ДоговорКонтрагента.КонтролироватьЧислоДнейЗадолженности = ИСТИНА И
			|	КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.ДоговорКонтрагента.ВестиПоДокументамРасчетовСКонтрагентом
	        |
			|СГРУППИРОВАТЬ ПО
			|	КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.ДокументРасчетовСКонтрагентом,
			|	КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.ДоговорКонтрагента,
			|	КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.Период";
	КонецЕсли;
	Если ФлагАналогПериод Тогда
		Запрос.УстановитьПараметр("НачАналогПериода", Новый Граница(НачалоАналогПериода, ВидГраницы.Включая));
		Запрос.УстановитьПараметр("КонАналогПериода", Новый Граница(КонецАналогПериода, ВидГраницы.Включая));
		Запрос.Текст = Запрос.Текст + "
			|ОБЪЕДИНИТЬ
            |
			|ВЫБРАТЬ
			|
			|	2 КАК ТипПериода,
			|	КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.ДоговорКонтрагента КАК Договор,
			|	ВЫБОР КОГДА СУММА(КонтрагентыВзаиморасчетыУпр.СуммаВзаиморасчетовКонечныйОстаток) = 0 ТОГДА 0
			|	ИНАЧЕ СУММА(КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.СуммаВзаиморасчетовКонечныйОстаток)*
			|		СУММА(КонтрагентыВзаиморасчетыУпр.СуммаУпрКонечныйОстаток)/
			|		СУММА(КонтрагентыВзаиморасчетыУпр.СуммаВзаиморасчетовКонечныйОстаток)
			|	КОНЕЦ КАК Долг,
			|	СУММА(КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.СуммаВзаиморасчетовКонечныйОстаток) КАК ДолгВзаиморасчеты,
			|	КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.Период КАК Период,
			|	КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.ДокументРасчетовСКонтрагентом.Дата КАК ДатаДок,
			|	КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.ДокументРасчетовСКонтрагентом КАК Док
			|	
			|ИЗ
			|	РегистрНакопления.ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.ОстаткиИОбороты(&НачАналогПериода, &КонАналогПериода, " + Периодичность + ", , ) КАК КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты
			|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыПереданные.Обороты КАК ОстаткиТоваровКомпанииОтданныеОбороты
			|		ПО КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.ДоговорКонтрагента = ОстаткиТоваровКомпанииОтданныеОбороты.ДоговорКонтрагента
			|		ЛЕВОЕ СОЕДИНЕНИЕ  РегистрНакопления.ВзаиморасчетыСКонтрагентами.ОстаткиИОбороты(&НачАналогПериода, &КонАналогПериода, " + Периодичность + ", , ) КАК КонтрагентыВзаиморасчетыУпр
			|		ПО КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.ДоговорКонтрагента = КонтрагентыВзаиморасчетыУпр.ДоговорКонтрагента
			|		И  КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.Период = КонтрагентыВзаиморасчетыУпр.Период
	        |
			|ГДЕ
			|	КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.ДоговорКонтрагента.КонтролироватьЧислоДнейЗадолженности = ИСТИНА И
			|	КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.ДоговорКонтрагента.ВестиПоДокументамРасчетовСКонтрагентом
	        |
			|СГРУППИРОВАТЬ ПО
			|	КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.ДокументРасчетовСКонтрагентом,
			|	КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.ДоговорКонтрагента,
			|	КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.Период";
	КонецЕсли;
Показать


позвони им и скажи что у них все неправильно
102. I_G_O_R 69 01.07.09 23:43 Сейчас в теме
(43) согласен, 1С сама пишет, что SQL сервер может вообще по-дугому запрос выполнить, MS тоже планы использует
103. I_G_O_R 69 01.07.09 23:45 Сейчас в теме
(43), технологический журнал, можно например посмотреть сколько времени выполнялся запрос, сам не много про него знаю
104. I_G_O_R 69 01.07.09 23:48 Сейчас в теме
(46) документация по нему можно найти в c:\Program Files\1cv81\AddDoc\RU\V8AddDoc81.htm и на ИТС, на диске ИТС есть обработка НастройкаТехнологическогоЖурнала.epf
105. I_G_O_R 69 01.07.09 23:53 Сейчас в теме
ГДЕ КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.ДоговорКонтрагента.КонтролироватьЧислоДнейЗадолженности = ИСТИНА - как то странно они пишут, сам удивлен, по моему опыту семерошники так пишут по привычке
106. Ish_2 1104 01.07.09 23:57 Сейчас в теме
(45) Я всего лишь задал вопрос в (43) .
И, кстати говоря, одназначно в данном конкретном случае ответить не могу.
Склоняюсь , что все-таки что лучше делать вложеный запрос.
(44) Инструменты анализа запроса в 1с Предприятие 8 мне неизвестны. Другим думаю тоже.

От 1сПредприятия 8 на вход SQL-сервера поступают SQL-запросы. Как он их интерпретирует -
одному Богу известно.
И насколько мне известно , MS не документирует описание внутреннего оптимизатора запросов в
SQl-сервере. И , строго говоря , мы не знаем как он их будет исполнять.
Думаю , следует избегать написания "километровых" запросов.
Я так и поступаю. И разбиваю большой запрос на мелкие (т.е. создаю временные таблицы и затем их соединяю).
По крайней мере на небольших и ясных запросах неожиданностей от SQL-сервера меньше.
107. I_G_O_R 69 02.07.09 00:13 Сейчас в теме
ксати посмотрел модули наборов записей регистров накопления, там куча соединений и ГДЕ стоит в конце, так что спорный вопрос, где нужно ставить условие, поэтому считаю если самим 1С можно так писать, то нам тем более, можно поинтересоваться у Гилева, вроде как он спец по крупным внедрениям, я то не в москве живу, чтоб 500 пользователей у нас работало, таких случаев не знаю
108. I_G_O_R 69 02.07.09 00:19 Сейчас в теме
короче я спать, всем удачи!
109. Ish_2 1104 02.07.09 00:22 Сейчас в теме
(50) А почему бы не проверить ? Я даже никогда не задумывался над проверкой
- считал это совершенно очевидным.
Таблица Документа должна быть большой. Период очень маленьким (1 день).
И сравнить два варианта соединения с условием "ГДЕ " в конце и вариант с вложенным запросом.
110. Ish_2 1104 02.07.09 00:50 Сейчас в теме
+52 Потому что описывая порядок исполнения запроса с условием "ГДЕ " на конце я исходил из тупого варианта
(отуствия оптимизатора запроса) , но такой запрос , будучи подан в SQL-сервер вполне
может быть оптимизирован и по быстродействию не уступит варианту с вложенным запросом.

Если же используется файловый режим (внутренний 1с-формат) , то работает ли там оптимизатор запроса и как ?
я не знаю.
Давно обжегшись на быстродействии запросов , я просто взял за правило не надеяться
ни на какие оптимизаторы и писать запросы так , чтобы их не нужно было оптимизировать.
Вот так обстоит дело.
111. I_G_O_R 69 02.07.09 08:39 Сейчас в теме
(50) вот Вы и проверьте и нам потом расскажите,
а мне вариант (35) нравится больше чем (40),
интересно, что скажут нам Топ-100
112. Ish_2 1104 02.07.09 09:24 Сейчас в теме
(54) Ждать , что кто-то что-то скажет ?
Жаль...
Дальнейшее исследование предполагало еще 2-3 интересных поворота.
Ок.
113. I_G_O_R 69 02.07.09 09:28 Сейчас в теме
(55) мне сейчас уже некогда исследовать, надо на работу идти, вечером буду исследовать
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот