1с порядковые номера в запросе

Иногда возникает необходимость добавить в запрос колонку с номером строки, например, когда нужно вывести номера строк в отчет, а используется построитель отчета. Также нумерация строк полезна, когда необходимо для определенных группировок вывести ограниченное количество строк, что-то типа «ПЕРВЫЕ 5 документов для каждого контрагента».

Данная статья навеяна обсуждением в теме v8: Раздумья над запросом

Начнем с того, что в 1С 8 используется ограниченный диалект SQL, поэтому многие способы нумерации строк запроса, возможные в стандартном SQL, для нас не доступны (если кому-то интересно, как это делать в SQL, — http://www.sql.ru/faq/faq_topic.aspx?f >
Итак, приступим. Есть запрос, выбирающий номенклатуру. Результат отсортирован по наименованию:
исходный запрос

Требуется добавить колонку с порядковым номером номенклатуры (в рамках данной сортировки):
запрос с номерами строк

В вышеуказанном запросе мы соединяем таблицу саму с собой довольно хитрым способом: по правой таблице подсчитываем количество номенклатуры с наименованием меньше текущего левого, используя группировку.

Аналогичную методику можно применить, если нужно задать нумерацию строк с учетом группировки по какому-либо полю:
запрос с номерами строк в рамках группировки

Это тот же самый запрос, в него просто добавлена группировка по полю «Родитель». Нумерация для каждого родителя — своя.

Быстродействие:
Если говорить о быстродействии, то запросы подобного рода, естественно, ресурсоемки (математическая сложность порядка N^2). Для большинства повседневных задач их использование вполне приемлемо.
Кстати, второй запрос выполняется несколько быстрее первого — это связано с меньшим размером вспомогательных таблиц.

Пример реального использования:
Теперь немного о том, ради чего всё это делается. Какую пользу которую можно извлечь из нумерации строк запроса?

Например, перед нами стоит задача получить для каждого контрагента пять последних документов поступления товаров и услуг:

запрос с номерами строк при наличии дублей интересующего поля(того,относительно которого строится счетчик)

Собственно говоря, идея такова: использовать «составное поле» для получения возрастающего итога (при этом одно поле может содержать дубли, а второе, как в данном примере, — нет.).

Задача

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

В принципе, задача легко бы решалась, если список документов мы бы получали в отчете. Но тут дела обстоят иначе.

В отчетах — не проблема!

Создав отчет на системе компоновки данных с получением списка документов, задача решалась бы очень просто. В поля отчета нужно было бы всего-навсего добавить специальное поле «Номер по порядку».

В результате пользователь увидит подобный результат формирования отчета:

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

Нумерация в запросе

Изменим запрос динамического списка журнала документов следующим образом:

При открытии динамического списка в режиме 1С:Предприятия получаем следующий результат:

Примечание: в примере показан лишь принцип нумерации строк непосредственно в запросе. Если Вы обратили внимание, то на скриншоте выше документы в списке, отсортированные по порядковому номеру строки, «идут» в порядке типов (сначала приходные ордера, затем расходные и т.д.). Это происходит, потому что, используя ссылку для соединения, мы не можем гарантировать, что GUID’ы ссылок будут уникальными. Также нельзя сравнивать ссылки разных типов документов — это приведет к некорректному результату. Можно использовать момент времени или другие поля, определяющие конкретное положение документа с общем списке журнала.

Конечно, используя подобный подход мы усложнили бы запрос к базе данных, плюс ко всему, некоторые возможности динамического списка, важные для работы пользователей, стали бы не доступными (динамическое считывание данных, основная таблица и т.д.), но пример был создан лишь для демонстрации возможности нумерации строк в запросах. Используя этот принцип для решения других задач, например для печатных форм, подобных проблем не возникнет.

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

Для того чтобы пронумеровать строки в запросе, необходимо соединить таблицу запроса с самой собой по какому либо полю с условием « », посчитать количество присоединившихся строк, затем упорядочить по полученным номерам. Замечу, что получить номер строки в запросе 1с данным способом можно только в случае, если в вашей выборке есть поле с уникальным значением для каждой строки. Если это условие не выполняется, то при накладывании условия на «больше» или «меньше» у вас получатся строки с одинаковыми номерами.

Номер строки в запросе 1с. Пример

Рассмотрим простейший запрос к справочнику номенклатура, для быстроты выполнения ограничим выборку номенклатуры одной группой, которую необходимо передать в параметр Группа.

Прочтите еще пару статей на тему языка запросов 1С:

Понравилась статья? Поделиться с друзьями:
Vkontakte.INFO
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: