Условие задачи
На языке запросов 1С необходимо с помощью языка запросов выбрать M записей начиная с записи N в справочнике или документе.
Решение
Подобная задача часто используется, например, для пагинации выборки данных. Т.е. чтобы все записи выборки из результата выполнения запроса выбрать не сразу, а получать равными частями, чтобы было удобно их постранично выводить.
В MS SQL есть операторы TOP (ПЕРВЫЕ) и SKIP (ПРОПУСТИТЬ), которые позволяют это сделать. В запросах на платформе 1С нет оператора SKIP.
Подумаем, что можно с этим сделать.
Возьмем типовую 1С:Управление торговлей 11 и постараемся промоделировать ситуацию на реальной задаче.
Для справочника Номенклатура необходимо написать запрос, который выведет все элементы исключая группы с N = 10 и M = 10 с сортировкой по наименованию. Т.е. вывести элементы с десятого по девятнадцатый.
Мы имеем возможность в 1С использовать только получение первых записей. Поэтому идея решения на SQL следующая:
SELECT top N+M * FROM TABLE ORDER BY n EXCEPT SELECT top N * FROM TABLE ORDER BY n
Получим первые N+M элементов, и исключим из выборки первые N, в результате у нас останется искомое M элементов начиная с N. Схематично:
Выбираем сначала от 0 до N+M и исключаем от 0 до N. А теперь переиначим на языке 1С. В результате получим вот такой запрос:
ВЫБРАТЬ ПЕРВЫЕ 10 // M Номенклатура.Ссылка КАК Ссылка ИЗ Справочник.Номенклатура КАК Номенклатура ГДЕ НЕ Номенклатура.Ссылка В (ВЫБРАТЬ ПЕРВЫЕ 10 // N Номенклатура.Ссылка КАК Ссылка ИЗ Справочник.Номенклатура КАК Номенклатура ГДЕ Номенклатура.ЭтоГруппа = ЛОЖЬ УПОРЯДОЧИТЬ ПО Номенклатура.Наименование, Ссылка) И Номенклатура.ЭтоГруппа = ЛОЖЬ УПОРЯДОЧИТЬ ПО Наименование, Ссылка
Проверяем в справочнике Номенклатура:
Получаем искомый результат. То, что и хотели получить
Важно! Выборки (то что в условии НЕ В ... и в главном запросе) должны быть с одинаковым упорядочиванием (у нас по наименованию и далее по ссылке) и упорядочивание должно быть всегда по какому-либо полю. Иначе запросы могут отработать не верно и вернуть не те результаты. Если поля упорядочивания нет, то можно использовать поле "Ссылка".
Выводы
В целом, этот способ достаточно хорош и может быть использован в реальной работе. Он работает достаточно быстро и позволяет обходить ограничение на использование оператора SKIP в запросах.