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

11.10.24

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

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

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

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

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

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

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

 

 

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

 

 

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

 

 

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

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

 

 

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

 

 

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

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

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

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

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

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

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

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

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

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

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

 

 

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

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

См. также

SALE! 15%

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

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

10000 руб.

02.09.2020    159305    872    399    

861

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

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

18.10.2024    9855    sergey279    18    

63

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

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

16.08.2024    7883    user1840182    5    

28

Математика и алгоритмы Запросы Программист Платформа 1С v8.3 Запросы Бесплатно (free)

Рассмотрим быстрый алгоритм поиска дублей с использованием hash функции по набору полей шапки и табличных частей.

08.07.2024    2388    ivanov660    9    

22

Запросы СКД Программист Стажер Система компоновки данных Россия Бесплатно (free)

Часто при разработке отчетов в СКД возникает ситуация, когда не совсем понятно, почему отчет выводит не те данные, которые нужны, либо не выводит вовсе. Возникает потребность увидеть конечный запрос, который формирует СКД. Как это сделать, рассмотрим в этой статье.

15.05.2024    8670    implecs_team    6    

47

Запросы Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Часто поступают задачи по произвольному распределению общих сумм. После распределения иногда пропадают копейки. Суть решения добавить АвтоНомерЗаписи() в ВТ распределения, и далее используя функции МАКСИМУМ или МИНИМУМ можем положить разницу копеек в первую или последнюю строку знаменателя распределения.

11.04.2024    3388    andrey_sag    10    

36

Запросы СКД Программист Стажер Платформа 1С v8.3 Запросы Система компоновки данных 1С:ERP Управление предприятием 2 Бесплатно (free)

В типовых конфигурациях разработчики компании 1С иногда используют в отчетах, построенных на СКД, такую конструкцию, как "ГДЕ ЛОЖЬ". Такая конструкция говорит о том, что данные в запросе не будут получены совсем. Для чего же нужен тогда запрос?

13.02.2024    7636    KawaNoNeko    23    

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

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

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

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

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

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

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

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

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

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

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

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

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