Нумерация строк в запросе методами платформы

Публикация № 1171188

Разработка - Практика программирования

запрос автонумерация

Простая реализация с помощью встроенных методов. Пригодится тем, кому нужно пронумеровать запрос без СКД и переборов.

    Для нумерации строк запроса необходимо воспользоваться встроенной функцией АВТОНОМЕРЗАПИСИ().

Её можно использовать только во временных таблицах. Более подробно можно посмотреть в справке. Всё просто. Ниже приведен небольшой пример:

Нужно выбрать все элементы справочника Тест и пронумеровать их. Создаем новое поле в запросе и забиваем в него функцию. Создаем временную таблицу и в последующей выборке получаем нужный результат.

ВЫБРАТЬ
	Тест.Ссылка КАК Ссылка,
	АВТОНОМЕРЗАПИСИ() КАК Номер
ПОМЕСТИТЬ ВТ
ИЗ
	Справочник.Тест КАК Тест
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	ВТ.Ссылка КАК Ссылка,
	ВТ.Номер КАК Номер
ИЗ
	ВТ КАК ВТ

В консоли запросов получился нужный нам результат

Специальные предложения

Комментарии
В избранное Подписаться на ответы Сортировка: Дата
41. Qarasique 20.02.21 13:26 Сейчас в теме
Если у вас номер строки начинается не с единицы:

ВЫБРАТЬ
	АВТОНОМЕРЗАПИСИ() КАК НомерСтроки,
	СправочникНоменклатура.Ссылка КАК Номенклатура
ПОМЕСТИТЬ ВТ_Данные
ИЗ
	Справочник.Номенклатура КАК СправочникНоменклатура
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	МИНИМУМ(Данные.НомерСтроки) КАК МинимальныйНомерСтроки
ПОМЕСТИТЬ ВТ_МинимальныйНомерСтроки
ИЗ
	ВТ_Данные КАК Данные
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	Данные.НомерСтроки - ВТ_МинимальныйНомерСтроки.МинимальныйНомерСтроки + 1 КАК НомерСтроки,
	Данные.Номенклатура КАК Номенклатура
ИЗ
	ВТ_Данные КАК Данные,
	ВТ_МинимальныйНомерСтроки КАК ВТ_МинимальныйНомерСтроки
Показать
40. KindLion 24.11.20 14:19 Сейчас в теме
Спасибо!
Век живи - век учись! :)
39. Vodoley 1 15.09.20 14:33 Сейчас в теме
38. Darklight 27 11.09.20 14:57 Сейчас в теме
(37), Да "УПОРЯДОЧИТЬ ПО" нельзя применить во временной таблице без ключевого слова "ПЕРВЫЕ", но кто Вам мешает сделать вот так

ВЫБРАТЬ ПЕРВЫЕ 10000000000000000
	Номенклатура.Ссылка,
	Номенклатура.Код КАК Код,
	АВТОНОМЕРЗАПИСИ() КАК Автономер
ПОМЕСТИТЬ тз
ИЗ
	Справочник.Номенклатура КАК Номенклатура
ГДЕ
	Номенклатура.Код > "00000000005"
	И Номенклатура.Код < "000000066"

УПОРЯДОЧИТЬ ПО
	Код
Показать


Этот код у меня в базе (на MS SQL, PG, Oracle нет сейчас под рукой) отбирает только 10 записей - согласно условию отбора - и присваивает им номера от 1 до 10 согласно заданной сортировке по Коду
Созинов; +1 Ответить 1
37. Vodoley 1 11.09.20 14:00 Сейчас в теме
(36)во временной таблице нет никакой сортировки. (в смысле оператор "упорядочить" отсутствует во временных таблицах.
Неявным образом применение индексирования упорядочивает записи (но это не гарантируется) и оператор Автономер - сработает _до_ индексирования. Т.е. нужно сначала ВТ индексировать, а потом в следующем запросе пакета из этой индексированной таблицы уже запросить и сделать автономер. (но опят же это все не гарантирует результат)
36. Darklight 27 11.09.20 09:37 Сейчас в теме
(35)Я вас не понимаю. Автонумерация во одной временной таблице идёт от N до M (где M > N) - без пропусков, в строгом порядке сортировки - в чём затык?
35. Vodoley 1 11.09.20 08:40 Сейчас в теме
(34) неважно с нуля или не с нуля - я о том, чтобы сначала выстроить записи в определенном порядке (во временной таблице) и потом их в этом же порядке пронумеровать.
неявным образом помогает индексировать.
34. Darklight 27 10.09.20 17:20 Сейчас в теме
(33)Вот, честно, не могу понять, что за управляемую нумерацию Вы хотите. Автонумерация - это просто нумерация. Если Вы хотите управлять номером - конструкции "ВЫБОР", "ГДЕ", "ПЕРВЫЕ" и "УПОРЯДОЧИТЬ", а грегатные к Вашим услугам. Просто ранжирование - это применение некой функции-условия - вот её Вы должны написать сами. И не понимаю, как бы вы применяли "Автонумерацию", если бы она всегда начиналась с 0 (она и так автоупорялоченна согласно сортировки), кроме того что я уже выше написал - с единомоментной нумерацией, и а весь функционал дальше уже оформляется поствыборками!
33. Vodoley 1 10.09.20 17:06 Сейчас в теме
(32) но если бы была возможность нумеровать не в произвольном порядке (ведь сейчас непредсказуемо какая запись получить меньший автономер а какая больший) то кроме уникальности записей появляется возможность их ранжировать (во временных таблицах), если такое ранжирование нужно. Кажется если сделать индексацию (по полям) то записи (в ВТ) будут пронумерованы в порядке этих индексов )
32. Darklight 27 10.09.20 11:40 Сейчас в теме
(31)Вашу задачу из вашего описания понять очень сложно. Как я написал выше, атонумерацию как ключ сопоставления можно эффективно использовать - если эти ключи-номера рассчитаны единожды во временной таблице - и эта временна таблица далее либо соединяется (по полным ключам) к другим таблицам, либо из уже делаются все остальные выборкии подвыборким, которые далее уже соединяются между собой. Вот именно все дальнейшие соединения уже можно сделать но нумерованному ключу, но генерировать его нужно только в одной верхней выборке!
31. Vodoley 1 10.09.20 09:12 Сейчас в теме
(29)
Вы ещё функцию вычисления хеш-ключа по набору полей пожелайте.
Ну и, до кучи - функцию генерации UUID.

хеш мне пока был без надоности.. а вот почему к ID записей объектных таблиц нельзя обращаться в запросах?

насчет сортировки.. когда я комментил у меня была задача, когда надо было интеллектуально сопоставить множество заказов с множеством бонусов для этих заказов. Условно говоря у меня было 2 временных таблицы (сложным образом полученных). Сопоставляю все возможные сочетания записей между ними: нужно получить одну таблицу, в которой результат лучшего мэтчинга (например по минимуму скоринговой функции, вычисляемой по значениям некоторых полей обеих таблиц). Автонумерация (в каждой из сопоставляемых таблиц) здорово помогает, когда скоринговая функция (как бы ее не мудрить) принимает одинаковые значения для разных мэтчингов - тогда можно сделать такое расщепление- при прочих равных кто-то будет предпочтен, благодаря включению в эту функцию автономера... Но вот если бы этот номер был в свою очередь проставлен не произвольно, а в нужном порядке это бы улучшило результат )
Полагаю диалект MSSQL (хотя более глубокое знание SQL у меня еще впереди ))

В любом случае запросом такие штуки сложновато решать, т.к. не учитываются сложности взаимодействия между записями: каждая запись одной таблы мэтчится с записями другой независимо - а ведь выбор одной из возможностей изменяет множество доступной для сопоставления оставшимся.. Т.е. по хорошему такой выбор не сделать (предполагаю) реляционной алгеброй... (ну пришлось там пост обработкой запроса дотачивать).
30. Darklight 27 31.08.20 16:10 Сейчас в теме
(28)В (1) посте указана версия 8.3.13 - причём, судя по всему, платформы, а не версия совместимости конфигурации (у меня на платформе 8.3.15 в конфигурации с версией совместимости 8.3.5 эта функция заработала)
29. Darklight 27 31.08.20 16:08 Сейчас в теме
(27)Вы ещё функцию вычисления хеш-ключа по набору полей пожелайте.
Ну и, до кучи - функцию генерации UUID.

Тут скорее полезность в том, что можно заранее вычислить временную таблицу с каким-то набором ключевых полей - и вот так в запросе её пронумеровать. А затем прилепить её к другим таблицам (по ключевым полям) и/или сделать из неё/них разные выборки (этот подход любят в типовом коде 1С) - а потом их соединять друг с другом - но уже не по ключевым полям - по вот такому полю-нумератору (мэппинг сложно-составного ключа к Числу - но надо делать заранее - и везде использовать готовый набор).

Конечно, прям вряд ли тут будет какой-то большой выигрыш в эффективности (производительности, нагрузки на память, легкочитаемости, хотя вот по модифицируемости - выигрыш может быть заметным), но для ряда очень сложных выборок, активно практикующих такие множественные соединения по одинаковым массивным ключам - может быть полезно!


Другое дело - что такая фишка открывает новые возможности, например с такой нумерацией гораздо проще написать алгоритмы устранения дублей, или сделать выборку, скажем, только чётных строк, или выбрать не только первые N, а наоборот, скажем, пропустить первые N записей, или выбрать, например из середины с M по N (правда с учётом, что нумерация может быть не с 0(1) а с произвольного числа такой код немного усложняется - но всё-таки не становится излишне запутанным!

Так же заметно упрощаются алгоритмы покадрового вычисления и вывода результатов запросов!
28. Serj1C 480 10.07.20 13:18 Сейчас в теме
С какой версии платформы доступно?
27. Vodoley 1 05.06.20 15:09 Сейчас в теме
(26) соглашусь. Но вот если нужно, чтобы записи нумеровались не произвольным образом а в порядке сортировки каких-то полей... то только "индексировать по" неявным образом приведет к нужному результату?
26. MuxaH 17.01.20 06:39 Сейчас в теме
(23) Вот-вот, помнится мне, как я парился, чтоб создать уникальный ключ строки во временной таблице... А с этой штукой прям не жизнь , а сказка :) Даже и пофиг, что не с 1 может начинаться
sergathome; +1 Ответить 1
25. s22 19 14.01.20 16:51 Сейчас в теме
(24) не помогает. Иногда даже в одном запросе нумерация идет по возрастанию.
24. MsDjuice 104 14.01.20 16:41 Сейчас в теме
(17)После выполнения нужно удалять временную таблицу
23. lmnlmn 64 14.01.20 08:40 Сейчас в теме
Автономер записи удобно использовать как несоставной первичный ключ во временных таблицах. Это сильно упрощает связи в запросах с временными таблицами и снижает нагрузку на СУБД.
mvxyz; sergathome; +2 Ответить 1
22. tamepjlah 2 14.01.20 07:21 Сейчас в теме
Вот объясните мне для чего нужен этот автономерзаписи, когда есть индекс строки? Для просмотра в консоле запросов? Уже сколько времени прошло, когда его ввели, а я так ни разу и не придумал ему применение...
20. Espiritfor 13.01.20 07:50 Сейчас в теме
(19)На ИТС довольно забавное описание:
АВТОНОМЕРЗАПИСИ

Описание:

Функция предназначена для формирования поля с уникальным, последовательно возрастающим значением во временной таблице. Функцию можно использовать в том случае, если необходимо создать ключевое поле во временной таблице. Значение, сформированное этой функцией, будет уникально в пределах временной таблицы, при формировании которой использовалась функция. Начальное значение счетчика зависит от используемой СУБД и, в общем случае, может быть любым. Не гарантируется, что начальное значение счетчика будет равно 1 для любой временной таблицы.

Не поддерживается использование функции АВТОНОМЕРЗАПИСИ() в следующих случаях:

● в запросах, содержащих ОБЪЕДИНИТЬ на верхнем уровне,

● в запросах, которые не формируют временную таблицу,

● вне списка выборки,

● в выражениях языка запросов.
Показать
KUAvanesov; dvissarov5; Cyberhawk; Mahon83; igee12; SergeRSA; aspirin4eg; sulfur17; Bassgood; +9 Ответить
19. Bassgood 1092 11.01.20 15:13 Сейчас в теме
(17)
8.3.14.1779 postgres 9.6

Могу предположить что дело в СУБД - попробуйте то же самое проделать на SQL Server
17. s22 19 10.01.20 19:13 Сейчас в теме
(16)
Вы, конечно, не поверите, но ничего не меняется, выполняя ваш запрос N раз.

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

8.3.14.1779 postgres 9.6
16. Espiritfor 10.01.20 19:07 Сейчас в теме
(14)
ВЫБРАТЬ ПЕРВЫЕ 10
Номенклатура.Артикул КАК Артикул,
АВТОНОМЕРЗАПИСИ() КАК Номер
ПОМЕСТИТЬ ТабАртикулы
ИЗ
Справочник.Номенклатура КАК Номенклатура
;

////////////////////////////////////////////////////////////­­////////////////////
ВЫБРАТЬ
ТабАртикулы.Артикул КАК Артикул,
АВТОНОМЕРЗАПИСИ() КАК Номер,
ТабАртикулы.Номер КАК Номер1
ПОМЕСТИТЬ ТабАртикулы2
ИЗ
ТабАртикулы КАК ТабАртикулы
;

////////////////////////////////////////////////////////////­­////////////////////
ВЫБРАТЬ
ТабАртикулы2.Артикул,
ТабАртикулы2.Номер,
ТабАртикулы2.Номер1
ИЗ
ТабАртикулы2 КАК ТабАртикулы2

Показать

(14)

Вы, конечно, не поверите, но ничего не меняется, выполняя ваш запрос N раз.

Допускаю, что при определенных условиях может возникать подобная ситуация, но я бы лучше перепроверил где-нибудь еще, чтобы исключить глюк системы.
Проверял на 8.3.13.1865
15. s22 19 10.01.20 18:54 Сейчас в теме
14. s22 19 10.01.20 18:33 Сейчас в теме
просто ради прикола выполните несколько раз подряд запрос

ВЫБРАТЬ ПЕРВЫЕ 10
	Номенклатура.Артикул КАК Артикул,
	АВТОНОМЕРЗАПИСИ() КАК Номер
ПОМЕСТИТЬ ТабАртикулы
ИЗ
	Справочник.Номенклатура КАК Номенклатура
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ 
	ТабАртикулы.Артикул КАК Артикул,
	АВТОНОМЕРЗАПИСИ() КАК Номер,
	ТабАртикулы.Номер КАК Номер1
ПОМЕСТИТЬ ТабАртикулы2
ИЗ
	ТабАртикулы КАК ТабАртикулы
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ТабАртикулы2.Артикул,
	ТабАртикулы2.Номер,
	ТабАртикулы2.Номер1
ИЗ
	ТабАртикулы2 КАК ТабАртикулы2
Показать



результат бывает и такой

Артикул Номер Номер1
31 31
32 32
33 33
34 34
00000005691 35 35
36 36
37 37
00000006383 38 38
39 39
40 40
13. Espiritfor 10.01.20 16:03 Сейчас в теме
(10)
ВЫБРАТЬ
	Номенклатура.Артикул КАК Артикул,
	АВТОНОМЕРЗАПИСИ() КАК Номер
ПОМЕСТИТЬ ТабАртикулы
ИЗ
	Справочник.Номенклатура КАК Номенклатура
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	Склады.Код КАК Код,
	АВТОНОМЕРЗАПИСИ() КАК Номер
ПОМЕСТИТЬ ТабСклады
ИЗ
	Справочник.Склады КАК Склады
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ТабСклады.Код КАК Код,
	ТабСклады.Номер КАК Номер
ИЗ
	ТабСклады КАК ТабСклады

УПОРЯДОЧИТЬ ПО
	Номер


Код	        Номер
00001	1
00002	2
00003	3
00004	4
00005	5
00006	6
00009	7
00010	8
00011	9
00012	10
00013	11
00014	12
00015	13
00016	14
00017	15
00018	16
00019	17
00020	18
00021	19
00100	20
00101	21
00102	22
00103	23
00104	24
00105	25
00106	26
00107	27
00108	28
Показать
12. aha_1 10.01.20 14:47 Сейчас в теме
Мы с Вами говорим практически об одном и том же, акцентируя внимание на разные моменты. Вы абсолютно правы, что при нынешнем состоянии языка запросов программная обработка данных иногда предпочтительнее. Я лишь обращаю внимание на причину этой ситуации.
Bassgood; +1 Ответить
11. lmnlmn 64 10.01.20 13:35 Сейчас в теме
(8) Дело в том что из-за скудности языка запросов приходится гонять существенные объемы данных по временным таблицам и при этом всем строить весьма витиеватые запросы. В то время как при программной обработке можно обойтись меньшими выборками данных.
10. s22 19 10.01.20 13:29 Сейчас в теме
(9) сделайте в одном запросе несколько временных таблиц
Сделайте в одной транзакции несколько запросов.
9. Espiritfor 10.01.20 13:11 Сейчас в теме
(5)Все там нормально с 1 начинается.
8. aha_1 10.01.20 11:21 Сейчас в теме
А в программном коде разве мы не те же данные/таблицы обрабатываем? Только средствами программного кода, а не языка запросов, из-за скудности последнего.
7. lmnlmn 64 10.01.20 10:59 Сейчас в теме
(6) Ни разу не априори. Надо от задачи и объемов данных смотреть. В некоторых ситуациях программная обработка избавляет от перевалки кучи данных по временным таблицам и от выполнения длиннющих и сложных запросов. Надо здравым смыслом пользоваться.
denver069; min-max_pro; MsDjuice; kiruha; Alexx48; Артано; +6 Ответить
6. aha_1 10.01.20 09:37 Сейчас в теме
Все, что из запроса переносится в программный код, априори замедляет работу системы. Возможности языка запросов развивать надо, если ресурсы для этого имеются, а не рассказывать про необходимость "читаемости кода".
5. s22 19 09.01.20 13:53 Сейчас в теме
Фигня.
АВТОНОМЕРЗАПИСИ начинаеться не с 1, а с произвольного числа.
для АВТОНОМЕРЗАПИСИ гарантируеться только то, что следующее будет больше предыдущего. Не более
kalyaka; khvolkova; tps_01; sasha777666; BigB; harmer; +6 Ответить 1
4. Dream_kz 113 09.01.20 12:38 Сейчас в теме
Её можно использовать только в виртуальных таблицах

временных
sasha777666; +1 Ответить
3. pavel_pss 272 09.01.20 11:15 Сейчас в теме
2. Miracle777999111 09.01.20 11:10 Сейчас в теме
спасибо за статью, вроде мелочь но приятная =)
1. lmnlmn 64 09.01.20 11:05 Сейчас в теме
Вообще пронумеровать строки в запросе быстрее программно при его выводе. Данная функция облегчает жизнь при сложной обработке данных во временных таблицах. Теперь можно избавиться от сложных связей с ВТ. Еще стоит упомянуть что сия радость доступна с версии платформы 8.3.13.
Innuil; Созинов; Darklight; _7445_; sasha777666; Wilka; solary; mai_k; MsDjuice; SergeRSA; sulfur17; brr; marku; alex-l19041; +14 Ответить 2
Оставьте свое сообщение

См. также

Serverless (Faas) в 1С. Создание и вызов Yandex Cloud Functions Промо

Универсальные функции Практика программирования v8 Бесплатно (free)

"Я не могу просто взять и скопировать код с гитхаба", "у нас 1С микросервисами окружена", "возможностей мало" - частые фразы 1С разработчиков. которым не хватает возможностей платформы в современном мире. Faas, конечно, история не новая, но нас сдерживало 152ФЗ и задержки по пингам. Для того, чтобы действительно использовать в 1С код, к примеру, на Python, надо было приложить усилия. Теперь всё намного проще - берём и используем.

28.12.2020    4287    comol    22    

Многопоточное ускорение однопользовательских нагрузок в 1С + Microsoft SQL Server 2017

Практика программирования Производительность и оптимизация (HighLoad) v8 v8::Запросы Бесплатно (free)

Взаимодействие с Microsoft SQL Server нередко вызывает трудности у 1С-ников, а потому интересны любые моменты, связанные с его использованием. О своем опыте работы с новым SQL Server 2017 участникам конференции Infostart-2018 рассказал директор ООО «Аналитика софт» Дмитрий Дудин.

11.06.2019    26990    dmurk    146    

Вспомогательные инструкции в коде 1С

Практика программирования v8 1cv8.cf Бесплатно (free)

Помогаем редактору кода 1С помогать нам писать и анализировать код.

15.10.2018    32011    tormozit    104    

Зачем запросу план и кто его выполняет?

Практика программирования Производительность и оптимизация (HighLoad) v8::Запросы Бесплатно (free)

Как определить, почему запрос выполняется слишком долго? Что происходит с запросом на стороне сервера баз данных? В статье приводится объяснение, что такое план запроса и для чего он нужен. А также говорится о том, в чем разница между потоком операторов и потоком данных, как работает оптимизатор и зачем нужна статистика.

09.08.2018    25654    Dem1urg    46    

Использование программных перечислений, ч.1: строковые константы Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

Часто ли у вас возникает необходимость в коде выполнять сравнение на строку?

10.12.2016    38420    unichkin    74    

Как сделать запрос на изменение данных

Практика программирования v8 v8::Запросы 1cv8.cf Бесплатно (free)

В статье приведены особенности внутренней архитектуры и примеры работы с расширением языка запросов 1С.

01.06.2018    32253    m-rv    21    

Просмотр временных таблиц запроса в отладчике без изменения кода

Практика программирования v8 v8::Запросы 1cv8.cf Бесплатно (free)

Данный способ можно использовать для просмотра содержимого временных таблиц запросов (менеджеров временных таблиц) без внесения изменений в код.

24.04.2018    63089    avfed@rambler.ru    30    

Как сделать из &НаКлиентеНаСервереБезКонтекста почти &НаКлиентеНаСервере

Практика программирования v8 1cv8.cf Россия Бесплатно (free)

Как сделать метод формы, доступный на клиенте и на сервере одновременно, и сохранить при этом удобство разработки

10.09.2017    46677    tormozit    74    

Оформление и рефакторинг сложных логических выражений Промо

Практика программирования v8 Россия Бесплатно (free)

В сложных логических выражениях нередко самому автору спустя какое-то время тяжело разобраться, не говоря уже о других программистах. Предлагаемая методика позволяет повысить наглядность таких выражений путем оформления в виде И-ИЛИ дерева и одновременно выполнять их рефакторинг.

20.09.2012    79268    tormozit    131    

Большие запросы: взгляд на проблему

Практика программирования v8::Запросы 1cv8.cf Бесплатно (free)

Большой (кусочный) запрос подобен карточному домику: строится долго, а захочется поменять карту из середины строения – домик разрушится. На примере учета задолженностей контрагентов в разрезе полугодий (не типовой учет БП, и не ЗУПовский) я покажу, как я изменил механизм учета и превратил «большой» запрос в «маленький», а дальнейшее сопровождение программы в сказку 1С-ника.

26.07.2013    29731    Rustig    43    

Самоучитель языка запросов 1С.

Практика программирования Решение задач на 1С:Специалист Математика и алгоритмы v8 v8::Запросы Бесплатно (free)

Сервис для изучения запросов 1С: "Консоль изучения запросов 1С:Предприятие 8". Теперь и с конструктором запросов!

07.05.2013    111810    bpc222    327    

Запись значения в поле ввода/формы со срабатыванием события ПриИзменении

Практика программирования v8 1cv8.cf Россия Бесплатно (free)

Иногда возникает необходимость после записи значения в какое либо поле ввода/формы вызвать для него обработчик события ПриИзменении, а о вызове самого события приходится только мечтать. В этой статье приводится программный способ вызова этого события.

11.07.2007    50008    tormozit    48