Имя: Пароль:
1C
1С v8
СКД вопросы по оптимизации
0 Pirate_
 
03.05.12
15:46
Замечательная статья о курсах на дату цитата из нее:

Для этого создадим набор данных "Документы" - запрос:
ВЫБРАТЬ
   ЗаказПокупателя.Ссылка КАК ЗаказПокупателя,
   ЗаказПокупателя.Дата КАК Дата,
   ЗаказПокупателя.ВалютаДокумента КАК ВалютаДокумента,
   ЗаказПокупателя.СуммаДокумента КАК СуммаДокумента
{ВЫБРАТЬ
   ЗаказПокупателя.*,
   Дата,
   ВалютаДокумента.*,
   СуммаДокумента}
ИЗ
   Документ.ЗаказПокупателя КАК ЗаказПокупателя
{ГДЕ
   ЗаказПокупателя.Ссылка.* КАК ЗаказПокупателя,
   ЗаказПокупателя.СуммаДокумента}

Для того, чтобы потом успешно свзать наборы данных, в запрос необходимо включить поля "Дата" и "ВалютаДокумента". Чтобы они не появлялись в списке доступных полей, если это необходимо, их можно убрать, установив флажки ограничений в таблице "Поля" схемы компоновки. В остальном запрос вряд ли требует комментариев.
http://defender_aka_linn.users.photofile.ru/photo/defender_aka_linn/150041386/154871726.jpg

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

В этом запросе имеются 2 параметра: "Дата" и "Валюта". Эти параметры будут установлены СКД при соединении наборов. Кроме того, параметр "Дата" указан в выбранных полях - это нужно для соединения таблиц.
Для ненужный полей "Дата" и "Валюта" также устанавливаем флажки ограничений, чтобы они не появлялись в доступных полях.
http://defender_aka_linn.users.photofile.ru/photo/defender_aka_linn/150041386/154871728.jpg

Перейдем к соединению наборов. На странице "Связи наборов данных" добавим 2 связи:
1. Источник связи - набор "Документы", приемник - набор "Курсы валют". Выражение источник - "Дата", выражение приемник - "Дата", Параметр - "Дата"
2. Источник связи - набор "Документы", приемник - набор "Курсы валют". Выражение источник - "ВалютаДокумента", выражение приемник - "Валюта", Параметр - "Валюта"
http://defender_aka_linn.users.photofile.ru/photo/defender_aka_linn/150041386/154871729.jpg




Вопрос в следующем, как происходит в данном примере выборка из второго запроса? Формирутся отдельный запрос на каждую дату из первого запроса или формируется 1 на все? Если первый вариант, то при большом количестве данных система помрет от милиона запросов и как от этого избавиться при таком жерерультате, если второй вариант то обясните из чего это видно.

Заранее спасибо.
1 Pirate_
 
08.05.12
23:29
UP, может кто-то знает?
2 БибиГон
 
08.05.12
23:33
Вроде формируется один запрос, затем идет соединение по полям связи. имхо.
3 Лефмихалыч
 
09.05.12
00:27
(0) на каждые сколько-то там строк главного запроса формируется запрос для подчиненной таблицы. Пару лет назад я задавался проблемой вопроса и даже профайлер запустил в припадке любопытства.
А помрет-не помрет - зависит от того, что такое "большое количество данных" и что будет в подчиненном запросе.
4 Armando
 
09.05.12
03:00
(0) >>Формирутся отдельный запрос на каждую дату из первого запроса
Да. И на сколько сейчас помню, еще и на каждую валюту.

Тоже когда-то игрался профайлером/тех. журналом на эту тему.
Метод соединения наборов с передачей параметра очень хорошо работает в случае, например, когда надо получить курсы нескольких валют на определенную дату. Тогда во втором запросе надо вместо "Валюта = &Валюта" написать "Валюта В (&Валюта)" и на странице "Связи наборов данных" поставить галочку "Список параметров". Тогда будет только два запроса (один запрос на каждый набор данных).
5 Armando
 
09.05.12
03:07
+(4) В ситуациях подобных (0) лучше пользоваться временными таблицами, и избегать использования виртуальных таблиц регистров сведений. Иначе это как запрос в цикле получается. Типа плохая манера.
6 fisher
 
09.05.12
08:47
Несмотря на неоптимальность такого способа, СКД относительно шустро его отрабатывает. Я, когда пробовал, ожидал гораздо худшего результата. Так что в не слишком тяжелых отчетах можно смело использовать из-за простоты и красивости.
Лобовой способ с основной таблицей регистра и временными таблицами ессно шустрее и правильнее, хотя и гораздо более "развесистый"
7 Defender aka LINN
 
09.05.12
09:05
(5) А потом подлый пользователь берет, и выводит, сцуко, суммы в влютах, не интересуясь, сколько это в рублях. А мега-запрос все равно за каким-то фигом лопатит данные :)
8 Pirate_
 
16.05.12
12:39
Огромное стасибо всем. Особенно (3) и (4), очень помогли.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший