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

Бывают ситуации, когда необходимо добавить колонку с номером строки и вывести ее в результате выполнения запроса.
С помощью СКД, и построителя отчета, вывести номер строки не составляет никакого труда, в случае нумерации средствами самого запроса (оператор SELECT в SQL или ВЫБРАТЬ — в 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.Профессия
ВАЖНО! Нумерация будет работать только по уникальным наборам значений для каждой строки.
Нумерация строк в запросе
В процессе работы в 1С, периодически возникает необходимость осуществить нумерацию строк в запросе. Это можно сделать, используя встроенные средства платформы, а именно функцию «АВТОНОМЕРЗАПИСИ», которая позволяет автоматически создавать нумерацию строк запроса без переборов и системы компоновки данных (СКД). «АВТОНОМЕРЗАПИСИ» создает в таблице колонку в которой будут содержаться возрастающие в последовательном порядке значения. Стоит отметить, что эти действия производятся во временной таблице. Для нумерации, нужно выбрать все элементы того или иного справочника и пронумеровать их.
Далее, необходимо создать новое поле в запросе и загрузить в него функцию «АВТОНОМЕРЗАПИСИ». После проведенных манипуляций создается временная таблица и, если все будет выполнено правильно, пользователь получает нужный ему результат (он будет находится в консоли запросов). Результат будет представлен в виде колонки с находящимися в ней последовательно возрастающими значениями.
Данная операция будет полезна, например, при получении нескольких последних документов, при необходимости выведения ограниченного количества строк (первые 5 документов для контрагентов) и т.д.
Хотите получать подобные статьи по четвергам?
Быть в курсе изменений в законодательстве?
Подпишитесь на рассылку