Нумерация строк в запросе 1С

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

С помощью СКД, и построителя отчета, вывести номер строки не составляет никакого труда, в случае нумерации средствами самого запроса (оператор SELECT в SQL или ВЫБРАТЬ — в 1С), всё не так очевидно.

Для того чтобы вывести номер строки — необходимо набор данных соединить сам с собой используя любой вид соединения и любое из условий Таблицы1.Поле <= Таблицы2.Поле или же Таблицы1.Поле >=Таблицы1.Поле, затем сгруппировать по <Таблицы1.Поле> и вывести полученный результат из первой <Таблицы1.Поле> и с помощью агрегатной функции КОЛИЧЕСТВО(*) — посчитать количество значений, которые и будут являться номером строки.

В качестве примера рассмотрим запрос после применения соединения с условием на >= (больше или равно), но без группировки и без подсчета.

Пример: Соединение таблицы без группировки.
ВЫБРАТЬ 
   Таблица1.Имя, 
   Таблица2.Имя
ИЗ
	(ВЫБРАТЬ "Иванов" КАК Имя
		ОБЪЕДИНИТЬ
	ВЫБРАТЬ "Петров" КАК Имя
		ОБЪЕДИНИТЬ
	ВЫБРАТЬ	"Сидоров" КАК Имя) КАК Таблица1
ЛЕВОЕ СОЕДИНЕНИЕ
	(ВЫБРАТЬ "Иванов" КАК Имя
		ОБЪЕДИНИТЬ
	ВЫБРАТЬ  "Петров" КАК Имя
		ОБЪЕДИНИТЬ
	ВЫБРАТЬ "Сидоров" КАК Имя) КАК Таблица2
ПО 
	Таблица1.Имя >= Таблица2.Имя

В результате соединения получаем такой набор данных, и как уже можно догадаться, группировка по одному из полей «свернет» строки до одной, а агрегатная функция КОЛИЧЕСТВО(*) , посчитает количество одинаковых записей — что и будет являться номером строки. Направление сравнения на >= (больше или равно) или <= (меньше или равно), влияют на порядок записей.

Пример: Соединение таблиц с группировкой и подсчетом строк.
ВЫБРАТЬ 
   Таблица1.Имя, 
   КОЛИЧЕСТВО(*) КАК Номер
ИЗ
	(ВЫБРАТЬ "Иванов" КАК Имя
		ОБЪЕДИНИТЬ
	ВЫБРАТЬ "Петров" КАК Имя
		ОБЪЕДИНИТЬ
	ВЫБРАТЬ	"Сидоров" КАК Имя) КАК Таблица1
ЛЕВОЕ СОЕДИНЕНИЕ
	(ВЫБРАТЬ "Иванов" КАК Имя
		ОБЪЕДИНИТЬ
	ВЫБРАТЬ  "Петров" КАК Имя
		ОБЪЕДИНИТЬ
	ВЫБРАТЬ "Сидоров" КАК Имя) КАК Таблица2
ПО 
	Таблица1.Имя >= Таблица2.Имя
СГРУППИРОВАТЬ ПО Таблица1.Имя	
УПОРЯДОЧИТЬ ПО Номер 

Как и предполагалось после группировки и использования агрегатной функции КОЛИЧЕСТВО(*) — получили номера строк.

Пример: Нумерация строк внутри группировки.
ВЫБРАТЬ 
	Таблица1.Имя, Таблица1.Профессия,
	КОЛИЧЕСТВО(Таблица1.Имя) КАК НомерСтроки
ИЗ
	(ВЫБРАТЬ "Иванов" КАК Имя, "Тракторист" КАК Профессия
		ОБЪЕДИНИТЬ
	ВЫБРАТЬ "Иванов" КАК Имя, "1С Программист" КАК Профессия
		ОБЪЕДИНИТЬ
	ВЫБРАТЬ "Петров" КАК Имя, "Риэлтор" КАК Профессия
		ОБЪЕДИНИТЬ
	ВЫБРАТЬ "Водкин" КАК Имя, "Риэлтор" КАК Профессия
		ОБЪЕДИНИТЬ
	ВЫБРАТЬ	"Волчихин" КАК Имя, "1С Программист" КАК Профессия	 
        ОБЪЕДИНИТЬ
	ВЫБРАТЬ "Сидоров" КАК Имя, "Риэлтор" КАК Профессия) КАК Таблица1
ВНУТРЕННЕЕ СОЕДИНЕНИЕ
	(ВЫБРАТЬ "Иванов" КАК Имя, "Тракторист" КАК Профессия
		ОБЪЕДИНИТЬ
	ВЫБРАТЬ "Иванов" КАК Имя, "1С Программист" КАК Профессия
		ОБЪЕДИНИТЬ
	ВЫБРАТЬ	"Петров" КАК Имя, "Риэлтор" КАК Профессия
		ОБЪЕДИНИТЬ
	ВЫБРАТЬ	"Водкин" КАК Имя, "Риэлтор" КАК Профессия
		ОБЪЕДИНИТЬ
	ВЫБРАТЬ	"Волчихин" КАК Имя, "1С Программист" КАК Профессия	 
        ОБЪЕДИНИТЬ
	ВЫБРАТЬ	"Сидоров" КАК Имя, "Риэлтор" КАК Профессия) КАК Таблица2
ПО Таблица1.Имя >= Таблица2.Имя И Таблица1.Профессия = Таблица2.Профессия
СГРУППИРОВАТЬ ПО  
 	Таблица1.Профессия, 
 	Таблица1.Имя
УПОРЯДОЧИТЬ ПО   
	Таблица1.Профессия, 
	НомерСтроки ВОЗР, 
	Таблица1.Имя ВОЗР

В данном примере для нумерации внутри группировки — в условие соединения, добавляется условие на совпадение значений по дополнительному группировочному полю — Таблица1.Профессия = Таблица2.Профессия

Пример: Сквозная нумерация при наличии других группировок.
ВЫБРАТЬ 
	Таблица1.Имя, Таблица1.Профессия,
	КОЛИЧЕСТВО(*) КАК НомерСтроки
ИЗ
	(ВЫБРАТЬ
		"Иванов" КАК Имя, "Тракторист" КАК Профессия
		ОБЪЕДИНИТЬ
	ВЫБРАТЬ
		"Иванов" КАК Имя, "1С Программист" КАК Профессия
		ОБЪЕДИНИТЬ
	ВЫБРАТЬ
		"Петров" КАК Имя, "Риэлтор" КАК Профессия
		ОБЪЕДИНИТЬ
	ВЫБРАТЬ
		"Водкин" КАК Имя, "Риэлтор" КАК Профессия
		ОБЪЕДИНИТЬ
	ВЫБРАТЬ
		"Волчихин" КАК Имя, "1С Программист" КАК Профессия
		ОБЪЕДИНИТЬ
	ВЫБРАТЬ
		"Сидоров" КАК Имя, "Риэлтор" КАК Профессия) КАК Таблица1
ВНУТРЕННЕЕ СОЕДИНЕНИЕ
	(ВЫБРАТЬ
		"Иванов" КАК Имя, "Тракторист" КАК Профессия
		ОБЪЕДИНИТЬ
	ВЫБРАТЬ
		"Иванов" КАК Имя, "1С Программист" КАК Профессия
		ОБЪЕДИНИТЬ
	ВЫБРАТЬ
		"Петров" КАК Имя, "Риэлтор" КАК Профессия
		ОБЪЕДИНИТЬ
	ВЫБРАТЬ
		"Водкин" КАК Имя, "Риэлтор" КАК Профессия
		ОБЪЕДИНИТЬ
	ВЫБРАТЬ
		"Волчихин" КАК Имя, "1С Программист" КАК Профессия
		ОБЪЕДИНИТЬ
	ВЫБРАТЬ
		"Сидоров" КАК Имя, "Риэлтор" КАК Профессия) КАК Таблица2
ПО 
	Таблица1.Имя + Таблица1.Профессия >= Таблица2.Имя + Таблица2.Профессия   
СГРУППИРОВАТЬ ПО  
 	Таблица1.Профессия, 
 	Таблица1.Имя
УПОРЯДОЧИТЬ ПО   
	НомерСтроки ВОЗР, 
	Таблица1.Имя ВОЗР

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

Это можно сделать создав в условии соединения составное поле .

Таблица1.Имя + Таблица1.Профессия >= Таблица2.Имя + Таблица2.Профессия

ВАЖНО! Нумерация будет работать только по уникальным наборам значений для каждой строки.