Read professional hostgator reviews wrote by customers. Also check out these great inmotion reviews web hosting.

Виртуальные таблицы регистров и секция ГДЕ

Создано 14 Январь 2013
Автор: Дмитрий Котельников

При использовании в запросах 1С 8 виртуальных таблиц с условиями и одновременно секции ГДЕ стоит быть предельно внимательным, ведь результат может оказаться неожиданным...

Нам часто приходиться использовать виртуальные таблицы (СрезПервых, СрезПоследних, Остатки, ОстаткиИОбороты и т.д.) в запросах - это существенно сокращает текст, а задание наибольшего количество параметров виртуальной таблицы является моментом прямой оптимизации. Но важно всегда помнить, что виртуальные таблицы не существуют в базе, это механизм предоставляемый нам платформой, вся работа которого сводится к предварительной оптимальной выборке записей отфильтрованных по конкретным параметрам из объемных таблиц регистров накопления/бухгалтерии/сведений. Используя секцию ГДЕ в запросе стоит понимать, что фильтровать мы будем данные не из реальной таблицы, а из уже отфильтрованной. В принципе все это очевидно и, как правило, все фильтры, касающиеся виртуальной таблицы, можно и нужно перенести в ее параметры. Но если вы хотите наложить условие на ресурс регистра накопления или бухгалтерии, то в параметрах вам это не удастся и придется использовать секцию ГДЕ. В такой ситуации будьте внимательны и помните, что накладываете условие не на реальную таблицу.

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

Виртуальные таблицы регистров сведений и секция ГДЕ

Допустим, у нас имеется периодический регистр сведений Цены номенклатуры, представленный таблицей:

Перед нами стоит задача получить записи с наименьшей датой в 2013 году, когда номенклатура стоила дороже 2000, т.е. [02.01.2013 Кресло 5200] и [03.01.2013 Стул 2100]. Если мы напишем так:

Запрос.Текст = "
|ВЫБРАТЬ
|    ЦеныНоменклатурыСрезПервых.Период,    
|    ЦеныНоменклатурыСрезПервых.Номенклатура,    
|    ЦеныНоменклатурыСрезПервых.Цена
|ИЗ
|    РегистрСведений.ЦеныНоменклатуры.СрезПервых(ДАТАВРЕМЯ(2013, 1, 1), Цена > 2000)
|    КАК ЦеныНоменклатурыСрезПервых";

Задача будет успешно решена, но если фильтр по цене перенести в секцию ГДЕ:

Запрос.Текст="
|ВЫБРАТЬ
|    ЦеныНоменклатурыСрезПервых.Период,
|    ЦеныНоменклатурыСрезПервых.Номенклатура,
|    ЦеныНоменклатурыСрезПервых.Цена
|ИЗ<
|    РегистрСведений.ЦеныНоменклатуры.СрезПервых(ДАТАВРЕМЯ(2013, 1, 1), ) КАК
|    ЦеныНоменклатурыСрезПервых
|ГДЕ
|    ЦеныНоменклатурыСрезПервых.Цена > 2000";

В результате получим только одну запись [02.01.2013 Кресло 5200]. Так происходит потому, что к реальной таблице регистра сведений сначала был применен фильтр на срез первых:

Затем в полученной таблице мы ищем записи с ценой больше 2000 -> [02.01.2013 Кресло 5200]. Будьте внимательны.

 

Добавить комментарий


Защитный код
Обновить

© 2012, Котельников Дмитрий. При любом копировании материалов ссылка на сайт-источник zapros-1c-8.ru обязательна.