Основной особенностью динамических выборок является то, что они не считывают данные целиком в память, а получают их блоками по мере обхода выборки методом Следующий(). Это позволяет обходить большие объемы данных, не опасаясь, что возникнут проблемы с использованием памяти компьютера.
Выборка всегда считывает данные в некоторой последовательности сортировки (в одном из допустимых порядков). Обход выборки заключается в получении очередных блоков записей в соответствии с порядком и выдачи записей считанных блоков. Очередной блок считывается как множество записей, следующих в выбранном порядке после последней полученной записи предыдущего блока.
Для обеспечения эффективной работы динамической выборки задание отбора и сортировки ограничены так, чтобы при обходе выборки мог быть использован один из индексов.
В процессе обхода динамической выборки система считывает данные блоками по 25 записей. Для объектных данных (Справочников, Документов и т.д.) каждая запись является объектом, включающим все ее табличные части.
При обращении к свойствам выборки выдаются уже считанные данные. Кроме того, при получении из выборки объекта также не происходит его повторного считывания, а используются уже считанные выборкой данные.
Следует учитывать, что фактическое считывание очередного блока происходит после того, как получены (методом Следующий()) все записи считанного ранее блока. Таким образом, разработчик конфигурации не имеет контроля над актуальностью считываемой информации, даже если выборка инициирована в транзакции. При получении очередной записи нельзя различить ситуацию, когда она будет физически считана в этот момент или получена из ранее считанного блока. Очевидно, что последних ситуаций будет большинство.
Для иерархических данных (Справочников, Планов видов характеристик и Планов счетов) кроме обычной выборки, инициируемой методом Выбрать, существует иерархическая выборка, инициируемая методом ВыбратьИерархически. Она отличается тем, что выдает данные путем обхода записей по уровням. То есть после выдачи элемента выдается подчиненный ему элемент, если он существует. А если подчиненного не существует, то выдается следующий элемент. Каждое считывание подчиненных элементов реализовано как считывание нового блока.
Следует учитывать, что если в процессе обхода выборки данные изменяются (в данной сессии, или другими сессиями), то могут возникать такие ситуации, как получение данных удаленного объекта, получение в выборке одного объекта два раза, не попадание некоторых записей в выборку и т.д.
Это объясняется описанными выше технологическими особенностями работы динамической выборки. Например, после считывания первого блока записей выполнено изменение одного из объектов и в результате значения полей по которым упорядочена выборка изменились. Тогда эта запись может попасть в выборку повторно, если в результате изменения она стала в порядке следования позже, чем была раньше. Если в процессе выборки выполняемой одной сессией в другой сессии объект изменился и в результате изменений в порядке выборки он стал раньше, чем был до изменения, то при определенном совпадении по времени этих процессов, объект вообще не попадет в выборку. Например, пока выборка обходила товары на букву "А", товар "Бета" переименовали в "Альфа". В этом случае, он может не "успеть" попасть в часть выборки на букву "Б" и "опоздать" попасть в часть выборки на букву "А".
При использовании динамических выборок для обхода и удаления иерархических данных следует учитывать тот факт, что при удалении элемента удаляются и все его подчиненные элементы. Соответственно при использовании прямой (неиерархической) выборки в процессе удаления объекта, могут удалиться подчиненные объекты уже считанные в текущем блоке. Соответственно, при попытке выполнить какие-либо действия с полученными из выборки объектами будет выдаваться ошибка, так как в базе данных объекты уже не существуют. При использовании иерархической выборки такой проблемы не возникает, так как в один блок входят только элементы подчиненные одному родителю.
Эти особенности требуют обдуманного подхода к задачам, решаемым с помощью динамических выборок. Можно рекомендовать применять выборки либо для задач, не требующих ответственного чтения множества записей, либо для регламентных задач, допускающих использование монопольного режима. В любых случаях следует внимательно относится к изменению объектов в процессе обхода динамической выборки, так как это может повлиять на порядок их включения в выборку.