Ловушка функции запроса АВТОНОМЕРЗАПИСИ()

11.10.24

Разработка - Запросы

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

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

Приведём небольшой пример:

Выведем первые 5 элементов справочника Валюты и поместим их во временную таблицу, применив функцию АВТОНОМЕРЗАПИСИ().

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

Выполним запрос в консоли:

 

 

Пока всё отлично! Но давайте выполним этот запрос ещё один раз:

 

 

Неожиданно, мы видим, что при повторном выполнении счётчик нумерации не обнулился, а продолжился, начиная с 6. Выполним ещё раз:

 

 

Теперь нумерация идёт уже, начиная с 11…

Однако, если подождать примерно 5 минут, и выполнить запрос ещё раз – мы снова увидим правильную нумерацию:

 

 

На первый взгляд кажется, что это какая-то мистика, но давайте обратимся к описании данной функции на ИТС:

 

 

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

Однако, не все разработчики даже типовых конфигураций 1С знают об этом. И повсеместно применяют данную функцию, например, для нумерации записей в регистре сведений «Документы по НМА».

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

И происходит волшебство. Первый раз провели документ – он отображается в динамическом списке. Через минуту перепровели его – документ исчезает. Через 10 минут ещё раз перепровели – снова появился!

Так ведь можно и с ума сойти!

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

Ну а если серьёзно – если 1С нам не гарантирует, что нумерация будет всегда с 1, то в подобных случаях нам нужно обеспечить эту гарантию самим.

Находим минимальный номер строки из полученной временной таблицы, получаем дельту, а затем отнимаем её от исходной нумерации:

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
     МИНИМУМ(ВТ.НомерСтроки) КАК Дельта
ПОМЕСТИТЬ ВТ_Дельта
ИЗ
     ВТ КАК ВТ
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
     ВТ.НомерСтроки - ВТ_Дельта.Дельта + 1 КАК НомерСтроки,
     ВТ.Валюта КАК Валюта
ИЗ
     ВТ КАК ВТ
          ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Дельта КАК ВТ_Дельта
          ПО (ИСТИНА)

Таким образом мы принудительно сдвинем нумерацию на начало, и наша нумерация не будет зависеть ни от СУБД, ни от времени, которое прошло между выполнениями запроса, ни от чёрта лысого.

 

 

Надеюсь, кому-нибудь помог! Пользуйтесь))

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

См. также

Инструментарий разработчика Роли и права Запросы СКД Программист Руководитель проекта Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Платные (руб)

Инструменты для разработчиков 1С 8.3: Infostart Toolkit. Автоматизация и ускорение разработки на управляемых формах. Легкость работы с 1С.

15500 руб.

02.09.2020    189422    1051    403    

983

Инструментарий разработчика Запросы Программист Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

QueryConsole1C — расширение, включающее консоль запросов с поддержкой исполняемых представлений — аналогов виртуальных таблиц, основанных на методах программного интерфейса ЗУП. Оно позволяет выполнять запросы с учётом встроенной бизнес-логики, отлаживать алгоритмы получения данных и автоматически генерировать код на встроенном языке 1С.

1 стартмани

16.05.2025    2005    44    zup_dev    14    

47

Обновление 1С Запросы Программист Платформа 1С v8.3 1С:ERP Управление предприятием 2 Абонемент ($m)

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

2 стартмани

06.02.2025    2464    18    XilDen    26    

36

Запросы Программист Платформа 1С v8.3 Запросы 1C:Бухгалтерия Бесплатно (free)

В статье приведена удобная возможность отладки исполняемого запроса динамического списка.

03.12.2024    6264    artemusII    11    

23

Запросы Программист Бесплатно (free)

Увидел cheatsheet по SQL и захотелось нарисовать подобное, но про запросы.

18.10.2024    13878    sergey279    18    

66

СКД Механизмы типовых конфигураций Запросы Программист Платформа 1С v8.3 1С:Зарплата и кадры государственного учреждения 3 1С:Зарплата и Управление Персоналом 3.x Россия Бесплатно (free)

Работая с типовыми отчетами в конфигурациях «Зарплата и управление персоналом, редакция 3», «Зарплата и кадры государственного учреждения, редакция 3» и подобных, в схемах компоновки данных можно встретить конструкции запросов, которые обращаются к некоторым виртуальным таблицам.

20.08.2024    3514    PROSTO-1C    0    

24

Запросы Программист Запросы Бесплатно (free)

Отлаживая взаимодействие с базой данных, мы регулярно сталкиваемся с зависающими или подозрительно долго выполняющимися обращениями, негативно влияющими на производительность. О том, как в PostgreSQL выявить подозрительные запросы, основываясь на доступной о них информации, расскажем в статье.

16.08.2024    11288    user1840182    5    

30
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. tormozit 7279 11.10.24 22:36 Сейчас в теме
Я бы назвал статью "Скрытая угроза ..."
EvgeniyOlxovskiy; Дмитрий74Чел; Hobbit_Jedi; jobkostya1c_ERP; zqzq; Somebody1; d4rkmesa; igo1; Eugene_Elhaz; irtk; PowerBoy; +11 Ответить
2. tormozit 7279 11.10.24 22:38 Сейчас в теме
Для полноты картины было бы полезно провести тесты на основных типах СУБД (файловый режим, MS, Postgre).
Uejova; Созинов; MaCCapAkIII; +3 Ответить
3. Segate 270 12.10.24 08:07 Сейчас в теме
Какая прелесть) ведь это же как всегда так нативно! Прям в лучших традициях 1с)
pavlov_dv; Hobbit_Jedi; bulpi; zqzq; Somebody1; PowerBoy; ixijixi; +7 Ответить
4. aximo 2336 12.10.24 08:41 Сейчас в теме
Было уже https://infostart.ru/1c/articles/1171188

Бутафорская функция
ZOMI; frkbvfnjh; RustIG; +3 Ответить
5. tormozit 7279 12.10.24 09:26 Сейчас в теме
(4) А где в той статье про главный факт этой статьи рассказано? Не засчитано.
Lemkus; asg.aleks; +2 Ответить
11. RustIG 1882 12.10.24 19:02 Сейчас в теме
(5) все в комментах.
но ту статью я пропустил, а эту - нет.
получается, что автор статьи пользу принес, и Aximo вдогонку тоже пользу принес.
Всем спасибо! :)
15. tormozit 7279 13.10.24 09:06 Сейчас в теме
(11) Если в комментариях, то нужно указывать ссылку на конкретный комментарий, чтобы не заставлять читать кучу текста (статью и ее комментарии), не имеющего отношения к проблеме.
14. AndreyCh75 12.10.24 22:13 Сейчас в теме
6. John_d 6004 12.10.24 12:40 Сейчас в теме
В MSSQL все нормально нумерует (каждый раз с 1)
d4rkmesa; +1 Ответить
7. rozer 313 12.10.24 13:34 Сейчас в теме
(6) я бы всем советовал бы потихоньку "забывать" M$SQL..ну вы понимаете)
asupsam; PowerBoy; +2 Ответить
13. RustIG 1882 12.10.24 19:06 Сейчас в теме
(7) маловато статей на тему "как мы перешли на другую СУБД или ОСь".... легко не будет
8. alex_makhnov 12.10.24 14:24 Сейчас в теме
А какая разница вообще с чего начинается нумерация? Она же не гарантирует никакой сортировки? Только для уникальности записи...
12. RustIG 1882 12.10.24 19:04 Сейчас в теме
(8) про уникальность записи лучше не упоминать.... уникальность строки гарантируется набором полей или созданным самим уникальным ключом....
35. kalyaka 1133 16.10.24 12:53 Сейчас в теме
(8) все верно, на ИТС так сразу и сказано:К слову "последовательно" можно придраться, т.к. задать эту последовательность невозможно и опираться на это не стоит. Хотя, если подумать, то наверное есть такой объект - последовательность и вот его значение каждый раз при использовании увеличивается
9. TriD 12.10.24 16:21 Сейчас в теме
(2) это postgre, была ситуация, коллега разрабатывал на MS, а я тестил на постгре, я говорю не работает, описываю сценарий, а он мне "всё работает". Не подрались, теперь знаем о такой подставе
10. PerlAmutor 159 12.10.24 18:07 Сейчас в теме
Т.к. PostgreSQL можно вполне себе называть - "развивающимся", то я не удивлен тому, что для того, чтобы сохранить обратную совместимость платформы 1С со старыми релизами PostgreSQL пришлось пойти на жертвы. Видимо где-то "под капотом" платформы используется тип SERIAL (нетранзакционный), это нам смогут подсказать эксперты которые любят с профайлером сидеть. У себя же я переписывал хранимую процедуру с MSSQL на Postgre с использованием временных последовательностей (Temporary Sequence). Не знаю к чему бы это могло привести при 12000 сеансах вызывающих подобные запросы, но было бы любопытно.
16. Sardukar 58 14.10.24 05:19 Сейчас в теме
Перед такими статьями надо дисклеймер вешать "Людям с тонкой организацией души и на ночь не читать"
EvgeniyOlxovskiy; +1 Ответить
17. frkbvfnjh 812 14.10.24 09:24 Сейчас в теме
Функция действительно бесполезная, даже не знаю где без нее ну никак не обойтись. Было бы больше толку если нумерация всегда была с единицы и ее можно было бы использовать не только во временных таблицах, но и в выборке данных, причем что бы она срабатывала после сортировки. Тогда это было бы полезно в качестве порядковой нумерации строк. Кто нибудь может привести пример в котором эта функция ну прям выручает?
Hobbit_Jedi; +1 Ответить
18. starik-2005 3177 14.10.24 10:45 Сейчас в теме
(17)
эта функция ну прям выручает
Для любителей в запросы тащить всяковские там распределения копеек...
19. Dach 388 14.10.24 10:47 Сейчас в теме
(17) нормальная функция, просто пользоваться не умеете. Идеально подходит для генерации уникального ключа строки произвольного набора данных в запросе. По этому ключу потом можно связываться с исходным набором, например для сверки ресурсных значений и т.д. и т.п. Не надо ее воспринимать как нумератор rownum и все будет ОК. Название, конечно, неудачное у нее - раз уж такое поведение, надо было не АВТОНОМЕРЗАПИСИ(), а ПРОИЗВОЛЬНЫЙАВТОНОМЕРЗАПИСИ()
EvgeniyOlxovskiy; HystriX; MaximSh; SerVer1C; JohnyDeath; user1010751; zabaluev; +7 Ответить
34. s22 23 15.10.24 14:30 Сейчас в теме
(17) например надо обработать вр таблицу, но в обработке нужные не все поля, а потом что бы восстановить связь надо или по комбиначии полей или по уникальному номеру

дает иногда 2х ускорение
20. TyurinArt 102 14.10.24 14:21 Сейчас в теме
Два года назад проходил собес в фирму 1С в команду либы БЭД; в части одной из задач требовалось реализовать аналог функи АВТОНОМЕРЗАПИСИ(); нестед лупы должны одинаково работать на мс и постгресе;
ВЫБРАТЬ
	Справочник4.Наименование КАК Наименование,
	КОЛИЧЕСТВО(Справочник4.Наименование) КАК Номер
ИЗ
	Справочник.Справочник4 КАК Справочник4
		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Справочник4 КАК Справочник41
		ПО (Справочник4.Наименование >= Справочник41.Наименование)

СГРУППИРОВАТЬ ПО
	Справочник4.Наименование

УПОРЯДОЧИТЬ ПО
	Справочник4.Наименование
Показать

собес не прошёл :плаки_плаки:
https://imgur.com/a/A7ZWBV6
21. CheBurator 3230 14.10.24 15:08 Сейчас в теме
(20) а если в справочнике будет несколько одинаковых наименований?
22. starik-2005 3177 14.10.24 15:14 Сейчас в теме
(21)
несколько одинаковых наименований
Ну поменять на сцылку - и будет счастье. Если 1Су не к чему больше придраться, то так себе у них работа...
23. TyurinArt 102 14.10.24 15:51 Сейчас в теме
(21) "Ну поменять на сцылку" либо свой уникальный ключ, например имя + код;

ниже на скрине две записи с именем "ввв"
https://imgur.com/a/Pf77a9W

вариант с ссылкой:
https://imgur.com/a/q8t4QU9

CheBurator, предложите свой вариант реализации АВТОНОМЕРЗАПИСИ(), как пронумеровать строки используя только язык запросов.
24. CheBurator 3230 14.10.24 17:29 Сейчас в теме
(23) хитрый какой...
на оригинальном скрине ..По (Спр4.Наименование
а потом внезапно
..По (Спр4.Код...
.
я спросил не по причине придраться, а мне чисто интересно что будет в результате (ибо клюшечник и запросы как собака типа и то не очень.. )
.
и да: а если уникальность кода отключена и дубли ссылок ? ;-)
Другое решение предложить не могу - не спец ибо.
А статьи по 8-ке читаю - интересно же...
30. starik-2005 3177 14.10.24 18:27 Сейчас в теме
(24)
чисто интересно что будет в результате
Там вся суть в том, что строится треугольная таблица, каждая следующая строка которой повторяется на Н+1 раз больше, чем предыдущая:
Сцылка / Количетсво
А / 1
А1 А / 2
А2 А1 А / 3
...
27. CheBurator 3230 14.10.24 18:02 Сейчас в теме
(26) ага, криво значит сработало...
спсб.
29. starik-2005 3177 14.10.24 18:24 Сейчас в теме
(23)
уникальный ключ, например имя + код
В режиме обмена данными записать можно один и тот же код сколько угодно раз - контроль уникальности не работает. Отсюда и столько дублей у народу бывает при отладке обменов. А вот сцылка - штука уникальная, а сортировать можно по КОЛИЧЕСТВО(СЦЫЛКА).
Прикрепленные файлы:
31. TyurinArt 102 14.10.24 19:44 Сейчас в теме
(29)
А вот сцылка - штука уникальная
стало интересно...
Средствами платформы ссылку не подменить "Поле объекта недоступно для записи (Ссылка)"

Предполагаю:
с помощью СУБД выставить свойство "primary key" = false для колонки "_IDRRef" сделать set, update с дублем ссылки и вернуть true для первичного ключа;

возможно есть более простой способ сделать дубли ссылок (уникальных первичных ключей);
25. CheBurator 3230 14.10.24 17:30 Сейчас в теме
И что будет если все-так По (СПр4.Наименование... и будут одинаковые наименования - на выходе что получится с нумерацией? ну интересно!
26. TyurinArt 102 14.10.24 17:40 Сейчас в теме
(25)
ну интересно!

https://imgur.com/a/WTClBoG
(24)
и дубли ссылок ? ;-)
"либо свой уникальный ключ, например имя + код;"
28. CheBurator 3230 14.10.24 18:05 Сейчас в теме
(26)
"либо свой уникальный ключ, например имя + код;"

в базах, да еще в больших - чего-только не бывает... и ключа уникального может сходу неочевидно...
скорее всего по ссылке - все-таки дубли ссылок штатным образом есть редкое (или совсем нет?).
.
кстати, может АВТОНОМЕРЗАПИСИ(); в твоем примере можно использовать для поиска дублей? будет ли это быстрее других вариантов поиска дублей (ну, например, по наименованию). Хотя вряд ли.
33. starik-2005 3177 15.10.24 11:59 Сейчас в теме
(28)
все-таки дубли ссылок штатным образом есть редкое (или совсем нет?)
Уникальный индекс. Там дубли - это ошибки СУБД уже, а не 1С. Средствами 1С дубль сцылки сделать вообще никак.
32. dsdred 3919 15.10.24 08:53 Сейчас в теме
натыкался на эти грабли примерно 4 года назад ))
36. Lemkus 18.11.24 19:01 Сейчас в теме
Словил такую ошибку в типовой УХ 3.2.9.57 в подсистеме корп. закупок, исправил ровно по статье. Большое спасибо
Оставьте свое сообщение