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

Автор: Admin 27 сентября, 2019 0 комментария

Наткнулся недавно в запросе на одну интересную функцию ‘АВТОНОМЕРЗАПИСИ’, которую до этого не встречал.

‘АВТОНОМЕРЗАПИСИ’ – создает во временной таблице колонку, содержащую последовательно возрастающие уникальные значения. По сути это ключевое поле во временной таблице. Как утверждает документация с сайта ‘ справка по работе с запросами‘: начальное значение счетчика в общем случае может быть любым.

Задача

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

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

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

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

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

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

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

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

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

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

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

Читайте также:  Числа по порядку от 1 до 1000000000

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

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

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

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

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

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

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

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

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

Читайте также:  Текст 14 как же делается стих ответы

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

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

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

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

Оцените статью
Добавить комментарий

Adblock detector