Как мы знаем, данная функция появилась в платформе, начиная с версии 8.3.13, и позволяет нумеровать строки во временных таблицах средствами платформы.
Приведём небольшой пример:
Выведем первые 5 элементов справочника Валюты и поместим их во временную таблицу, применив функцию АВТОНОМЕРЗАПИСИ().
ВЫБРАТЬ ПЕРВЫЕ 5
АВТОНОМЕРЗАПИСИ() КАК НомерСтроки,
Валюты.Ссылка КАК Валюта
ПОМЕСТИТЬ ВТ
ИЗ
Справочник.Валюты КАК Валюты
;
Выполним запрос в консоли:
Пока всё отлично! Но давайте выполним этот запрос ещё один раз:
Неожиданно, мы видим, что при повторном выполнении счётчик нумерации не обнулился, а продолжился, начиная с 6. Выполним ещё раз:
Теперь нумерация идёт уже, начиная с 11…
Однако, если подождать примерно 5 минут, и выполнить запрос ещё раз – мы снова увидим правильную нумерацию:
На первый взгляд кажется, что это какая-то мистика, но давайте обратимся к описании данной функции на ИТС:
Оказывается, разработчики платформы и не гарантируют, что нумерация всегда будет начинаться с 1.
Однако, не все разработчики даже типовых конфигураций 1С знают об этом. И повсеместно применяют данную функцию, например, для нумерации записей в регистре сведений «Документы по НМА».
А дальше мы сталкиваемся с отбором в динамическом списке, где из регистра отбираются только записи с номером = 1, дабы избежать дублирования данных.
И происходит волшебство. Первый раз провели документ – он отображается в динамическом списке. Через минуту перепровели его – документ исчезает. Через 10 минут ещё раз перепровели – снова появился!
Так ведь можно и с ума сойти!
А ведь некоторые ещё и нумеруют разные временные таблицы, с целью их дальнейшего соединения по этому ключу! Представьте, какой там может произойти винегрет!
Ну а если серьёзно – если 1С нам не гарантирует, что нумерация будет всегда с 1, то в подобных случаях нам нужно обеспечить эту гарантию самим.
Находим минимальный номер строки из полученной временной таблицы, получаем дельту, а затем отнимаем её от исходной нумерации:
ВЫБРАТЬ ПЕРВЫЕ 5
АВТОНОМЕРЗАПИСИ() КАК НомерСтроки,
Валюты.Ссылка КАК Валюта
ПОМЕСТИТЬ ВТ
ИЗ
Справочник.Валюты КАК Валюты
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
МИНИМУМ(ВТ.НомерСтроки) КАК Дельта
ПОМЕСТИТЬ ВТ_Дельта
ИЗ
ВТ КАК ВТ
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТ.НомерСтроки - ВТ_Дельта.Дельта + 1 КАК НомерСтроки,
ВТ.Валюта КАК Валюта
ИЗ
ВТ КАК ВТ
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Дельта КАК ВТ_Дельта
ПО (ИСТИНА)
Таким образом мы принудительно сдвинем нумерацию на начало, и наша нумерация не будет зависеть ни от СУБД, ни от времени, которое прошло между выполнениями запроса, ни от чёрта лысого.
Надеюсь, кому-нибудь помог! Пользуйтесь))