Иногда возникает необходимость добавить в запрос колонку с номерами строк, например, когда нужно вывести номера строк в отчет, а используется построитель отчета. Так же нумерация строк полезна когда необходимо для определенных группировок вывести ограниченное количество строк данных. Что-то типа ПЕРВЫЕ 5 документов для каждого контрагента. <br><br>Данная статья навеяна обсуждением в: v8: Раздумья над запросом <br><br>Начнем с того, что в v8 используется ограниченный диалект SQL поэтому многие методики нумерации строк запроса, возможные в SQL, для нас не доступны. (если кому-то интересно как это делать в SQL - http://www.sql.ru/faq/faq_topic.aspx?fid=126) <br><br>Итак, есть код, выбирающий номенклатуру, отсортированный по наименованию: <br><pre>ВЫБРАТЬ Номенклатура.СсылкаИЗ Справочник.Номенклатура КАК НоменклатураУПОРЯДОЧИТЬ ПО Номенклатура.Наименование</pre><br><br>исходный запрос <br><br>Требуется добавить сюда колонку с порядковыми номерами номенклатуры (в рамках данной сортировки). <br><pre>ВЫБРАТЬ Номенклатура.Ссылка КАК Номенклатура, КОЛИЧЕСТВО(Номенклатура_1.Ссылка) КАК НомерИЗ Справочник.Номенклатура КАК Номенклатура ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура_1 ПО Номенклатура.Наименование >= Номенклатура_1.Наименование // Условие сортировки для нумерацииСГРУППИРОВАТЬ ПО Номенклатура.СсылкаУПОРЯДОЧИТЬ ПО Номенклатура.Наименование</pre><br><br>запрос с номерами строк <br><br>Соединяем таблицу саму с собой довольно хитрым способом. По правой таблице подсчитываем количество номенклатуры с наименованием меньше текущего левого, используя группировку. <br><br>Аналогичную технику можно применить, если нужно задавать нумерацию строк с учетом группировки по какому-то полю. <br><pre>ВЫБРАТЬ Номенклатура.Ссылка КАК Номенклатура, Номенклатура.Родитель КАК Родитель, КОЛИЧЕСТВО(Номенклатура_1.Ссылка) КАК НомерИЗ Справочник.Номенклатура КАК Номенклатура ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура_1 ПО Номенклатура.Наименование >= Номенклатура_1.Наименование И Номенклатура.Родитель = Номенклатура_1.РодительСГРУППИРОВАТЬ ПО Номенклатура.Родитель, Номенклатура.Ссылка</pre><br><br>запрос с номерами строк в рамках группировки <br><br>Это тот же самый запрос, в него просто добавлена группировка по полю "Родитель", нумерация для каждого родителя своя. <br><br>Быстродействие: <br>Если говорить о быстродействии, то запросы подобного рода естественно ресурсоемки (математически ложность порядка N^2). Для большинства повседневных задач их использование вполне приемлемо. <br>Кстати, второй запрос выполняется несколько быстрее первого, это связано с меньшим размером вспомогательных таблиц. <br><br>Пример реального использования: <br>Теперь немного о том, ради чего всё это делается, то-есть польза, которую можно извлечь из нумерации строк запроса. <br><br>Например, перед нами стоит задача получить для каждого контрагента пять последних документов поступления товаров и услуг: <br><pre>ВЫБРАТЬ ПоступлениеТоваровУслуг.Контрагент КАК Контрагент, ПоступлениеТоваровУслуг.Ссылка КАК Ссылка, КОЛИЧЕСТВО(ПоступлениеТоваровУслуг_1.Ссылка) КАК НомерИЗ Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг_1 ПО ПоступлениеТоваровУслуг.Дата <= ПоступлениеТоваровУслуг_1.Дата И ПоступлениеТоваровУслуг.Контрагент = ПоступлениеТоваровУслуг_1.КонтрагентСГРУППИРОВАТЬ ПО ПоступлениеТоваровУслуг.Ссылка, ПоступлениеТоваровУслуг.КонтрагентИМЕЮЩИЕ КОЛИЧЕСТВО(ПоступлениеТоваровУслуг_1.Ссылка) <= 5УПОРЯДОЧИТЬ ПО Контрагент, Номер</pre><br><br><br>запрос с номерами строк при наличии дублей интересующего поля(того,относительно которого строится счетчик) <br><pre>ВЫБРАТЬ КОЛИЧЕСТВО(ФизическиеЛица_1.Наименование) КАК Номер, ФизическиеЛица.Ссылка КАК ФИОИЗ Справочник.ФизическиеЛица КАК ФизическиеЛица ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ФизическиеЛица КАК ФизическиеЛица_1 ПО (ФизическиеЛица.Наименование + ФизическиеЛица.Код >= ФизическиеЛица_1.Наименование + ФизическиеЛица_1.Код)СГРУППИРОВАТЬ ПО ФизическиеЛица.СсылкаУПОРЯДОЧИТЬ ПО Номер</pre>
Prikum
активный пользователь
офлайн
Дата регистрации: 18.02.2002
Сообщений: 20953
Пост №14
11.11.2013 10:55
Вам надо было вывести список контрагентов и номера по порядку? В полученной ТЗ есть сами контрагенты и у ТЗ есть реквизит НомерСтроки, что то было нужно еще?Зачем получать геморой на больших объемах на ровном месте?
Елена_В
читатель
офлайн
Дата регистрации: 26.10.2007
Сообщений: 611
Пост №15
11.11.2013 10:56
Какая разница, есть в ТЗ нумерация колонок или нет, если меня интересовал вопрос нумерации в запросе?
Денис (САМАРА)
читатель
офлайн
Дата регистрации: 09.04.2008
Сообщений: 8351
Пост №16
11.11.2013 11:40
Иногда гораздо удобнее и эффективнее по производительности воспользоваться разными механизмами платформы 1С для получения результата. Например, если нужна нумерация для отчета, то лучше делать такое на СКД, а если для обработки данных, то как Prikum сказал, лучше получить номер из ТЗ или инкрементом переменной при обходе выборки.
Мы используем файлы cookie, чтобы анализировать трафик, подбирать для вас подходящий контент и рекламу,
а также дать вам возможность делиться информацией в социальных сетях.
Если вы продолжите использовать сайт, мы будем считать, что вас это устраивает.
X
X
Отправка статьи на email
X
Яндекс-виджет: Новости Яндекс-виджет: Полезные материалы Информеры