v8: Нумерация строк в запросе Ключевые слова: нумерация строк запроса, ПЕРВЫЕ, нумерация строк в построителе
Иногда возникает необходимость добавить в запрос колонку с номерами строк, например, когда нужно вывести номера строк в отчет, а используется построитель отчета. Так же нумерация строк полезна когда необходимо для определенных группировок вывести ограниченное количество строк данных. Что-то типа ПЕРВЫЕ 5 документов для каждого контрагента.
Данная статья навеяна обсуждением в: v8: Раздумья над запросом
Начнем с того, что в v8 используется ограниченный диалект SQL поэтому многие методики нумерации строк запроса, возможные в SQL, для нас не доступны. (если кому-то интересно как это делать в SQL - http://www.sql.ru/faq/faq_topic.aspx?fid=126)
Итак есть код, выбирающий номенклатуру, отсортированный по наименованию:
[1с]
ВЫБРАТЬ
Номенклатура.Ссылка
ИЗ
Справочник.Номенклатура КАК Номенклатура
УПОРЯДОЧИТЬ ПО
Номенклатура.Наименование
[/1с]исходный запрос
Требуется добавить сюда колонку с порядковыми номерами номенклатуры (в рамках данной сортировки).
[1с]
ВЫБРАТЬ
Номенклатура.Ссылка КАК Номенклатура,
КОЛИЧЕСТВО(Номенклатура_1.Ссылка) КАК Номер
ИЗ
Справочник.Номенклатура КАК Номенклатура
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура_1
ПО Номенклатура.Наименование >= Номенклатура_1.Наименование
СГРУППИРОВАТЬ ПО
Номенклатура.Ссылка
УПОРЯДОЧИТЬ ПО
Номенклатура.Наименование
[/1с]запрос с номерами строк
Соединяем таблицу саму с собой довольно хитрым способом. По правой таблице подсчитываем количество номенклатуры с наименованием меньше текущего левого, используя группировку.
Аналогичную технику можно применить, если нужно задавать нумерацию строк с учетом группировки по какому-то полю.
[1с]
ВЫБРАТЬ
Номенклатура.Ссылка КАК Номенклатура,
Номенклатура.Родитель КАК Родитель,
КОЛИЧЕСТВО(Номенклатура_1.Ссылка) КАК Номер
ИЗ
Справочник.Номенклатура КАК Номенклатура
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура_1
ПО Номенклатура.Наименование >= Номенклатура_1.Наименование
И Номенклатура.Родитель = Номенклатура_1.Родитель
СГРУППИРОВАТЬ ПО
Номенклатура.Родитель,
Номенклатура.Ссылка
[/1с]запрос с номерами строк в рамках группировки
Это тот же самый запрос, в него просто добавлена группировка по полю "Родитель", нумерация для каждого родителя своя.
Если говорить о быстродействии, то запросы подобного рода естественно ресурсоемки, но ни так чтобы уж совсем. Для большинства повседневных задач - вполне приемлемо их использование.
Кстати, второй запрос выполняется несколько быстрее первого, это связано меньшим размером вспомогательных таблиц.
Пример реального использования:
Теперь немного о том, ради чего всё это делается, то-есть польза, которую можно извлечь из нумерации строк запроса.
Например, перед нами стоит задача получить для каждого контрагента пять последних документов поступления товаров и услуг:
[1с]
ВЫБРАТЬ
ПоступлениеТоваровУслуг.Контрагент КАК Контрагент,
ПоступлениеТоваровУслуг.Ссылка КАК Ссылка,
КОЛИЧЕСТВО(ПоступлениеТоваровУслуг_1.Ссылка) КАК Номер
ИЗ
Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг_1
ПО ПоступлениеТоваровУслуг.Дата <= ПоступлениеТоваровУслуг_1.Дата
И ПоступлениеТоваровУслуг.Контрагент = ПоступлениеТоваровУслуг_1.Контрагент
СГРУППИРОВАТЬ ПО
ПоступлениеТоваровУслуг.Ссылка,
ПоступлениеТоваровУслуг.Контрагент
ИМЕЮЩИЕ
КОЛИЧЕСТВО(ПоступлениеТоваровУслуг_1.Ссылка) <= 5
УПОРЯДОЧИТЬ ПО
Контрагент,
Номер
[/1с] |