Запрос номер по порядку 1с

Содержание:

1.       Присвоение порядкового номера

2.       Нумерация по отчёту

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

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

1.    Присвоение порядкового номера

Для начала следует рассмотреть общую задачу-пример, которая станет основой для дальнейшего рассмотрения запроса. Пускай в системе 1С существует некоторая тестовая конфигурация, которая располагается в журнале документов. В этой тестовой конфигурации необходимо произвести порядковую нумерацию строк по списку, который является динамическим.

Стоит отметить, что нумерация строк в запросе – это операция присвоения порядкового номера каждой строке.

Пусть в нашем журнале содержатся три следующих документа – это «Заявка», «Приходный ордер» и «Расходный ордер». Изначальный вид журнала документов с перечнем принимал такой вид, как демонстрируется на скриншоте с примером ниже:

Изначальный вид журнала документов

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

2.    Нумерация по отчёту

Для понимания решения задачи при наличии отчёта рассмотрим данную модель ситуации. Создаём отчёт внутри системы по компоновке данных, результатом будет перечень документации, в таком случае решение элементарно, а именно: для полей внутри отчёта нужно внести особый вид поля – «Номер по порядку», как демонстрируется на скриншоте с примером далее:

Процесс нумерации по отчету

Результатом нумерации по отчету станет формировка следующей отчётности, как показано в примере ниже:

Результат нумерации по отчету   

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

Но наша основная задача – это нумерация строк именно внутри самого запроса. Примером необходимости нумерации в запросе может стать получения номера по порядку некоторой записи внутри динамического списка.

Нужно поменять запрос для списка по журналу документации, который является динамическим, таким способом, как демонстрируется на тексте примера запроса далее:

Текст запроса для нумерации строк в запросе

Если открыть динамический список при режиме «1С:Предприятие», то результатом будет следующее, как показано на скриншоте далее:

Строки динамического списка

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

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

В данной статье было рассмотрено, что такое порядковый номер в запросе и нумерация строк в 1С, как для отчётности, так и для запросов, и как на основе одной задачи корректировать запрос для задания нумерации строк, а также оговорены нюансы данной операции.

Специалист компании «Кодерлайн»

Айдар Фархутдинов

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

Ключевые слова: нумерация строк запроса, ПЕРВЫЕ, нумерация строк в построителе, пронумеровать.

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

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

Начнем с того, что в 1С 8 используется ограниченный диалект SQL, поэтому многие способы нумерации строк запроса, возможные в стандартном SQL, для нас не доступны (если кому-то интересно, как это делать в SQL, — http://www.sql.ru/faq/faq_topic.aspx?fid=126).

Итак, приступим. Есть запрос, выбирающий номенклатуру. Результат отсортирован по наименованию:

ВЫБРАТЬ
    Номенклатура.Ссылка
ИЗ
    Справочник.Номенклатура КАК Номенклатура

УПОРЯДОЧИТЬ ПО
    Номенклатура.Наименование

исходный запрос

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

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

СГРУППИРОВАТЬ ПО
    Номенклатура.Ссылка

УПОРЯДОЧИТЬ ПО
    Номенклатура.Наименование

запрос с номерами строк

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

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

ВЫБРАТЬ
    Номенклатура.Ссылка КАК Номенклатура,
    Номенклатура.Родитель КАК Родитель,
    КОЛИЧЕСТВО(Номенклатура_1.Ссылка) КАК Номер
ИЗ
    Справочник.Номенклатура КАК Номенклатура
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура_1
        ПО Номенклатура.Наименование >= Номенклатура_1.Наименование
            И Номенклатура.Родитель = Номенклатура_1.Родитель

СГРУППИРОВАТЬ ПО
    Номенклатура.Родитель,
    Номенклатура.Ссылка

запрос с номерами строк в рамках группировки

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

Быстродействие:

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

Кстати, второй запрос выполняется несколько быстрее первого — это связано с меньшим размером вспомогательных таблиц.

Пример реального использования:

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

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

ВЫБРАТЬ
    ПоступлениеТоваровУслуг.Контрагент КАК Контрагент,
    ПоступлениеТоваровУслуг.Ссылка КАК Ссылка,
    КОЛИЧЕСТВО(ПоступлениеТоваровУслуг_1.Ссылка) КАК Номер
ИЗ
    Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг_1
        ПО ПоступлениеТоваровУслуг.Дата <= ПоступлениеТоваровУслуг_1.Дата
            И ПоступлениеТоваровУслуг.Контрагент = ПоступлениеТоваровУслуг_1.Контрагент

СГРУППИРОВАТЬ ПО
    ПоступлениеТоваровУслуг.Ссылка,
    ПоступлениеТоваровУслуг.Контрагент

ИМЕЮЩИЕ
    КОЛИЧЕСТВО(ПоступлениеТоваровУслуг_1.Ссылка) <= 5

УПОРЯДОЧИТЬ ПО
    Контрагент,
    Номер

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

ВЫБРАТЬ
    КОЛИЧЕСТВО(ФизическиеЛица_1.Наименование) КАК Номер,
    ФизическиеЛица.Ссылка КАК ФИО
ИЗ
    Справочник.ФизическиеЛица КАК ФизическиеЛица
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ФизическиеЛица КАК ФизическиеЛица_1
        ПО (ФизическиеЛица.Наименование + ФизическиеЛица.Код >= ФизическиеЛица_1.Наименование + ФизическиеЛица_1.Код)

СГРУППИРОВАТЬ ПО
    ФизическиеЛица.Ссылка

УПОРЯДОЧИТЬ ПО
    Номер

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

Родилось в голове НЕКРОН’а

Бывают ситуации, когда необходимо добавить колонку с номером строки и вывести ее в результате выполнения запроса.

С помощью СКД, и построителя отчета, вывести номер строки не составляет никакого труда, в случае нумерации средствами самого запроса (оператор SELECT в SQL или ВЫБРАТЬ — в 1С), всё не так очевидно.

Для того чтобы вывести номер строки — необходимо набор данных соединить сам с собой используя любой вид соединения и любое из условий Таблицы1.Поле <= Таблицы2.Поле или же Таблицы1.Поле >=Таблицы1.Поле, затем сгруппировать по <Таблицы1.Поле> и вывести полученный результат из первой <Таблицы1.Поле> и с помощью агрегатной функции КОЛИЧЕСТВО(*) — посчитать количество значений, которые и будут являться номером строки.

В качестве примера рассмотрим запрос после применения соединения с условием на >= (больше или равно), но без группировки и без подсчета.

Пример: Соединение таблицы без группировки.
ВЫБРАТЬ 
   Таблица1.Имя, 
   Таблица2.Имя
ИЗ
	(ВЫБРАТЬ "Иванов" КАК Имя
		ОБЪЕДИНИТЬ
	ВЫБРАТЬ "Петров" КАК Имя
		ОБЪЕДИНИТЬ
	ВЫБРАТЬ	"Сидоров" КАК Имя) КАК Таблица1
ЛЕВОЕ СОЕДИНЕНИЕ
	(ВЫБРАТЬ "Иванов" КАК Имя
		ОБЪЕДИНИТЬ
	ВЫБРАТЬ  "Петров" КАК Имя
		ОБЪЕДИНИТЬ
	ВЫБРАТЬ "Сидоров" КАК Имя) КАК Таблица2
ПО 
	Таблица1.Имя >= Таблица2.Имя

В результате соединения получаем такой набор данных, и как уже можно догадаться, группировка по одному из полей «свернет» строки до одной, а агрегатная функция КОЛИЧЕСТВО(*) , посчитает количество одинаковых записей — что и будет являться номером строки. Направление сравнения на >= (больше или равно) или <= (меньше или равно), влияют на порядок записей.

Пример: Соединение таблиц с группировкой и подсчетом строк.
ВЫБРАТЬ 
   Таблица1.Имя, 
   КОЛИЧЕСТВО(*) КАК Номер
ИЗ
	(ВЫБРАТЬ "Иванов" КАК Имя
		ОБЪЕДИНИТЬ
	ВЫБРАТЬ "Петров" КАК Имя
		ОБЪЕДИНИТЬ
	ВЫБРАТЬ	"Сидоров" КАК Имя) КАК Таблица1
ЛЕВОЕ СОЕДИНЕНИЕ
	(ВЫБРАТЬ "Иванов" КАК Имя
		ОБЪЕДИНИТЬ
	ВЫБРАТЬ  "Петров" КАК Имя
		ОБЪЕДИНИТЬ
	ВЫБРАТЬ "Сидоров" КАК Имя) КАК Таблица2
ПО 
	Таблица1.Имя >= Таблица2.Имя
СГРУППИРОВАТЬ ПО Таблица1.Имя	
УПОРЯДОЧИТЬ ПО Номер 

Как и предполагалось после группировки и использования агрегатной функции КОЛИЧЕСТВО(*) — получили номера строк.

Пример: Нумерация строк внутри группировки.
ВЫБРАТЬ 
	Таблица1.Имя, Таблица1.Профессия,
	КОЛИЧЕСТВО(Таблица1.Имя) КАК НомерСтроки
ИЗ
	(ВЫБРАТЬ "Иванов" КАК Имя, "Тракторист" КАК Профессия
		ОБЪЕДИНИТЬ
	ВЫБРАТЬ "Иванов" КАК Имя, "1С Программист" КАК Профессия
		ОБЪЕДИНИТЬ
	ВЫБРАТЬ "Петров" КАК Имя, "Риэлтор" КАК Профессия
		ОБЪЕДИНИТЬ
	ВЫБРАТЬ "Водкин" КАК Имя, "Риэлтор" КАК Профессия
		ОБЪЕДИНИТЬ
	ВЫБРАТЬ	"Волчихин" КАК Имя, "1С Программист" КАК Профессия	 
        ОБЪЕДИНИТЬ
	ВЫБРАТЬ "Сидоров" КАК Имя, "Риэлтор" КАК Профессия) КАК Таблица1
ВНУТРЕННЕЕ СОЕДИНЕНИЕ
	(ВЫБРАТЬ "Иванов" КАК Имя, "Тракторист" КАК Профессия
		ОБЪЕДИНИТЬ
	ВЫБРАТЬ "Иванов" КАК Имя, "1С Программист" КАК Профессия
		ОБЪЕДИНИТЬ
	ВЫБРАТЬ	"Петров" КАК Имя, "Риэлтор" КАК Профессия
		ОБЪЕДИНИТЬ
	ВЫБРАТЬ	"Водкин" КАК Имя, "Риэлтор" КАК Профессия
		ОБЪЕДИНИТЬ
	ВЫБРАТЬ	"Волчихин" КАК Имя, "1С Программист" КАК Профессия	 
        ОБЪЕДИНИТЬ
	ВЫБРАТЬ	"Сидоров" КАК Имя, "Риэлтор" КАК Профессия) КАК Таблица2
ПО Таблица1.Имя >= Таблица2.Имя И Таблица1.Профессия = Таблица2.Профессия
СГРУППИРОВАТЬ ПО  
 	Таблица1.Профессия, 
 	Таблица1.Имя
УПОРЯДОЧИТЬ ПО   
	Таблица1.Профессия, 
	НомерСтроки ВОЗР, 
	Таблица1.Имя ВОЗР

В данном примере для нумерации внутри группировки — в условие соединения, добавляется условие на совпадение значений по дополнительному группировочному полю — Таблица1.Профессия = Таблица2.Профессия

Пример: Сквозная нумерация при наличии других группировок.
ВЫБРАТЬ 
	Таблица1.Имя, Таблица1.Профессия,
	КОЛИЧЕСТВО(*) КАК НомерСтроки
ИЗ
	(ВЫБРАТЬ
		"Иванов" КАК Имя, "Тракторист" КАК Профессия
		ОБЪЕДИНИТЬ
	ВЫБРАТЬ
		"Иванов" КАК Имя, "1С Программист" КАК Профессия
		ОБЪЕДИНИТЬ
	ВЫБРАТЬ
		"Петров" КАК Имя, "Риэлтор" КАК Профессия
		ОБЪЕДИНИТЬ
	ВЫБРАТЬ
		"Водкин" КАК Имя, "Риэлтор" КАК Профессия
		ОБЪЕДИНИТЬ
	ВЫБРАТЬ
		"Волчихин" КАК Имя, "1С Программист" КАК Профессия
		ОБЪЕДИНИТЬ
	ВЫБРАТЬ
		"Сидоров" КАК Имя, "Риэлтор" КАК Профессия) КАК Таблица1
ВНУТРЕННЕЕ СОЕДИНЕНИЕ
	(ВЫБРАТЬ
		"Иванов" КАК Имя, "Тракторист" КАК Профессия
		ОБЪЕДИНИТЬ
	ВЫБРАТЬ
		"Иванов" КАК Имя, "1С Программист" КАК Профессия
		ОБЪЕДИНИТЬ
	ВЫБРАТЬ
		"Петров" КАК Имя, "Риэлтор" КАК Профессия
		ОБЪЕДИНИТЬ
	ВЫБРАТЬ
		"Водкин" КАК Имя, "Риэлтор" КАК Профессия
		ОБЪЕДИНИТЬ
	ВЫБРАТЬ
		"Волчихин" КАК Имя, "1С Программист" КАК Профессия
		ОБЪЕДИНИТЬ
	ВЫБРАТЬ
		"Сидоров" КАК Имя, "Риэлтор" КАК Профессия) КАК Таблица2
ПО 
	Таблица1.Имя + Таблица1.Профессия >= Таблица2.Имя + Таблица2.Профессия   
СГРУППИРОВАТЬ ПО  
 	Таблица1.Профессия, 
 	Таблица1.Имя
УПОРЯДОЧИТЬ ПО   
	НомерСтроки ВОЗР, 
	Таблица1.Имя ВОЗР

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

Это можно сделать создав в условии соединения составное поле .

Таблица1.Имя + Таблица1.Профессия >= Таблица2.Имя + Таблица2.Профессия

ВАЖНО! Нумерация будет работать только по уникальным наборам значений для каждой строки.

  • Запрос мой номер теле2
  • Запрос интернет настроек мтс на телефон
  • Запрос геолокации телефона по номеру
  • Запрос входящего номера письма
  • Запрос времени по телефону