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

16 мая 2013

Задача

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

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

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

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

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

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

"ВЫБРАТЬ
|	Т.НомерПоПорядку,
|	Т.Ссылка,
|	Т.Дата,
|	Т.ПометкаУдаления,
|	Т.Номер,
|	Т.Проведен,
|	Т.Тип
|ИЗ
|	(ВЫБРАТЬ" +
// Получаем количество присоединенных ссылок в поле "НомерПоПорядку"
"		КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ЖурналДокументовЖурналДокументов.Ссылка) КАК НомерПоПорядку,
|		ЖурналДокументов.Ссылка КАК Ссылка,
|		ЖурналДокументов.Дата КАК Дата,
|		ЖурналДокументов.ПометкаУдаления КАК ПометкаУдаления,
|		ЖурналДокументов.Номер КАК Номер,
|		ЖурналДокументов.Проведен КАК Проведен,
|		ЖурналДокументов.Тип КАК Тип
|	ИЗ
|		ЖурналДокументов.ЖурналДокументов КАК ЖурналДокументов
|			ЛЕВОЕ СОЕДИНЕНИЕ ЖурналДокументов.ЖурналДокументов КАК ЖурналДокументовЖурналДокументов" +
// Соединим таблицу журнала документов к самой себе по ссылке на документ. Количество присоед.
// ссылок и есть порядковый номер 
"		ПО ЖурналДокументов.Ссылка >= ЖурналДокументовЖурналДокументов.Ссылка /
|	
|	СГРУППИРОВАТЬ ПО
|		ЖурналДокументов.Ссылка, 
|		ЖурналДокументов.Дата,
|		ЖурналДокументов.ПометкаУдаления,
|		ЖурналДокументов.Номер,
|		ЖурналДокументов.Проведен,
|		ЖурналДокументов.Тип) КАК Т"

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

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

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

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


comments powered by Disqus