Иногда возникает необходимость добавить в запрос колонку с номером строки, например, когда нужно вывести номера строк в отчет, а используется построитель отчета. Также нумерация строк полезна, когда необходимо для определенных группировок вывести ограниченное количество строк, что-то типа "ПЕРВЫЕ 5 документов для каждого контрагента".
Данная статья навеяна обсуждением в теме v8: Раздумья над запросом
Начнем с того, что в 1С 8 используется ограниченный диалект SQL, поэтому многие способы нумерации строк запроса, возможные в стандартном SQL, для нас не доступны (если кому-то интересно, как это делать в SQL, — http://www.sql.ru/faq/faq_topic.aspx?f >
Итак, приступим. Есть запрос, выбирающий номенклатуру. Результат отсортирован по наименованию:
исходный запрос
Требуется добавить колонку с порядковым номером номенклатуры (в рамках данной сортировки):
запрос с номерами строк
В вышеуказанном запросе мы соединяем таблицу саму с собой довольно хитрым способом: по правой таблице подсчитываем количество номенклатуры с наименованием меньше текущего левого, используя группировку.
Аналогичную методику можно применить, если нужно задать нумерацию строк с учетом группировки по какому-либо полю:
запрос с номерами строк в рамках группировки
Это тот же самый запрос, в него просто добавлена группировка по полю "Родитель". Нумерация для каждого родителя — своя.
Быстродействие:
Если говорить о быстродействии, то запросы подобного рода, естественно, ресурсоемки (математическая сложность порядка N^2). Для большинства повседневных задач их использование вполне приемлемо.
Кстати, второй запрос выполняется несколько быстрее первого — это связано с меньшим размером вспомогательных таблиц.
Пример реального использования:
Теперь немного о том, ради чего всё это делается. Какую пользу которую можно извлечь из нумерации строк запроса?
Например, перед нами стоит задача получить для каждого контрагента пять последних документов поступления товаров и услуг:
запрос с номерами строк при наличии дублей интересующего поля(того,относительно которого строится счетчик)
Собственно говоря, идея такова: использовать "составное поле" для получения возрастающего итога (при этом одно поле может содержать дубли, а второе, как в данном примере, — нет.).
Автор: Admin 27 сентября, 2019 0 комментария
Наткнулся недавно в запросе на одну интересную функцию ‘АВТОНОМЕРЗАПИСИ’, которую до этого не встречал.
‘АВТОНОМЕРЗАПИСИ’ – создает во временной таблице колонку, содержащую последовательно возрастающие уникальные значения. По сути это ключевое поле во временной таблице. Как утверждает документация с сайта ‘ справка по работе с запросами‘: начальное значение счетчика в общем случае может быть любым.
Для того чтобы пронумеровать строки в запросе, необходимо соединить таблицу запроса с самой собой по какому либо полю с условием « », посчитать количество присоединившихся строк, затем упорядочить по полученным номерам. Замечу, что получить номер строки в запросе 1с данным способом можно только в случае, если в вашей выборке есть поле с уникальным значением для каждой строки. Если это условие не выполняется, то при накладывании условия на «больше» или «меньше» у вас получатся строки с одинаковыми номерами.
Номер строки в запросе 1с. Пример
Рассмотрим простейший запрос к справочнику номенклатура, для быстроты выполнения ограничим выборку номенклатуры одной группой, которую необходимо передать в параметр Группа.
Прочтите еще пару статей на тему языка запросов 1С: